Statistics
| Branch: | Tag: | Revision:

root / src / gr / grnet / pithos / web / client / FilePropertiesDialog.java @ c8f8690d

History | View | Annotate | Download (14.2 kB)

1
/*
2
 * Copyright 2011-2012 GRNET S.A. All rights reserved.
3
 *
4
 * Redistribution and use in source and binary forms, with or
5
 * without modification, are permitted provided that the following
6
 * conditions are met:
7
 *
8
 *   1. Redistributions of source code must retain the above
9
 *      copyright notice, this list of conditions and the following
10
 *      disclaimer.
11
 *
12
 *   2. Redistributions in binary form must reproduce the above
13
 *      copyright notice, this list of conditions and the following
14
 *      disclaimer in the documentation and/or other materials
15
 *      provided with the distribution.
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
 * POSSIBILITY OF SUCH DAMAGE.
29
 *
30
 * The views and conclusions contained in the software and
31
 * documentation are those of the authors and should not be
32
 * interpreted as representing official policies, either expressed
33
 * or implied, of GRNET S.A.
34
 */
35
package gr.grnet.pithos.web.client;
36

    
37
import gr.grnet.pithos.web.client.foldertree.File;
38
import gr.grnet.pithos.web.client.rest.PostRequest;
39
import gr.grnet.pithos.web.client.rest.PutRequest;
40

    
41
import java.util.Arrays;
42
import java.util.HashMap;
43
import java.util.Map;
44

    
45
import com.google.gwt.core.client.GWT;
46
import com.google.gwt.core.client.Scheduler;
47
import com.google.gwt.event.dom.client.ClickEvent;
48
import com.google.gwt.event.dom.client.ClickHandler;
49
import com.google.gwt.http.client.Response;
50
import com.google.gwt.http.client.URL;
51
import com.google.gwt.i18n.client.DateTimeFormat;
52
import com.google.gwt.user.client.Command;
53
import com.google.gwt.user.client.ui.Anchor;
54
import com.google.gwt.user.client.ui.Button;
55
import com.google.gwt.user.client.ui.FlexTable;
56
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
57
import com.google.gwt.user.client.ui.HorizontalPanel;
58
import com.google.gwt.user.client.ui.Label;
59
import com.google.gwt.user.client.ui.TextBox;
60
import com.google.gwt.user.client.ui.VerticalPanel;
61

    
62
/**
63
 * The 'File properties' dialog box implementation.
64
 *
65
 */
66
public class FilePropertiesDialog extends AbstractPropertiesDialog {
67

    
68
        /**
69
         * The widget that holds the name of the file.
70
         */
71
        private TextBox name = new TextBox();
72

    
73
        final File file;
74

    
75
    FlexTable metaTable;
76
        /**
77
         * The widget's constructor.
78
         */
79
        public FilePropertiesDialog(Pithos _app, File _file) {
80
        super(_app);
81
        file = _file;
82

    
83
                Anchor close = new Anchor("close");
84
                close.addStyleName("close");
85
                close.addClickHandler(new ClickHandler() {
86
                        
87
                        @Override
88
                        public void onClick(ClickEvent event) {
89
                                hide();
90
                        }
91
                });
92
                // Set the dialog's caption.
93
                setText("File properties");
94
                setGlassEnabled(true);
95
                setStyleName("pithos-DialogBox");
96

    
97
                // Outer contains inner and buttons.
98
                final VerticalPanel outer = new VerticalPanel();
99
                outer.add(close);
100
                // Inner contains generalPanel and permPanel.
101
                inner = new VerticalPanel();
102
                inner.addStyleName("inner");
103

    
104
        inner.add(createGeneralPanel());
105

    
106
        outer.add(inner);
107

    
108
                // Create the 'OK' button, along with a listener that hides the dialog
109
                // when the button is clicked.
110
                final Button ok = new Button("OK", new ClickHandler() {
111
                        @Override
112
                        public void onClick(ClickEvent event) {
113
                                if (accept())
114
                                        closeDialog();
115
                        }
116
                });
117
                ok.addStyleName("button");
118

    
119
        outer.add(ok);
120
        outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);
121

    
122
        setWidget(outer);
123
        }
