summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.5.1/samples/store-android/src
diff options
context:
space:
mode:
Diffstat (limited to 'branches/sca-java-1.5.1/samples/store-android/src')
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/Catalog.java24
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/CatalogProxy.java72
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/Commons.java31
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/Item.java108
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/ShoppingCartProxy.java89
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/AtomXML.java257
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/CartItemHandler.java142
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/services/json/rpc/JSONRpc.java63
-rw-r--r--branches/sca-java-1.5.1/samples/store-android/src/store/android/catalog.java250
9 files changed, 1036 insertions, 0 deletions
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/Catalog.java b/branches/sca-java-1.5.1/samples/store-android/src/services/Catalog.java
new file mode 100644
index 0000000000..9105f1047c
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/Catalog.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+public interface Catalog {
+ Item[] get();
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/CatalogProxy.java b/branches/sca-java-1.5.1/samples/store-android/src/services/CatalogProxy.java
new file mode 100644
index 0000000000..7851ac6713
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/CatalogProxy.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import services.json.rpc.JSONRpc;
+
+public class CatalogProxy implements Catalog {
+ // see http://developer.android.com/guide/developing/tools/emulator.html
+ private static final String jsonRPCServiceURI = "http://10.0.2.2:8080/Catalog";
+ private static final String jsonRPCRequest = "{\"id\": 3, \"method\": \"Service.get\", \"params\": []}";
+
+ private List<Item> catalog = new ArrayList<Item>();
+
+ public CatalogProxy() {
+ initialize();
+ }
+
+ public void initialize() {
+ JSONObject json = null;
+
+ try {
+ json = JSONRpc.invoke(jsonRPCServiceURI, jsonRPCRequest);
+
+ if(json == null) {
+ return;
+ }
+
+ JSONArray result = json.getJSONArray("result");
+ for(int i = 0; i < result.length(); i++) {
+ Item item = new Item();
+ item.setName(result.getJSONObject(i).getString("name"));
+ item.setPrice(result.getJSONObject(i).getString("price"));
+
+ catalog.add(item);
+ }
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public Item[] get() {
+ Item[] catalogArray = new Item[catalog.size()];
+ catalog.toArray(catalogArray);
+ return catalogArray;
+ }
+
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/Commons.java b/branches/sca-java-1.5.1/samples/store-android/src/services/Commons.java
new file mode 100644
index 0000000000..9da89c8fec
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/Commons.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package services;
+
+/**
+ *
+ */
+public class Commons {
+
+ public static final String TAG="Tuscany";
+ public static final String DEL="HTTP DELETE ";
+ public static final String PST="HTTP POST ";
+
+
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/Item.java b/branches/sca-java-1.5.1/samples/store-android/src/services/Item.java
new file mode 100644
index 0000000000..1881dd4d11
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/Item.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+
+public class Item {
+ private String name;
+ private String price;
+ private String key;
+
+ /**
+ * @return the key
+ */
+ public String getKey() {
+ return key;
+ }
+
+ /**
+ * @param key the key to set
+ */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+
+
+
+
+
+
+
+
+ public Item() {
+ }
+
+
+
+
+
+
+
+
+
+ /**
+ * Parses a string entry to an Item object
+ * @param s
+ * @return Item
+ */
+ public static Item parseItem(String s)
+ {
+ Item i=new Item();
+ i.setName(s.split("-")[0].trim());
+ i.setPrice(s.split("-")[1].trim());
+ return i;
+
+ }
+
+ 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 Item(String name, String price, String key) {
+ super();
+ this.name = name;
+ this.price = price;
+ this.key = key;
+ }
+
+ public String getPrice() {
+ return price;
+ }
+
+ public void setPrice(String price) {
+ this.price = price;
+ }
+
+ public String toString()
+ {
+ return name + " - " + price;
+ }
+
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/ShoppingCartProxy.java b/branches/sca-java-1.5.1/samples/store-android/src/services/ShoppingCartProxy.java
new file mode 100644
index 0000000000..c01edfbe2f
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/ShoppingCartProxy.java
@@ -0,0 +1,89 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import services.atom.xml.AtomXML;
+import services.json.rpc.JSONRpc;
+import android.util.Log;
+
+public class ShoppingCartProxy {
+ private static final String jsonRPCTotalServiceURI = "http://10.0.2.2:8080/ShoppingCart/Total";
+ private static final String jsonRPCTotalRequest = "{\"id\": 4, \"method\": \"Service.getTotal\", \"params\": []}";
+ private static final String atomXMLCartServiceURI="http://10.0.2.2:8080/ShoppingCart/Cart";
+
+
+ public Item[] getItems() {
+ return AtomXML.getItems(atomXMLCartServiceURI);
+ }
+
+ public boolean addItem(Item item) {
+ String content="<entry xmlns=\"http://www.w3.org/2005/Atom\">" +
+ "<title>item</title>" +
+ "<content type=\"text/xml\">" +
+ "<Item xmlns=\"http://services/\">" +
+ "<name xmlns=\"\">" + item.getName()+ "</name>" +
+ "<price xmlns=\"\">" +item.getPrice()+"</price>" +
+ "</Item></content></entry>";
+
+ String key =AtomXML.postItem(atomXMLCartServiceURI, content);
+ if(key==null) {
+ return false;
+ }
+ item.setKey(key);
+ Log.i("TUSCANY shopping cart proxy", key);
+ return true;
+ }
+
+ public boolean removeItem(Item item) {
+ Log.e("Sent key",item.getKey());
+ String uri=atomXMLCartServiceURI+"/"+item.getKey();
+ return AtomXML.performdelete(uri);
+ }
+
+ public boolean clearCartContent() {
+ return AtomXML.performdelete(atomXMLCartServiceURI);
+ }
+
+ public void checkOut() {
+
+ }
+
+ public String getTotal() {
+ String total = "";
+ JSONObject json = null;
+ Log.e("TUSC", "getting total");
+
+ try {
+ json = JSONRpc.invoke(jsonRPCTotalServiceURI, jsonRPCTotalRequest);
+ Log.e("TUSC", "Request OK");
+
+ if (json != null) {
+ total = json.getString("result");
+ Log.e("TUSC", "Total: " + total);
+ }
+ } catch (JSONException e) {
+ Log.e("TUSC", e.getMessage());
+ }
+ return total;
+ }
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/AtomXML.java b/branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/AtomXML.java
new file mode 100644
index 0000000000..69f4409ed9
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/AtomXML.java
@@ -0,0 +1,257 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package services.atom.xml;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.http.Header;
+import org.apache.http.HeaderElement;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.ParseException;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+import services.Commons;
+import services.Item;
+import android.util.Log;
+
+/**
+ *
+ */
+public class AtomXML {
+
+ public static String postItem(String ServiceURI, final String content)
+ {
+ DefaultHttpClient client=new DefaultHttpClient();
+ HttpPost httpost = new HttpPost(ServiceURI);
+
+ httpost.setEntity(new HttpEntity(){
+
+ String entry=content;
+
+ class mHeader implements Header
+ {
+ public HeaderElement[] getElements() throws ParseException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getName() {
+ // TODO Auto-generated method stub
+ return "Content-type";
+ }
+
+ public String getValue() {
+ // TODO Auto-generated method stub
+ return "application/atom+xml;type=entry";
+ }
+ }
+
+ public void consumeContent() throws IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public InputStream getContent() throws IOException,
+ IllegalStateException {
+ // TODO Auto-generated method stub
+ return new InputStream(){
+
+ public int read() throws IOException {
+ // TODO Auto-generated method stub
+ return this.available();
+ }
+
+ };
+ }
+
+ public Header getContentEncoding() {
+ // TODO Auto-generated method stub
+ return new mHeader();
+ }
+
+ public long getContentLength() {
+ // TODO Auto-generated method stub
+ return entry.length();
+ }
+
+ public Header getContentType() {
+ // TODO Auto-generated method stub
+ return new mHeader();
+ }
+
+ public boolean isChunked() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public boolean isRepeatable() {
+ // TODO Auto-generated method stub
+ return true;
+ }
+
+ public boolean isStreaming() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void writeTo(OutputStream arg0) throws IOException {
+ // TODO Auto-generated method stub
+
+ arg0.write(entry.getBytes());
+ arg0.flush();
+ //Log.i("Tuscany", "Entry posted via atom/xml");
+ }
+
+ });
+
+ try {
+ HttpResponse response = client.execute(httpost);
+ InputStream is =response.getEntity().getContent();
+
+ //Human readable atom response from servlet
+ int read;
+ StringBuffer sb=new StringBuffer();
+ while((read=is.read())>0)
+ {
+ sb.append((char)read);
+ }
+ Log.i("Tuscany", "Atom entry post status: "+response.getStatusLine().toString());
+ //Log.i("Tuscany", "Response: "+sb.toString());
+ //Try now to parse the consumed data
+ try {
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ SAXParser sp;
+ sp = spf.newSAXParser();
+ XMLReader xr = sp.getXMLReader();
+ CartItemHandler cih=new CartItemHandler();
+ xr.setContentHandler(cih);
+
+ xr.parse(new InputSource(new ByteArrayInputStream(sb.toString().getBytes())));
+ is.close();
+
+ return cih.getCurrentKey();
+
+ } catch (ParserConfigurationException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ } catch (SAXException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getLocalizedMessage());
+ }
+
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ }
+
+ return null;
+ }
+
+ public static boolean performdelete(String uri)
+ {
+ DefaultHttpClient client=new DefaultHttpClient();
+ Log.i(Commons.TAG,Commons.DEL+uri);
+ HttpDelete del=new HttpDelete(uri);
+
+ try {
+ client.execute(del);
+ return true;
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ }
+
+ return false;
+
+
+ }
+
+ public static Item[] getItems(String uri)
+ {
+ DefaultHttpClient client=new DefaultHttpClient();
+ HttpGet hg=new HttpGet(uri);
+ HttpResponse hr;
+ HttpEntity he;
+ try {
+ hr=client.execute(hg);
+ InputStream is =hr.getEntity().getContent();
+
+ //Human readable atom response from servlet
+ int read;
+ StringBuffer sb=new StringBuffer();
+ while((read=is.read())>0)
+ {
+ sb.append((char)read);
+ }
+ Log.i("Tuscany", "Atom get content: "+sb.toString());
+
+ SAXParserFactory spf = SAXParserFactory.newInstance();
+ SAXParser sp;
+ sp = spf.newSAXParser();
+ XMLReader xr = sp.getXMLReader();
+ CartItemHandler cih=new CartItemHandler();
+ xr.setContentHandler(cih);
+
+ xr.parse(new InputSource(new ByteArrayInputStream(sb.toString().getBytes())));
+ is.close();
+ Log.e(Commons.TAG,String.valueOf(cih.getItemsCollection().length));
+ return cih.getItemsCollection();
+
+
+ } catch (ClientProtocolException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ } catch (ParserConfigurationException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ } catch (SAXException e) {
+ // TODO Auto-generated catch block
+ Log.e(Commons.TAG,e.getMessage());
+ }
+ return null;
+ }
+
+
+
+
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/CartItemHandler.java b/branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/CartItemHandler.java
new file mode 100644
index 0000000000..ed29839795
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/atom/xml/CartItemHandler.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package services.atom.xml;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import android.util.Log;
+
+import services.Item;
+
+
+/**
+ * @author Lookouster
+ *
+ */
+public class CartItemHandler extends DefaultHandler {
+
+ private boolean in_entry = false;
+ private boolean in_id = false;
+ private boolean in_title = false;
+ private boolean in_content=false;
+ private boolean in_item=false;
+ private boolean in_link=false;
+ private boolean in_name=false;
+ private boolean in_price=false;
+ private String currentKey,currentName,currentPrice;
+ private List<Item> items=new ArrayList<Item>();
+
+ /**
+ * @return the currentName
+ */
+ public String getCurrentName() {
+ return currentName;
+ }
+
+
+ /**
+ * @return the currentPrice
+ */
+ public String getCurrentPrice() {
+ return currentPrice;
+ }
+
+
+ public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
+ if (localName.equalsIgnoreCase("entry")) {
+ this.in_entry = true;
+ } else if (localName.equalsIgnoreCase("id")) {
+ this.in_id = true;
+ } else if (localName.equalsIgnoreCase("title")) {
+ this.in_title = true;
+ } else if (localName.equalsIgnoreCase("content")) {
+ this.in_content = true;
+ } else if (localName.equalsIgnoreCase("item")) {
+ this.in_item = true;
+ } else if (localName.equals("link")) {
+ this.in_link = true;
+ } else if (localName.equalsIgnoreCase("name")) {
+ this.in_name = true;
+ } else if (localName.equalsIgnoreCase("price")) {
+ this.in_price = true;
+ }
+ }
+
+
+ public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
+ if (localName.equalsIgnoreCase("id"))
+ this.in_id = false;
+ if (localName.equalsIgnoreCase("entry")) {
+ this.in_entry = false;
+ } else if (localName.equalsIgnoreCase("id")) {
+ this.in_id = false;
+ } else if (localName.equalsIgnoreCase("title")) {
+ this.in_title = false;
+ } else if (localName.equalsIgnoreCase("content")) {
+ this.in_content = false;
+ } else if (localName.equalsIgnoreCase("item")) {
+ this.in_item = false;
+ items.add(new Item(currentName, currentPrice, currentKey));
+ } else if (localName.equalsIgnoreCase("link")) {
+ this.in_link = false;
+ } else if (localName.equalsIgnoreCase("name")) {
+ this.in_name = false;
+ } else if (localName.equalsIgnoreCase("price")) {
+ this.in_price = false;
+ }
+ }
+
+
+ public void characters(char ch[], int start, int length) {
+ if (this.in_id) {
+ if (this.in_entry) {
+ currentKey = new String(ch, start, length);
+ Log.e("kjhkh", currentKey);
+ }
+
+ }
+ if (this.in_name) {
+ currentName = new String(ch, start, length);
+ }
+ if (this.in_price) {
+ currentPrice = new String(ch, start, length);
+ }
+
+ }
+
+ /**
+ * @return the key
+ */
+ public String getCurrentKey() {
+ return currentKey;
+ }
+
+ public Item[] getItemsCollection()
+ {
+ return items.toArray(new Item[items.size()]);
+ }
+
+
+
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/services/json/rpc/JSONRpc.java b/branches/sca-java-1.5.1/samples/store-android/src/services/json/rpc/JSONRpc.java
new file mode 100644
index 0000000000..b803ac6470
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/services/json/rpc/JSONRpc.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package services.json.rpc;
+
+import java.io.IOException;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+public class JSONRpc {
+
+ protected JSONRpc() {
+
+ }
+
+ public static JSONObject invoke(String serviceURI, String rpcRequest) throws JSONException{
+ HttpClient httpClient = new DefaultHttpClient();
+ HttpPost httpPost = new HttpPost(serviceURI);
+
+ JSONObject result = null;
+ try {
+ httpPost.setHeader("Content-Type", "text/xml");
+ httpPost.setEntity(new StringEntity(rpcRequest));
+
+ HttpResponse httpResponse = httpClient.execute(httpPost);
+ if (httpResponse.getStatusLine().getStatusCode() == 200) {
+ String jsonResult = EntityUtils.toString(httpResponse.getEntity());
+ result = new JSONObject(jsonResult);
+ } else {
+ String errorMessage = httpResponse.getStatusLine()
+ .getReasonPhrase();
+ System.out.println(errorMessage);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return result;
+ }
+}
diff --git a/branches/sca-java-1.5.1/samples/store-android/src/store/android/catalog.java b/branches/sca-java-1.5.1/samples/store-android/src/store/android/catalog.java
new file mode 100644
index 0000000000..834362352a
--- /dev/null
+++ b/branches/sca-java-1.5.1/samples/store-android/src/store/android/catalog.java
@@ -0,0 +1,250 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package store.android;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import services.Catalog;
+import services.CatalogProxy;
+import services.Item;
+import services.ShoppingCartProxy;
+import android.app.AlertDialog;
+import android.app.TabActivity;
+import android.content.DialogInterface;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TabHost;
+import android.widget.TextView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.TabHost.OnTabChangeListener;
+import android.widget.TabHost.TabSpec;
+
+
+
+public class catalog extends TabActivity {
+ private Catalog catalogProxy = new CatalogProxy();
+ private ShoppingCartProxy shoppingCartProxy = new ShoppingCartProxy();
+
+ private TabHost mTabHost;
+ private ListView itemsList, cartList;
+ private TextView txtTotal,txtEmpty;
+ private TabSpec catalogTab, cartTab;
+ private Button btnClean;
+ private Item[] items;
+ private List<Item> cartItems=new ArrayList<Item>();
+
+
+ private void getCatalogItems() {
+ items=catalogProxy.get();
+ }
+
+ private void getCartItems() {
+ Item[] i = shoppingCartProxy.getItems();
+ if (i != null) {
+ for (Item item : i) {
+ cartItems.add(item);
+ }
+ }
+ Log.e(getString(R.string.app_tag), String.valueOf(cartItems.size()) + " cart items retrieved");
+ }
+
+ /** Called when the activity is first created. */
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Log.e(getString(R.string.app_tag), getString(R.string.start_tag));
+ // Load UI from layout file
+ setContentView(R.layout.main);
+
+ findViews();
+
+ // Get data to be loaded to UI
+ getCatalogItems();
+ getCartItems();
+
+ // Load UI with data
+ itemsList.setAdapter(new ArrayAdapter<Item>(this, R.layout.cat_row, R.id.txtItemC, items));
+ itemsList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+ itemsList.setClickable(true);
+ reloadShoppingCart();
+
+ // Set Listeners
+ listen();
+ }
+
+
+
+ /**
+ * Retrieve UI Content
+ */
+ public void findViews()
+ {
+ mTabHost = getTabHost();
+ mTabHost.addTab(mTabHost.newTabSpec(getString(R.string.tab_catalog)).setIndicator(getString(R.string.title_catalog)).setContent(R.id.ListView01));
+ mTabHost.addTab(mTabHost.newTabSpec(getString(R.string.tab_shop)).setIndicator(getString(R.string.title_shop)).setContent(R.id.tab02));
+ mTabHost.setCurrentTab(0);
+ itemsList=(ListView)findViewById(R.id.ListView01);
+ cartList=(ListView)findViewById(R.id.ListView02);
+ btnClean=(Button)findViewById(R.id.btnClean);
+ btnClean.setText(R.string.btn_clean);
+ txtTotal=(TextView)findViewById(R.id.txtTotal);
+ txtTotal.setTextSize((float) 15.0);
+ txtTotal.setTypeface(Typeface.DEFAULT_BOLD);
+ txtEmpty=(TextView)findViewById(R.id.txtEmpty);
+ txtEmpty.setTypeface(null, Typeface.ITALIC);
+
+ }
+
+ /**
+ * Implements all needed listeners for the UI
+ */
+ public void listen() {
+ // Handles total display between tab switching
+ mTabHost.setOnTabChangedListener(new OnTabChangeListener() {
+
+ public void onTabChanged(String tabId) {
+ // TODO Auto-generated method stub
+ if (tabId.compareTo("shopping_cart_tab") == 0) {
+ reloadShoppingCart();
+ }
+ }
+ });
+
+ btnClean.setOnClickListener(new OnClickListener(){
+ public void onClick(View arg0) {
+ // TODO Auto-generated method stub
+ new AlertDialog.Builder(catalog.this)
+ .setTitle("Tuscany Android Store")
+ .setMessage("You're about to erase all items. Proceed ?")
+ .setIcon(R.drawable.icon)
+ .setPositiveButton(R.string.alert_yes,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ if(shoppingCartProxy.clearCartContent())
+ {
+ cartItems.clear();
+ Log.i(getString(R.string.app_tag), getString(R.string.del_all_ok));
+ reloadShoppingCart();
+ }
+ }})
+ .setNegativeButton(R.string.alert_cancel, new DialogInterface.OnClickListener(){
+
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO Auto-generated method stub
+ }
+ })
+ .show();
+
+
+
+ }
+
+ });
+
+ itemsList.setOnItemClickListener(new OnItemClickListener(){
+
+ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
+ long arg3) {
+ // TODO Auto-generated method stub
+ addItemAction(items[(int)arg3]);
+
+ }
+
+ });
+
+ cartList.setOnItemClickListener(new OnItemClickListener(){
+
+
+ public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
+ long arg3) {
+ // TODO Auto-generated method stub
+ removeItemAction(cartItems.get((int)arg3));
+ }
+
+ });
+
+ }
+
+ public void addItemAction(Item item)
+ {
+ //add item to shopping cart.
+ Item tmp=new Item(item.getName(), item.getPrice());
+ if(shoppingCartProxy.addItem(tmp))
+ {
+ cartItems.add(tmp);
+ Log.i(getString(R.string.app_tag), getString(R.string.add_entry_ok)+item);
+ }
+
+ else
+ Log.e(getString(R.string.app_tag), getString(R.string.add_entry_ko)+item);
+
+ }
+
+ public void removeItemAction(Item item)
+ {
+ if(shoppingCartProxy.removeItem(item) && cartItems.remove(item))
+ {
+ Log.i(getString(R.string.app_tag), getString(R.string.del_entry_ok)+item);
+ }
+ else
+ Log.i(getString(R.string.app_tag), getString(R.string.del_entry_ko)+item);
+ reloadShoppingCart();
+
+ }
+
+ /**
+ * Refreshes the Shopping cart list when the adapter behind is updated
+ */
+ public void reloadShoppingCart()
+ {
+ Item[] cartArray=new Item[cartItems.size()];
+ cartList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+ cartList.setClickable(true);
+ cartList.setAdapter(new ArrayAdapter<Item>(this,
+ R.layout.shop_row, R.id.txtItemS, cartItems.toArray(cartArray)));
+ if(!cartList.getAdapter().isEmpty())
+ {
+ txtTotal.setVisibility(TextView.VISIBLE);
+ txtEmpty.setText("Click on an item below to remove it");
+ btnClean.setVisibility(Button.VISIBLE);
+ }
+ else
+ {
+ txtTotal.setVisibility(TextView.INVISIBLE);
+ txtEmpty.setVisibility(TextView.VISIBLE);
+ txtEmpty.setText(R.string.txt_empty);
+ btnClean.setVisibility(Button.INVISIBLE);
+ }
+ String tt=shoppingCartProxy.getTotal();
+ txtTotal.setText(getString(R.string.title_order)+": "+(tt.length()>5?tt.substring(0,5):tt));
+
+ }
+
+
+
+} \ No newline at end of file