summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/samples/store-java/store/ShoppingCartImpl.java
blob: 878e0cff4978b8a51e84eca603b2858b52867090 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
 * 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;

import static org.apache.tuscany.IterableUtil.*;
import static org.apache.tuscany.UUIDUtil.*;

import org.apache.tuscany.Service;

/**
 * Shopping cart component implementation.
 */
public class ShoppingCartImpl {

    static String cartId = "1234";

    /**
     * Get the shopping cart from the cache. Return an empty cart if not found.
     */
    public Iterable<?> getcart(final String id, final Service cache) {
        final Iterable<String> iid = list(id);
        final Iterable<?> cart = cache.get(iid);
        if(cart == null)
            return list();
        return cart;
    }

    /**
     * Post a new item to the cart. Create a new cart if necessary.
     */
    public Iterable<String> post(final Iterable<String> collection, final Iterable<?> item, final Service cache) {
        final String id = uuid();
        final Iterable<?> newItem = list(car(item), id, caddr(item));
        final Iterable<?> cart = cons(newItem, this.getcart(cartId, cache));
        final Iterable<String> iid = list(cartId);
        cache.put(iid, cart);
        return list(id);
    }

    /**
     * Find an item in the cart.
     */
    Iterable<?> find(final String id, final Iterable<?> cart) {
        if(isNil(cart))
            return cons("Item", list("0", list()));
        if(id.equals(cadr(car(cart))))
            return car(cart);
        return this.find(id, cdr(cart));
    }

    /**
     * Return items from the cart.
     */
    public Iterable<?> get(final Iterable<String> id, final Service cache) {
        if(isNil(id))
            return cons("Your Cart", cons(cartId, this.getcart(cartId, cache)));
        return this.find((String)car(id), this.getcart(cartId, cache));
    }

    /**
     * Delete items from the cart.
     */
    public Boolean delete(final Iterable<String> id, final Service cache) {
        if(isNil(id)) {
            final Iterable<String> iid = list(cartId);
            return cache.delete(iid);
        }
        return true;
    }

    /**
     * Return the price of an item.
     */
    Double price(final Iterable<?> item) {
        return Double.valueOf((String)cadr(assoc("'price", caddr(item))));
    }

    /**
     * Sum the prices of a list of items.
     */
    Double sum(final Iterable<?> items) {
        if(isNil(items))
            return 0.0;
        return this.price((Iterable<?>)car(items)) + this.sum(cdr(items));
    }

    /**
     * Return the total price of the items in the cart.
     */
    public Double gettotal(final Service cache) {
        final Iterable<?> cart = this.getcart(cartId, cache);
        return this.sum(cart);
    }

    /**
     * TODO remove this JSON-RPC specific function.
     */
    public Iterable<?> listMethods(final Service cache) {
        return list("Service.gettotal");
    }

}