124

    
125
        private VerticalPanel createGeneralPanel() {
126
        final VerticalPanel generalPanel = new VerticalPanel();
127
        final FlexTable generalTable = new FlexTable();
128
        generalTable.setText(0, 0, "Name");
129
        generalTable.setText(1, 0, "Folder");
130
        generalTable.setText(2, 0, "Owner");
131
        generalTable.setText(3, 0, "Last modified");
132

    
133
        name.setWidth("100%");
134
        name.setText(file.getName());
135
        generalTable.setWidget(0, 1, name);
136
        if(file.getParent() != null) {
137
            generalTable.setText(1, 1, file.getParent().getName());
138
        }
139
        else {
140
            generalTable.setText(1, 1, "-");
141
        }
142

    
143
        final String ownerID = file.getOwnerID();
144
        final String displayName = app.getDisplayNameForUserID(ownerID);
145
        final String ownerDisplayName;
146
        if(displayName == null) {
147
            // FIXME: Get the actual display name and do not use the id
148
            ownerDisplayName = ownerID;
149
        }
150
        else {
151
            ownerDisplayName = displayName;
152
        }
153
        generalTable.setText(2, 1, ownerDisplayName);
154

    
155
        final DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a");
156
        generalTable.setText(3, 1, file.getLastModified() != null ? formatter.format(file.getLastModified()) : "");
157

    
158
        generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");
159
        generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");
160
        generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels");
161
        generalTable.getFlexCellFormatter().setStyleName(3, 0, "props-labels");
162
        generalTable.getFlexCellFormatter().setStyleName(4, 0, "props-labels");
163
        generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");
164
        generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values");
165
        generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values");
166
        generalTable.getFlexCellFormatter().setStyleName(3, 1, "props-values");
167
        generalTable.setCellSpacing(4);
168

    
169
        generalPanel.add(generalTable);
170

    
171
        HorizontalPanel metaTitlePanel = new HorizontalPanel();
172
        metaTitlePanel.setSpacing(5);
173
        Label meta = new Label("Meta data");
174
        meta.addStyleName("pithos-metaTitle");
175
        metaTitlePanel.add(meta);
176
        
177
                Anchor plus = new Anchor("add");
178
                plus.addStyleName(Pithos.resources.pithosCss().commandAnchor());
179
                metaTitlePanel.add(plus);
180
                
181
                generalPanel.add(metaTitlePanel);
182
                
183
                metaTable = new FlexTable();
184
                metaTable.setCellSpacing(0);
185
                metaTable.setHTML(0, 0, "Name");
186
                metaTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");
187
                metaTable.setText(0, 1, "Value");
188
                metaTable.getFlexCellFormatter().setStyleName(0, 1, "props-labels");
189
                int rows = 1;
190
                for (String metaKey : file.getMeta().keySet()) {
191
                        addFormLine(metaTable, rows++, metaKey, file.getMeta().get(metaKey));
192
                }
193
                if (rows == 1) //If no meta add an empty line
194
                        addFormLine(metaTable, rows++, "", "");
195
                
196
                plus.addClickHandler(new ClickHandler() {
197
                        
198
                        @Override
199
                        public void onClick(ClickEvent event) {
200
                                addFormLine(metaTable, metaTable.getRowCount(), "", "");
201
                        }
202
                });
203

    
204
                generalPanel.add(metaTable);
205
        generalPanel.setSpacing(4);
206
        return generalPanel;
207
    }
208

    
209
        void addFormLine(final FlexTable table, int row, String _name, String _value) {
210
                TextBox nameBox = new TextBox();
211
                nameBox.setText(_name);
212
                nameBox.addStyleName("pithos-metaName");
213
                table.setWidget(row, 0, nameBox);
214
                table.getFlexCellFormatter().setStyleName(1, 0, "props-values");
215

    
216
                TextBox valueBox = new TextBox();
217
                valueBox.setText(_value);
218
                valueBox.addStyleName("pithos-metaValue");
219
                table.setWidget(row, 1, valueBox);
220
                table.getFlexCellFormatter().setStyleName(1, 1, "props-values");
221
                
222
                Anchor delete = new Anchor("remove");
223
                delete.addStyleName(Pithos.resources.pithosCss().commandAnchor());
224
                delete.addClickHandler(new ClickHandler() {
225
                        
226
                        @Override
227
                        public void onClick(ClickEvent event) {
228
                                int rowIndex = table.getCellForEvent(event).getRowIndex();
229
                                table.removeRow(rowIndex);
230
                        }
231
                });
232
                table.setWidget(row, 2, delete);
233
        }
234

    
235
        /**
236
         * Accepts any change and updates the file
237
         *
238
         */
239
        @Override
