source: ComponentRegistry/trunk/ComponentBrowserGui/src/main/flex/clarin/cmdi/componentregistry/services/UploadService.as @ 206

Last change on this file since 206 was 206, checked in by patdui, 14 years ago
  • added as3httpclient for doing http DELETE commands etc...
  • implemented editor
  • Using Basic Header security to authorize POST and DELETEs
  • renamed Register to Importer
File size: 7.0 KB
Line 
1package clarin.cmdi.componentregistry.services {
2        import clarin.cmdi.componentregistry.common.ItemDescription;
3        import clarin.cmdi.componentregistry.importer.UploadCompleteEvent;
4
5        import com.adobe.net.URI;
6        import com.hurlant.util.Base64;
7
8        import flash.events.DataEvent;
9        import flash.events.Event;
10        import flash.events.HTTPStatusEvent;
11        import flash.events.IOErrorEvent;
12        import flash.events.ProgressEvent;
13        import flash.events.SecurityErrorEvent;
14        import flash.net.FileFilter;
15        import flash.net.FileReference;
16        import flash.net.URLRequest;
17        import flash.net.URLVariables;
18
19        import mx.controls.ProgressBar;
20
21        import org.httpclient.HttpClient;
22        import org.httpclient.events.HttpDataEvent;
23        import org.httpclient.events.HttpErrorEvent;
24        import org.httpclient.events.HttpStatusEvent;
25        import org.httpclient.http.Post;
26        import org.httpclient.http.multipart.Multipart;
27        import org.httpclient.http.multipart.Part;
28
29        [Event(name="uploadComplete", type="clarin.cmdi.componentregistry.importer.UploadCompleteEvent")]
30        public class UploadService {
31
32                public function UploadService() {
33                }
34
35                [Bindable]
36                public var selectedFile:String = "";
37                [Bindable]
38                public var message:String = "";
39
40                private var fileRef:FileReference;
41                private var httpClient:HttpClient;
42                private var request:URLRequest;
43                private var pb:ProgressBar;
44
45                public function init(progressBar:ProgressBar):void {
46                        pb = progressBar;
47                }
48
49                private function createAndInitRequest(url:String):void {
50                        request = new URLRequest(url);
51                        httpClient = new HttpClient();
52                        httpClient.listener.onError = httpclientErrorHandler;
53                        httpClient.listener.onData = httpclientDataHandler;
54                        httpClient.listener.onStatus = httpclientStatusHandler;
55                }
56
57                private function createAndInitFileReference():void {
58                        fileRef = new FileReference();
59                        fileRef.addEventListener(Event.SELECT, selectHandler);
60                        fileRef.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, responseHandler);
61                        fileRef.addEventListener(ProgressEvent.PROGRESS, progressHandler);
62                        fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
63                        fileRef.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
64
65                }
66
67                /**
68                 * submits a profile, data parameter can be null which implies a file was selected using selectXmlFile();
69                 */
70                public function submitProfile(description:ItemDescription, data:String = null):void {
71                        createAndInitRequest(Config.instance.uploadProfileUrl);
72                        var params:URLVariables = new URLVariables();
73                        submit(description, params, data);
74                }
75
76                /**
77                 * submits a component, data parameter can be null which implies a file was selected using selectXmlFile();
78                 */
79                public function submitComponent(description:ItemDescription, data:String = null):void {
80                        createAndInitRequest(Config.instance.uploadComponentUrl);
81                        var params:URLVariables = new URLVariables();
82                        params.group = description.groupName;
83                        submit(description, params, data);
84                }
85
86                private function getCredentials():String {
87                        return Base64.encode("tomcat:tomcat");
88                }
89
90                private function submit(description:ItemDescription, params:URLVariables, data:String = null):void {
91                        message = "";
92                        try {
93                                if (data != null) {
94                                        var parts:Array = new Array();
95                                        parts.push(new Part("description", description.description));
96                                        parts.push(new Part("name", description.name));
97                                        parts.push(new Part("data", data, "application/octet-stream", [{name: "filename", value: description.name + ".xml"}]));
98
99                                        var multipart:Multipart = new Multipart(parts);
100                                        var uri:URI = new URI(Config.instance.uploadProfileUrl);
101                                        startUploadHandler();
102                                        var post:Post = new Post();
103                                        post.addHeader("Authorization", "BASIC " + getCredentials());
104                                        post.setMultipart(multipart);
105                                        httpClient.request(uri, post);
106                                } else {
107                                        // Cannot sent credentials with FileReference.upload so just load the data and then submit through HttpClient
108                                        startUploadHandler();
109                                        if (fileRef.data == null) {
110                                                //only load if not loaded before otherwise sent the already loaded file. You can only force a reload of the file by selecting it again (it is a flash thingy).
111                                                fileRef.addEventListener(Event.COMPLETE, function(event:Event):void {
112                                                                submit(description, params, new String(fileRef.data));
113                                                        });
114                                                fileRef.load();
115                                        } else {
116                                                submit(description, params, new String(fileRef.data));
117                                        }
118                                }
119                        } catch (error:Error) {
120                                trace("Unable to upload file. Error: " + error);
121                                throw error;
122                        }
123                }
124
125
126                public function selectXmlFile(event:Event):void {
127                        createAndInitFileReference();
128                        var filter:FileFilter = new FileFilter("Xml Files (*.xml)", "*.xml");
129                        fileRef.browse(new Array(filter));
130                }
131
132                private function selectHandler(event:Event):void {
133                        selectedFile = fileRef.name;
134                        message = "";
135                        pb.visible = false;
136                }
137
138                private function httpclientStatusHandler(event:HttpStatusEvent):void {
139                        if (event.code != "200") {
140                                addToMessage("Server Failed to handle registration. Unexpected error, try again later. (httpstatus code was: " + event.code + ")\n");
141                        }
142                }
143
144                private function httpclientDataHandler(event:HttpDataEvent):void {
145                        uploadComplete();
146                        var response:XML = new XML(event.bytes);
147                        handleResponse(response);
148                }
149
150                private function httpclientErrorHandler(event:HttpErrorEvent):void {
151                        addToMessage("Server Failed to handle registration. Unexpected error, try again later. (error: " + event.text + ")\n");
152                }
153
154                private function securityErrorHandler(event:SecurityErrorEvent):void {
155                        addToMessage("Server Failed to handle registration. Unexpected error, try again later. (error: " + event.text + ")\n");
156                }
157
158                private function ioErrorHandler(event:IOErrorEvent):void {
159                        addToMessage("Unable to load file. (error: " + event.text + ")\n");
160                }
161
162                private function progressHandler(event:ProgressEvent):void {
163                        trace("Uploading: " + event.bytesLoaded + "/" + event.bytesTotal);
164                        pb.setProgress(event.bytesLoaded, event.bytesTotal);
165                }
166
167
168                private function responseHandler(event:DataEvent):void {
169                        uploadComplete();
170                        var response:XML = new XML(event.data);
171                        handleResponse(response);
172                }
173
174                private function startUploadHandler():void {
175                        trace("uploading start");
176                        pb.label = "uploading %3%%";
177                        pb.visible = true;
178                        pb.includeInLayout = true;
179                }
180
181                private function handleResponse(response:XML):void {
182                        if (response.@registered == true) {
183                                var item:ItemDescription = new ItemDescription();
184                                if (response.@isProfile == true) {
185                                        item.createProfile(response.description[0]);
186                                } else {
187                                        item.createComponent(response.description[0]);
188                                }
189                                dispatchEvent(new UploadCompleteEvent(item));
190                        } else {
191                                createErrorMessage(response);
192                        }
193
194                }
195
196                private function uploadComplete():void {
197                        pb.label = "Upload complete";
198                        pb.setProgress(100, 100);
199                }
200
201                private function createErrorMessage(response:XML):void {
202                        addToMessage("Failed to register:");
203                        var errors:XMLList = response.errors.error;
204                        for each (var error:XML in errors) {
205                                message += " - " + error.toString() + "\n";
206                        }
207                }
208
209                private function addToMessage(text:String):void {
210                        message += text;
211                }
212
213        }
214}
Note: See TracBrowser for help on using the repository browser.