记下来,会在services包内放入普通的服务,ufservices内是界面相关服务。
Catalog
现在,准备创建Catalog服务的接口和实现。
选择“services”包,接下来在工具栏的下拉菜单中点击“New Java Class” 按钮 和“New Java Interface”按钮 ,在弹出的对话框中以“Catalog”作为接口名,并点击Finish关闭对话框,这时在Java编辑器中就会打开新增的Java接口,将下面这段Java接口代码Copy-Paste到编辑器内:
package services;
import org.osoa.sca.annotations.Remotable;
@Remotable
public interface Catalog {
String[] get();
}
再次选中“services”包,点击“New Java 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<String> catalog = new ArrayList<String>();
@Init
public void init() {
String currencySymbol = currencyConverter.getCurrencySymbol(currencyCode);
catalog.add("Apple - " + currencySymbol +
currencyConverter.getConversion("USD", currencyCode, 2.99f));
catalog.add("Orange - " + currencySymbol +
currencyConverter.getConversion("USD", currencyCode, 3.55f));
catalog.add("Pear - " + currencySymbol +
currencyConverter.getConversion("USD", currencyCode, 1.55f));
}
public String[] get() {
String[] catalogArray = new String[catalog.size()];
catalog.toArray(catalogArray);
return catalogArray;
}
}
当完成这些步骤以后,store项目看起来会类似这样:
注意,CatalogImpl上面有一个红叉,因为它引用了我们还没由实现的CurrencyConverter接口。
CurrencyConverter
在这一步,我们将创建CurrencyConverter的接口和实现,首先,按照之前的方式建立接口和类文件,并将下面的代码复制过去:
package services;
import org.osoa.sca.annotations.Remotable;
@Remotable
public interface CurrencyConverter {
public float getConversion(String fromCurrenycCode,
String toCurrencyCode, float amount);
public String getCurrencySymbol(String currencyCode);
}
下面,我们来创建上面这跟接口的实现类CurrencyConverterImpl:
package services;
public class CurrencyConverterImpl implements CurrencyConverter {
public float getConversion(String fromCurrencyCode,
String toCurrencyCode, float amount) {
if (toCurrencyCode.equals("USD"))
return amount;
else if (toCurrencyCode.equals("EUR"))
return amount*0.7256f;
return 0;
}
public String getCurrencySymbol(String currencyCode) {
if (currencyCode.equals("USD"))
return "$";
else
if (currencyCode.equals("EUR"))
return "?";
return "?";
}
}
现在,项目看起来是这样:
ShoppingCart
在这里我们要创建ShoppingCart的实现类。
仍然在services包内创建我们的实现类,代码如下:
package services;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.apache.tuscany.sca.binding.feed.collection.Collection;
import org.apache.tuscany.sca.binding.feed.collection.NotFoundException;
import com.sun.syndication.feed.atom.Content;
import com.sun.syndication.feed.atom.Entry;
import com.sun.syndication.feed.atom.Feed;
import com.sun.syndication.feed.atom.Link;
public class ShoppingCartImpl implements Collection {
// needs to change to instance var once conversation scope works
private static Map<String, Entry> cart = new HashMap<String, Entry>();
public Feed getFeed() {
Feed feed = new Feed();
feed.setTitle("shopping cart");
Content subtitle = new Content();
subtitle.setValue("Total : " + getTotal());
feed.setSubtitle(subtitle);
feed.getEntries().addAll(cart.values());
return feed;
}
public Entry get(String id) throws NotFoundException {
return cart.get(id);
}
public Entry post(Entry entry) {
String id = "cart-" + UUID.randomUUID().toString();
entry.setId(id);
Link link = new Link();
link.setRel("edit");
link.setHref("" + id);
entry.getOtherLinks().add(link);
link = new Link();
link.setRel("alternate");
link.setHref("" + id);
entry.getAlternateLinks().add(link);
entry.setCreated(new Date());
cart.put(id, entry);
return entry;
}
public void put(String id, Entry entry) throws NotFoundException {
entry.setUpdated(new Date());
cart.put(id, entry);
}
public void delete(String id) throws NotFoundException {
if (id.equals(""))
cart.clear();
else
cart.remove(id);
} private String getTotal() {
float total = 0;
String symbol = "";
if (!cart.isEmpty()) {
Entry entry = cart.values().iterator().next();
String item = ((Content)entry.getContents().get(0)).getValue();
symbol = item.substring(item.indexOf("-")+2, item.indexOf("-")+3);
}
for (Entry entry : cart.values()) {
String item = ((Content)entry.getContents().get(0)).getValue();
total += Float.valueOf(item.substring(item.indexOf("-")+3));
}
return symbol + String.valueOf(total);
}
}
注意:由于Tuscany的会话支持目前还实现,购物篮在这里通过一个hack来实现,cart被定义成一个静态域。
目前,项目看起来如下:
Store
这里将创建一个用户界面服务,通过浏览器为我们创建的其他服务提供交互的接口和界面。在ufservices内新建一个文件store.html,代码如下:
<html>
<head>
<title>Store</TITLE>
<script type="text/javascript" src="store.js"></script>
<script language="JavaScript">
//Reference
catalog = (new JSONRpcClient("../Catalog")).Catalog;
//Reference
shoppingCart = new AtomClient("../ShoppingCart");
function catalog_getResponse(items) {
var catalog = "";
for (var i=0; i<items.length; i++)
catalog += '<input name="items" type="checkbox" value="' +
items[i] + '">' + items[i]+ ' <br>';
document.getElementById('catalog').innerHTML=catalog;
}
function shoppingCart_getResponse(feed) {
if (feed != null) {
var entries = feed.getElementsByTagName("entry");
var list = "";
for (var i=0; i<entries.length; i++) {
var item = entries[i].getElementsByTagName("content")[0].firstChild.nodeValue;
list += item + ' <br>';
}
document.getElementById("shoppingCart").innerHTML = list;
document.getElementById('total').innerHTML = feed.getElementsByTagName("subtitle")[0].firstChild.nodeValue;
}
}
function shoppingCart_postResponse(entry) {
shoppingCart.get("", shoppingCart_getResponse);
}
function addToCart() {
var items = document.catalogForm.items;
var j = 0;
for (var i=0; i<items.length; i++)
if (items[i].checked) {
var entry = '<entry xmlns="http://www.w3.org/2005/Atom"><title>cart-item</title><content type="text">'+items[i].value+'</content></entry>'
shoppingCart.post(entry, shoppingCart_postResponse);
items[i].checked = false;
}
}
function checkoutCart() {
document.getElementById('store').innerHTML='<h2>' +
'Thanks for Shopping With Us!</h2>'+
'<h2>Your Order</h2>'+
'<form name="orderForm" action="store.html">'+
document.getElementById('shoppingCart').innerHTML+
'<br>'+
document.getElementById('total').innerHTML+
'<br>'+
'<br>'+
'<input type="submit" value="Continue Shopping">'+
'</form>';
shoppingCart.del("", null);
}
function deleteCart() {
shoppingCart.del("", null);
document.getElementById('