Merge branch 'master' into history
[potlatch2.git] / net / systemeD / potlatch2 / utils / SnapshotConnection.as
1 package net.systemeD.potlatch2.utils {
2
3     import net.systemeD.halcyon.connection.*;
4     import flash.events.Event;
5     import flash.net.*;
6
7     /**
8     * A connection to a Snapshot server. A Snapshot server serves OSM map requests and can also
9     * track the "status" of an entity. Most other types of XMLConnection requests will fail. See
10     * http://www.github.com/gravitystorm/snapshot-server for example code based on the database
11     * structure created by osmosis pgsnapshot schema.
12     */
13
14     public class SnapshotConnection extends XMLConnection {
15
16         public function SnapshotConnection(cname:String,api:String,policy:String,initparams:Object=null) {
17             super(cname,api,policy,initparams);
18             inlineStatus = true;
19         }
20
21         // As it stands, the following two functions could be refactored further.
22
23         /**
24         * Post a status update call to the server and update entity.status if successful.
25         */
26         public function markComplete(entity:Entity):void {
27             var urlReq:URLRequest;
28
29             if (entity is Node) {
30                 var node:Node = Node(entity);
31                 if (node == getNode(node.id)) { // confirm it's from this connection
32                     makeRequest(entity, 'complete');
33                 }
34
35             } else if (entity is Way) {
36                 var way:Way = Way(entity);
37                 if (way == getWay(way.id)) { // confirm it's from this connection
38                     makeRequest(entity, 'complete');
39                 }
40             }
41         }
42
43         /**
44         * Send a "complete" call to the server and update entity.status if successful.
45         */
46         public function markNotComplete(entity:Entity):void {
47             var urlReq:URLRequest;
48
49             if (entity is Node) {
50                 var node:Node = Node(entity);
51                 if (node == getNode(node.id)) { // confirm it's from this connection
52                     makeRequest(entity, 'incomplete');
53                 }
54
55             } else if (entity is Way) {
56                 var way:Way = Way(entity);
57                 if (way == getWay(way.id)) { // confirm it's from this connection
58                     makeRequest(entity, 'incomplete');
59                 }
60             }
61         }
62
63         private function makeRequest(entity:Entity, status:String):void {
64             var urlReq:URLRequest = new URLRequest(apiBaseURL+entity.getType()+"/"+entity.id+"/status");
65             urlReq.method = "POST";
66             urlReq.data = status;
67             var loader:URLLoader = new URLLoader();
68             loader.addEventListener(Event.COMPLETE, function(e:Event):void { updateStatus(entity, status) });
69             loader.load(urlReq);
70         }
71
72         private function updateStatus(e:Entity, s:String):void {
73             e.setStatus(s);
74         }
75
76     }
77 }