240
        protected boolean accept() {
241
                String newFilename = null;
242

    
243
                if (!name.getText().trim().equals(file.getName())) {
244
                        newFilename = name.getText().trim();
245
                        if (newFilename.length() == 0)
246
                                newFilename = null;
247
                }
248
                
249

    
250
        final Map<String, String> newMeta = new HashMap<String, String>();
251
        for (int row = 1; row < metaTable.getRowCount(); row++) {
252
                String key = ((TextBox) metaTable.getWidget(row, 0)).getText().trim();
253
                String value = ((TextBox) metaTable.getWidget(row, 1)).getText().trim();
254
                if (key.length() > 0 && value.length() > 0)
255
                        newMeta.put(key, value);
256
                else if ((key.length() > 0 && value.length() == 0) || (key.length() == 0 && value.length() > 0)) {
257
                        app.displayError("You have empty keys or values");
258
                        return false;
259
                }
260
        }
261

    
262
        if (newFilename != null) {
263
            final String path = file.getParent().getUri() + "/" + newFilename;
264
            PutRequest updateFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {
265
                @Override
266
                public void onSuccess(Resource result) {
267
                    updateMetaData(app.getApiPath(), file.getOwnerID(), path, newMeta);
268
                }
269

    
270
                @Override
271
                public void onError(Throwable t) {
272
                    GWT.log("", t);
273
                                        app.setError(t);
274
                    app.displayError("System error modifying file:" + t.getMessage());
275
                }
276

    
277
                                @Override
278
                                protected void onUnauthorized(Response response) {
279
                                        app.sessionExpired();
280
                                }
281
            };
282
            updateFile.setHeader("X-Auth-Token", app.getUserToken());
283
            updateFile.setHeader("X-Move-From", URL.encodePathSegment(file.getUri()));
284
            updateFile.setHeader("Content-Type", file.getContentType());
285
            for (String key : file.getMeta().keySet())
286
                updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(key.trim()), URL.encodePathSegment(newMeta.get(key)));
287
            if (file.isPublished())
288
                updateFile.setHeader("X-Object-Public", "true");
289
            String readPermHeader = "read=";
290
            String writePermHeader = "write=";
291
            for (String u : file.getPermissions().keySet()) {
292
                Boolean[] p = file.getPermissions().get(u);
293
                if (p[0] != null && p[0])
294
                    readPermHeader += u + ",";
295
                if (p[1] != null && p[1])
296
                    writePermHeader += u + ",";
297
            }
298
            if (readPermHeader.endsWith("="))
299
                readPermHeader = "";
300
            else if (readPermHeader.endsWith(","))
301
                readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1);
302
            if (writePermHeader.endsWith("="))
303
                writePermHeader = "";
304
            else if (writePermHeader.endsWith(","))
305
                writePermHeader = writePermHeader.substring(0, writePermHeader.length() - 1);
306
            String permHeader = readPermHeader +  ((readPermHeader.length()  > 0 && writePermHeader.length() > 0) ?  ";" : "") + writePermHeader;
307
            if (permHeader.length() == 0)
308
                permHeader="~";
309
            else
310
                    permHeader = URL.encodePathSegment(permHeader);
311
            updateFile.setHeader("X-Object-Sharing", permHeader);
312

    
313
            Scheduler.get().scheduleDeferred(updateFile);
314
        }
315
        else
316
            updateMetaData(app.getApiPath(), app.getUserID(), file.getUri(), newMeta);
317
        return true;
318
        }
319

    
320
        protected void updateMetaData(final String api, final String owner, final String path, Map<String, String> newMeta) {
321
        if (newMeta != null) {
322
            PostRequest updateFile = new PostRequest(api, owner, path + "?update=") {
323
                @Override
324
                public void onSuccess(Resource result) {
325
                        if (!app.isMySharedSelected())
326
                            app.updateFolder(file.getParent(), true, new Command() {
327
                                                        
328
                                                        @Override
329
                                                        public void execute() {
330
                                                                app.getFileList().selectByUrl(Arrays.asList(api + owner + path));
331
                                                                app.updateMySharedRoot();
332
                                                        }
333
                                                }, true);
334
                        else {
335
                                app.updateSharedFolder(file.getParent(), true, new Command() {
336
                                        
337
                                                        @Override
338
                                                        public void execute() {
339
                                                                app.getFileList().selectByUrl(Arrays.asList(api + owner + path));
340
                                                        }
341
                                });
342
                        }
343
                }
344

    
345
                @Override
346
                public void onError(Throwable t) {
347
                    GWT.log("", t);
348
                                        app.setError(t);
349
                    app.displayError("System error modifying file:" + t.getMessage());
350
                }
351

    
352
                                @Override
353
                                protected void onUnauthorized(Response response) {
354
                                        app.sessionExpired();
355
                                }
356
            };
357
            updateFile.setHeader("X-Auth-Token", app.getUserToken());
358
            
359
            for (String t : file.getMeta().keySet()) {
360
                        updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(t.trim()), "~");
361
            }
362
            
363
            for (String key : newMeta.keySet())
364
                updateFile.setHeader("X-Object-Meta-" + URL.encodePathSegment(key.trim()), URL.encodePathSegment(newMeta.get(key)));
365
            
366
            Scheduler.get().scheduleDeferred(updateFile);
367
        }
368
        else if (!app.isMySharedSelected())
369
            app.updateFolder(file.getParent(), true, new Command() {
370
                                
371
                                @Override
372
                                public void execute() {
373
                                        app.getFileList().selectByUrl(Arrays.asList(api + owner + path));
374
                                        if (file.isSharedOrPublished())
375
                                                app.updateMySharedRoot();
376
                                }
377
                        }, true);
378
        else {
379
                        app.getFileList().selectByUrl(Arrays.asList(api + owner + path));
380
                app.updateSharedFolder(file.getParent(), true);
381
        }
382
    }
383
}