import com.google.gwt.http.client.URL;\r
import com.google.gwt.user.client.Event.NativePreviewEvent;\r
import com.google.gwt.user.client.ui.*;\r
+import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;\r
+import gr.grnet.pithos.web.client.catalog.UserCatalogs;\r
import gr.grnet.pithos.web.client.grouptree.Group;\r
+import gr.grnet.pithos.web.client.grouptree.User;\r
import gr.grnet.pithos.web.client.rest.PostRequest;\r
import gr.grnet.pithos.web.client.rest.RestException;\r
\r
/**\r
* The widget that holds the folderName of the folder.\r
*/\r
- TextBox userName = new TextBox();\r
+ TextBox userDisplayNameTextBox = new TextBox();\r
\r
final VerticalPanel inner;\r
\r
FlexTable generalTable = new FlexTable();\r
generalTable.setText(0, 0, "Username");\r
\r
- generalTable.setWidget(0, 1, userName);\r
+ generalTable.setWidget(0, 1, userDisplayNameTextBox);\r
\r
generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");\r
@Override\r
public void center() {\r
super.center();\r
- userName.setFocus(true);\r
+ userDisplayNameTextBox.setFocus(true);\r
}\r
\r
@Override\r
* Generate an RPC request to create a new folder.\r
*/\r
void addUser() {\r
- String name = userName.getText().trim();\r
- if(name.length() == 0) {\r
+ final String userDisplayName = userDisplayNameTextBox.getText().trim();\r
+ if(userDisplayName.length() == 0) {\r
return;\r
}\r
- if(!Const.EMAIL_REGEX.test(name)) {\r
+ if(!Const.EMAIL_REGEX.test(userDisplayName)) {\r
app.displayWarning("Username must be a valid email address");\r
return;\r
}\r
\r
- group.addMember(name);\r
- String path = "?update=";\r
- PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {\r
+ // Now get the userID\r
+ final String userID = app.getUserIDForDisplayName(userDisplayName);\r
+ if(userID != null) {\r
+ doAddUser(userID, userDisplayName);\r
+ }\r
+ else {\r
+ // Must call server to obtain userID\r
+ new UpdateUserCatalogs(app, null, Helpers.toList(userDisplayName)) {\r
+ @Override\r
+ public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {\r
+ final String userID = updatedUserCatalogs.getUserID(userDisplayName);\r
+ if(userID != null) {\r
+ doAddUser(userID, userDisplayName);\r
+ }\r
+ else {\r
+ app.displayError("Unknown user " + userDisplayName);\r
+ }\r
+ }\r
+ }.scheduleDeferred();\r
+ }\r
+ }\r
\r
+ private void doAddUser(String userID, String userDisplayName) {\r
+ final User newUser = new User(userID, userDisplayName, group.getName());\r
+ app.LOG("doAddUser() ", newUser);\r
+ group.addUser(newUser);\r
+ final String path = "?update=";\r
+ PostRequest updateGroup = new PostRequest(app, app.getApiPath(), app.getUserID(), path) {\r
@Override\r
public void onSuccess(Resource result) {\r
app.updateGroupNode(group);\r
}\r
};\r
updateGroup.setHeader(Const.X_AUTH_TOKEN, app.getUserToken());\r
- String groupMembers = "";\r
- for(String u : group.getMembers()) {\r
- groupMembers += (URL.encodePathSegment(u) + ",");\r
- }\r
+ final String groupMembers = group.encodeUserIDsForXAccountGroup();\r
updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), groupMembers);\r
Scheduler.get().scheduleDeferred(updateGroup);\r
}\r
public static final String TRASH_CONTAINER = "trash";
public static final RegExp EMAIL_REGEX = RegExp.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+[.][A-Z]{2,4}$", "i");
public static final String X_ACCOUNT_GROUP_ = "X-Account-Group-";
+ public static final String X_ACCOUNT_CONTAINER_COUNT = "X-Account-Container-Count";
+ public static final String X_ACCOUNT_OBJECT_COUNT = "X-Account-Object-Count";
+ public static final String X_ACCOUNT_BYTES_USED = "X-Account-Bytes-Used";
+ public static final String X_ACCOUNT_POLICY_QUOTA = "X-Account-Policy-Quota";
+ public static final String X_ACCOUNT_LAST_LOGIN = "X-Account-Last-Login";
+ public static final String LAST_MODIFIED = "Last-Modified";
+ public static final String NUMBER_FORMAT_1 = "######.#";
private Const() {}
if (iter.hasNext()) {\r
File f = iter.next();\r
String path = f.getUri();\r
- DeleteRequest deleteFile = new DeleteRequest(app.getApiPath(), f.getOwnerID(), URL.encode(path)) {\r
+ DeleteRequest deleteFile = new DeleteRequest(app, app.getApiPath(), f.getOwnerID(), URL.encode(path)) {\r
@Override\r
public void onSuccess(Resource result) {\r
deleteFile(iter);\r
*/
void sendFeedback() {
final String feedbackURL = otherProperties.get("feedbackUrl");
- PostRequest sendFeedback = new PostRequest("", "", feedbackURL, "feedback_msg=" + msg.getText() + "&feedback_data=" + appData + "&auth=" + app.getUserToken()) {
+ PostRequest sendFeedback = new PostRequest(app, "", "", feedbackURL, "feedback_msg=" + msg.getText() + "&feedback_data=" + appData + "&auth=" + app.getUserToken()) {
@Override
protected void onUnauthorized(Response response) {
\r
protected void updateMetaData(String api, String owner, final String path, final Map<String, Boolean[]> newPermissions) {\r
if (newPermissions != null) {\r
- PostRequest updateFile = new PostRequest(api, owner, path) {\r
+ PostRequest updateFile = new PostRequest(app, api, owner, path) {\r
@Override\r
public void onSuccess(Resource result) {\r
- HeadRequest<File> headFile = new HeadRequest<File>(File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
+ HeadRequest<File> headFile = new HeadRequest<File>(app, File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
\r
@Override\r
public void onSuccess(File _result) {\r
\r
if (newFilename != null) {\r
final String path = file.getParent().getUri() + "/" + newFilename;\r
- PutRequest updateFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {\r
+ PutRequest updateFile = new PutRequest(app, app.getApiPath(), app.getUserID(), path) {\r
@Override\r
public void onSuccess(Resource result) {\r
updateMetaData(app.getApiPath(), file.getOwnerID(), path, newMeta);\r
\r
protected void updateMetaData(final String api, final String owner, final String path, Map<String, String> newMeta) {\r
if (newMeta != null) {\r
- PostRequest updateFile = new PostRequest(api, owner, path + "?update=") {\r
+ PostRequest updateFile = new PostRequest(app, api, owner, path + "?update=") {\r
@Override\r
public void onSuccess(Resource result) {\r
if (!app.isMySharedSelected())\r
\r
protected void updateMetaData(String api, String owner, final String path, final Boolean published) {\r
if (published != null) {\r
- PostRequest updateFile = new PostRequest(api, owner, path) {\r
+ PostRequest updateFile = new PostRequest(app, api, owner, path) {\r
@Override\r
public void onSuccess(Resource result) {\r
- HeadRequest<File> headFile = new HeadRequest<File>(File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
+ HeadRequest<File> headFile = new HeadRequest<File>(app, File.class, app.getApiPath(), file.getOwnerID(), path, file) {\r
\r
@Override\r
public void onSuccess(File _result) {\r
\r
protected void fetchVersions() {\r
String path = file.getUri() + "?format=json&version=list";\r
- GetRequest<FileVersions> getVersions = new GetRequest<FileVersions>(FileVersions.class, app.getApiPath(), file.getOwnerID(), path) {\r
+ GetRequest<FileVersions> getVersions = new GetRequest<FileVersions>(app, FileVersions.class, app.getApiPath(), file.getOwnerID(), path) {\r
\r
@Override\r
public void onSuccess(FileVersions _result) {\r
\r
protected void updateMetadata(final String path, final Map<String, Boolean[]> newPermissions) {\r
if (newPermissions != null) {\r
- PostRequest updateFolder = new PostRequest(app.getApiPath(), folder.getOwnerID(), path) {\r
+ PostRequest updateFolder = new PostRequest(app, app.getApiPath(), folder.getOwnerID(), path) {\r
@Override\r
public void onSuccess(Resource result) {\r
app.updateFolder(folder.getParent(), false, new Command() {\r
if (t instanceof RestException) {\r
if (((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) { //Probably a virtual folder\r
final String path1 = folder.getUri();\r
- PutRequest newFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path1) {\r
+ PutRequest newFolder = new PutRequest(app, app.getApiPath(), folder.getOwnerID(), path1) {\r
@Override\r
public void onSuccess(Resource result) {\r
updateMetadata(path, newPermissions);\r
return;\r
}\r
String path = folder.getUri() + "/" + name;\r
- PutRequest createFolder = new PutRequest(app.getApiPath(), folder.getOwnerID(), path) {\r
+ PutRequest createFolder = new PutRequest(app, app.getApiPath(), folder.getOwnerID(), path) {\r
@Override\r
public void onSuccess(Resource result) {\r
app.updateFolder(folder, true, new Command() {\r
*/\r
package gr.grnet.pithos.web.client;\r
\r
-import gr.grnet.pithos.web.client.commands.AddUserCommand;\r
-import gr.grnet.pithos.web.client.foldertree.Folder;\r
-import gr.grnet.pithos.web.client.grouptree.Group;\r
-\r
import com.google.gwt.dom.client.NativeEvent;\r
import com.google.gwt.event.dom.client.ClickEvent;\r
import com.google.gwt.event.dom.client.ClickHandler;\r
import com.google.gwt.event.dom.client.KeyDownEvent;\r
import com.google.gwt.user.client.Command;\r
import com.google.gwt.user.client.Event.NativePreviewEvent;\r
-import com.google.gwt.user.client.ui.Anchor;\r
-import com.google.gwt.user.client.ui.Button;\r
-import com.google.gwt.user.client.ui.DialogBox;\r
-import com.google.gwt.user.client.ui.FlexTable;\r
-import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
-import com.google.gwt.user.client.ui.TextBox;\r
-import com.google.gwt.user.client.ui.VerticalPanel;\r
+import com.google.gwt.user.client.ui.*;\r
+import gr.grnet.pithos.web.client.commands.AddUserCommand;\r
+import gr.grnet.pithos.web.client.grouptree.Group;\r
\r
/**\r
* The 'Folder properties' dialog box implementation.\r
protected Pithos app;\r
\r
private Command callback;\r
- \r
- /**\r
- * The widget that holds the folderName of the folder.\r
- */\r
- TextBox groupName = new TextBox();\r
-\r
- final VerticalPanel inner;\r
-\r
- public GroupCreateDialog(final Pithos app) {\r
- this(app, null);\r
- }\r
- \r
- /**\r
- * The widget's constructor.\r
- */\r
- public GroupCreateDialog(final Pithos app, Command callback) {\r
+\r
+ /**\r
+ * The widget that holds the folderName of the folder.\r
+ */\r
+ TextBox groupNameTextBox = new TextBox();\r
+\r
+ final VerticalPanel inner;\r
+\r
+ public GroupCreateDialog(final Pithos app) {\r
+ this(app, null);\r
+ }\r
+\r
+ /**\r
+ * The widget's constructor.\r
+ */\r
+ public GroupCreateDialog(final Pithos app, Command callback) {\r
this.app = app;\r
this.callback = callback;\r
- \r
- Anchor close = new Anchor("close");\r
- close.addStyleName("close");\r
- close.addClickHandler(new ClickHandler() {\r
- \r
- @Override\r
- public void onClick(ClickEvent event) {\r
- hide();\r
- }\r
- });\r
-\r
- setGlassEnabled(true);\r
- setStyleName("pithos-DialogBox");\r
-\r
- // Enable IE selection for the dialog (must disable it upon closing it)\r
- Pithos.enableIESelection();\r
-\r
- // Use this opportunity to set the dialog's caption.\r
- setText("Create group");\r
-\r
- // Outer contains inner and buttons\r
- VerticalPanel outer = new VerticalPanel();\r
- outer.add(close);\r
- // Inner contains generalPanel and permPanel\r
- inner = new VerticalPanel();\r
- inner.addStyleName("inner");\r
-\r
- VerticalPanel generalPanel = new VerticalPanel();\r
+\r
+ Anchor close = new Anchor("close");\r
+ close.addStyleName("close");\r
+ close.addClickHandler(new ClickHandler() {\r
+\r
+ @Override\r
+ public void onClick(ClickEvent event) {\r
+ hide();\r
+ }\r
+ });\r
+\r
+ setGlassEnabled(true);\r
+ setStyleName("pithos-DialogBox");\r
+\r
+ // Enable IE selection for the dialog (must disable it upon closing it)\r
+ Pithos.enableIESelection();\r
+\r
+ // Use this opportunity to set the dialog's caption.\r
+ setText("Create group");\r
+\r
+ // Outer contains inner and buttons\r
+ VerticalPanel outer = new VerticalPanel();\r
+ outer.add(close);\r
+ // Inner contains generalPanel and permPanel\r
+ inner = new VerticalPanel();\r
+ inner.addStyleName("inner");\r
+\r
+ VerticalPanel generalPanel = new VerticalPanel();\r
FlexTable generalTable = new FlexTable();\r
generalTable.setText(0, 0, "Name");\r
\r
- generalTable.setWidget(0, 1, groupName);\r
+ generalTable.setWidget(0, 1, groupNameTextBox);\r
\r
generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");\r
\r
outer.add(inner);\r
\r
- // Create the 'Create/Update' button, along with a listener that hides the dialog\r
- // when the button is clicked and quits the application.\r
- String okLabel = "Create";\r
- final Button ok = new Button(okLabel, new ClickHandler() {\r
- @Override\r
- public void onClick(ClickEvent event) {\r
- createGroup();\r
- closeDialog();\r
- }\r
- });\r
- ok.addStyleName("button");\r
- outer.add(ok);\r
+ // Create the 'Create/Update' button, along with a listener that hides the dialog\r
+ // when the button is clicked and quits the application.\r
+ String okLabel = "Create";\r
+ final Button ok = new Button(okLabel, new ClickHandler() {\r
+ @Override\r
+ public void onClick(ClickEvent event) {\r
+ createGroup();\r
+ closeDialog();\r
+ }\r
+ });\r
+ ok.addStyleName("button");\r
+ outer.add(ok);\r
outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);\r
\r
setWidget(outer);\r
- }\r
-\r
- @Override\r
- public void center() {\r
- super.center();\r
- groupName.setFocus(true);\r
- }\r
-\r
- @Override\r
- protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
- super.onPreviewNativeEvent(preview);\r
-\r
- NativeEvent evt = preview.getNativeEvent();\r
- if (evt.getType().equals(KeyDownEvent.getType().getName()))\r
- // Use the popup's key preview hooks to close the dialog when either\r
- // enter or escape is pressed.\r
- switch (evt.getKeyCode()) {\r
- case KeyCodes.KEY_ENTER:\r
- createGroup();\r
+ }\r
+\r
+ @Override\r
+ public void center() {\r
+ super.center();\r
+ groupNameTextBox.setFocus(true);\r
+ }\r
+\r
+ @Override\r
+ protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
+ super.onPreviewNativeEvent(preview);\r
+\r
+ NativeEvent evt = preview.getNativeEvent();\r
+ if(evt.getType().equals(KeyDownEvent.getType().getName()))\r
+ // Use the popup's key preview hooks to close the dialog when either\r
+ // enter or escape is pressed.\r
+ {\r
+ switch(evt.getKeyCode()) {\r
+ case KeyCodes.KEY_ENTER:\r
+ createGroup();\r
+ closeDialog();\r
+ break;\r
+ case KeyCodes.KEY_ESCAPE:\r
closeDialog();\r
- break;\r
- case KeyCodes.KEY_ESCAPE:\r
- closeDialog();\r
- break;\r
- }\r
- }\r
-\r
-\r
- /**\r
- * Enables IE selection prevention and hides the dialog\r
- * (we disable the prevention on creation of the dialog)\r
- */\r
- public void closeDialog() {\r
- Pithos.preventIESelection();\r
- hide();\r
- if (callback != null)\r
- callback.execute();\r
- }\r
-\r
- /**\r
- * Generate an RPC request to create a new folder.\r
- */\r
- void createGroup() {\r
- String name = groupName.getText().trim();\r
- if (name.length() == 0)\r
- return;\r
- Group group = app.addGroup(name);\r
- \r
- new AddUserCommand(app, null, group).execute();\r
- }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ /**\r
+ * Enables IE selection prevention and hides the dialog\r
+ * (we disable the prevention on creation of the dialog)\r
+ */\r
+ public void closeDialog() {\r
+ Pithos.preventIESelection();\r
+ hide();\r
+ if(callback != null) {\r
+ callback.execute();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * Generate an RPC request to create a new folder.\r
+ */\r
+ void createGroup() {\r
+ final String groupName = groupNameTextBox.getText().trim();\r
+ if(groupName.length() == 0) {\r
+ return;\r
+ }\r
+ Group group = app.addGroup(groupName);\r
+\r
+ new AddUserCommand(app, null, group).execute();\r
+ }\r
}\r
*/
package gr.grnet.pithos.web.client;
-import com.google.gwt.http.client.Request;
-import com.google.gwt.http.client.Response;
-import com.google.gwt.json.client.JSONObject;
import gr.grnet.pithos.web.client.FilePermissionsDialog.Images;
import java.util.HashMap;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Anchor;
-import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
-import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.VerticalPanel;
-import gr.grnet.pithos.web.client.catalog.GetUserCatalogs;
import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
import gr.grnet.pithos.web.client.catalog.UserCatalogs;
new UpdateUserCatalogs(app, userID) {
@Override
public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
- final String displayName = updatedUserCatalogs.getDisplayName(userID);
+ final String displayName = updatedUserCatalogs.getUserDisplayName(userID);
permTable.setHTML(
ii,
0,
}
public String getCurrentUserDisplayNameOrID() {
- final String displayName = userCatalogs.getDisplayName(getUserID());
+ final String displayName = userCatalogs.getUserDisplayName(getUserID());
return displayName == null ? getUserID() : displayName;
}
public boolean hasUserDisplayNameForID(String userID) {
- return userCatalogs.getDisplayName(userID) != null;
+ return userCatalogs.getUserDisplayName(userID) != null;
+ }
+
+ public boolean hasUserIDForDisplayName(String displayName) {
+ return userCatalogs.getUserID(displayName) != null;
}
public String getUserDisplayNameForID(String userID) {
- return userCatalogs.getDisplayName(userID);
+ return userCatalogs.getUserDisplayName(userID);
}
public String getUserIDForDisplayName(String displayName) {
}
final List<String> filtered = new ArrayList<String>();
for(String userID : userIDs) {
- if(!this.userCatalogs.hasID(userID)) {
+ if(!this.userCatalogs.hasUserID(userID)) {
filtered.add(userID);
}
}
}
}-*/;
- public static void LOG(String ...args) {
+ public static void LOG(Object ...args) {
final StringBuilder sb = new StringBuilder();
- for(String arg : args) {
+ for(Object arg : args) {
sb.append(arg);
}
if(sb.length() > 0) {
return true;
}
- HeadRequest<Folder> head = new HeadRequest<Folder>(Folder.class, getApiPath(), f.getOwnerID(), "/" + f.getContainer()) {
+ HeadRequest<Folder> head = new HeadRequest<Folder>(Pithos.this, Folder.class, getApiPath(), f.getOwnerID(), "/" + f.getContainer()) {
@Override
public void onSuccess(Folder _result) {
}
public void fetchAccount(final Command callback) {
+ LOG("Pithos::fetchAccount(), callback = ", callback);
String path = "?format=json";
- GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, getApiPath(), userID, path) {
+ GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(this, AccountResource.class, getApiPath(), userID, path) {
@Override
public void onSuccess(AccountResource _result) {
account = _result;
}
public void updateStatistics() {
- HeadRequest<AccountResource> headAccount = new HeadRequest<AccountResource>(AccountResource.class, getApiPath(), userID, "", account) {
+ HeadRequest<AccountResource> headAccount = new HeadRequest<AccountResource>(this, AccountResource.class, getApiPath(), userID, "", account) {
@Override
public void onSuccess(AccountResource _result) {
protected void createHomeContainer(final AccountResource _account, final Command callback) {
String path = "/" + Const.HOME_CONTAINER;
- PutRequest createPithos = new PutRequest(getApiPath(), getUserID(), path) {
+ PutRequest createPithos = new PutRequest(this, getApiPath(), getUserID(), path) {
@Override
public void onSuccess(Resource result) {
if(!_account.hasTrashContainer()) {
protected void createTrashContainer(final Command callback) {
String path = "/" + Const.TRASH_CONTAINER;
- PutRequest createPithos = new PutRequest(getApiPath(), getUserID(), path) {
+ PutRequest createPithos = new PutRequest(this, getApiPath(), getUserID(), path) {
@Override
public void onSuccess(Resource result) {
fetchAccount(callback);
final PleaseWaitPopup pwp = new PleaseWaitPopup();
pwp.center();
String path = "/" + folder.getContainer() + "/" + folder.getPrefix() + "?delimiter=/" + "&t=" + System.currentTimeMillis();
- DeleteRequest deleteFolder = new DeleteRequest(getApiPath(), folder.getOwnerID(), path) {
+ DeleteRequest deleteFolder = new DeleteRequest(this, getApiPath(), folder.getOwnerID(), path) {
@Override
protected void onUnauthorized(Response response) {
if(iter.hasNext()) {
File file = iter.next();
String path = targetUri + "/" + file.getName();
- PutRequest copyFile = new PutRequest(getApiPath(), targetUsername, path) {
+ PutRequest copyFile = new PutRequest(this, getApiPath(), targetUsername, path) {
@Override
public void onSuccess(Resource result) {
copyFiles(iter, targetUsername, targetUri, callback);
public void copyFolder(final Folder f, final String targetUsername, final String targetUri, boolean move, final Command callback) {
String path = targetUri + "?delimiter=/";
- PutRequest copyFolder = new PutRequest(getApiPath(), targetUsername, path) {
+ PutRequest copyFolder = new PutRequest(this, getApiPath(), targetUsername, path) {
@Override
public void onSuccess(Resource result) {
if(callback != null) {
groupTreeView.updateGroupNode(null);
}
- public Group addGroup(String groupname) {
- Group newGroup = new Group(groupname);
- account.addGroup(newGroup);
+ public Group addGroup(String groupName) {
+ final Group group = new Group(groupName);
+ account.addGroup(group);
groupTreeView.updateGroupNode(null);
- return newGroup;
+ return group;
}
public void removeGroup(Group group) {
}
}
else {
- HeadRequest<Folder> headFolder = new HeadRequest<Folder>(Folder.class, getApiPath(), folder.getOwnerID(), folder.getUri(), folder) {
+ HeadRequest<Folder> headFolder = new HeadRequest<Folder>(this, Folder.class, getApiPath(), folder.getOwnerID(), folder.getUri(), folder) {
@Override
public void onSuccess(Folder _result) {
if(t instanceof RestException) {
if(((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) {
final String path = folder.getUri();
- PutRequest newFolder = new PutRequest(getApiPath(), folder.getOwnerID(), path) {
+ PutRequest newFolder = new PutRequest(Pithos.this, getApiPath(), folder.getOwnerID(), path) {
@Override
public void onSuccess(Resource _result) {
scheduleFolderHeadCommand(folder, callback);
}
public void scheduleFileHeadCommand(File f, final Command callback) {
- HeadRequest<File> headFile = new HeadRequest<File>(File.class, getApiPath(), f.getOwnerID(), f.getUri(), f) {
+ HeadRequest<File> headFile = new HeadRequest<File>(this, File.class, getApiPath(), f.getOwnerID(), f.getUri(), f) {
@Override
public void onSuccess(File _result) {
public void emptyContainer(final Folder container) {
String path = "/" + container.getName() + "?delimiter=/";
- DeleteRequest delete = new DeleteRequest(getApiPath(), getUserID(), path) {
+ DeleteRequest delete = new DeleteRequest(this, getApiPath(), getUserID(), path) {
@Override
protected void onUnauthorized(Response response) {
}-*/;
@SuppressWarnings("unchecked")
- public static <T> T createFromResponse(Class<T> aClass, String owner, Response response, T result) {
+ public static <T> T createFromResponse(Pithos app, Class<T> aClass, String owner, Response response, T result) {
T result1 = null;
if(aClass.equals(AccountResource.class)) {
- result1 = (T) AccountResource.createFromResponse(owner, response, (AccountResource) result);
+ result1 = (T) AccountResource.createFromResponse(app, owner, response, (AccountResource) result);
}
else if(aClass.equals(Folder.class)) {
result1 = (T) Folder.createFromResponse(owner, response, (Folder) result);
void restoreVersion(int version) {
String path = file.getUri() + "?update=";
- PostRequest restoreVersion = new PostRequest(app.getApiPath(), file.getOwnerID(), path) {
+ PostRequest restoreVersion = new PostRequest(app, app.getApiPath(), file.getOwnerID(), path) {
@Override
public void onSuccess(Resource result) {
public void scheduleDeferred() {
Scheduler.get().scheduleDeferred(this);
}
+
+ public void scheduleEntry() {
+ Scheduler.get().scheduleEntry(this);
+ }
}
);
}
- public boolean hasID(String id) {
+ public boolean hasUserID(String id) {
return id2name.containsKey(id);
}
- public boolean hasName(String name) {
- return name2id.containsKey(name);
+ public boolean hasUserDisplayName(String displayName) {
+ return name2id.containsKey(displayName);
}
- public String getDisplayName(String id) {
- return id2name.get(id);
+ public String getUserDisplayName(String userID) {
+ return id2name.get(userID);
}
- public String getUserID(String name) {
- return name2id.get(name);
+ public String getUserID(String displayName) {
+ return name2id.get(displayName);
}
@Override
*/
package gr.grnet.pithos.web.client.commands;
+import gr.grnet.pithos.web.client.Const;
import gr.grnet.pithos.web.client.Pithos;
import gr.grnet.pithos.web.client.Resource;
import gr.grnet.pithos.web.client.grouptree.Group;
containerPanel.hide();
if (Window.confirm("Are you sure you want to delete group " + group.getName())) {
String path = "?update=";
- PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {
+ PostRequest updateGroup = new PostRequest(app, app.getApiPath(), app.getUserID(), path) {
@Override
public void onSuccess(Resource result) {
app.sessionExpired();
}
};
- updateGroup.setHeader("X-Auth-Token", app.getUserToken());
- updateGroup.setHeader("X-Account-Group-" + URL.encodePathSegment(group.getName()), "~");
+ updateGroup.setHeader(Const.X_AUTH_TOKEN, app.getUserToken());
+ updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), "~");
Scheduler.get().scheduleDeferred(updateGroup);
}
}
if (iter.hasNext()) {
File file = iter.next();
String path = folder.getUri() + "/" + file.getName();
- PutRequest copyFile = new PutRequest(app.getApiPath(), folder.getOwnerID(), path) {
+ PutRequest copyFile = new PutRequest(app, app.getApiPath(), folder.getOwnerID(), path) {
@Override
public void onSuccess(Resource result) {
moveFiles(iter, callback);
*/
package gr.grnet.pithos.web.client.commands;
-import gr.grnet.pithos.web.client.Pithos;
-import gr.grnet.pithos.web.client.Resource;
-import gr.grnet.pithos.web.client.grouptree.Group;
-import gr.grnet.pithos.web.client.grouptree.User;
-import gr.grnet.pithos.web.client.rest.PostRequest;
-import gr.grnet.pithos.web.client.rest.RestException;
-
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.PopupPanel;
+import gr.grnet.pithos.web.client.Const;
+import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.Resource;
+import gr.grnet.pithos.web.client.grouptree.Group;
+import gr.grnet.pithos.web.client.grouptree.User;
+import gr.grnet.pithos.web.client.rest.PostRequest;
+import gr.grnet.pithos.web.client.rest.RestException;
/**
* Display the 'new folder' dialog for creating a new folder.
- *
*/
public class RemoveUserCommand implements Command {
- private PopupPanel containerPanel;
+ private PopupPanel containerPanel;
User user;
Pithos app;
- /**
- * @param aContainerPanel
- */
- public RemoveUserCommand(Pithos _app, PopupPanel aContainerPanel, User _user){
+ /**
+ * @param aContainerPanel
+ */
+ public RemoveUserCommand(Pithos _app, PopupPanel aContainerPanel, User _user) {
app = _app;
- containerPanel = aContainerPanel;
- user = _user;
- }
+ containerPanel = aContainerPanel;
+ user = _user;
+ }
+
+ @Override
+ public void execute() {
+ if(containerPanel != null) {
+ containerPanel.hide();
+ }
+ final String groupName = user.getGroup();
+ final Group group = app.getAccount().getGroup(groupName);
+ if(group == null) {
+ return;
+ }
+ group.removeUser(user);
+ String path = "?update=";
+ PostRequest updateGroup = new PostRequest(app, app.getApiPath(), app.getUserID(), path) {
+
+ @Override
+ public void onSuccess(Resource result) {
+ app.fetchAccount(new Command() {
+
+ @Override
+ public void execute() {
+ Group updatedGroup2 = app.getAccount().getGroup(groupName);
+ if(updatedGroup2 != null) {
+ app.updateGroupNode(updatedGroup2);
+ }
+ else {
+ app.updateGroupNode(null);
+ }
+ }
+ });
+ }
- @Override
- public void execute() {
- if (containerPanel != null)
- containerPanel.hide();
- final String groupName = user.getGroup();
- final Group group = app.getAccount().getGroup(groupName);
- if (group == null)
- return;
- group.removeMember(user.getName());
- String path = "?update=";
- PostRequest updateGroup = new PostRequest(app.getApiPath(), app.getUserID(), path) {
-
- @Override
- public void onSuccess(Resource result) {
- app.fetchAccount(new Command() {
-
- @Override
- public void execute() {
- Group updatedGroup2 = app.getAccount().getGroup(groupName);
- if (updatedGroup2 != null)
- app.updateGroupNode(updatedGroup2);
- else {
- app.updateGroupNode(null);
- }
- }
- });
- }
-
- @Override
- public void onError(Throwable t) {
- GWT.log("", t);
- app.setError(t);
- if (t instanceof RestException) {
- app.displayError("Unable to update group:" + ((RestException) t).getHttpStatusText());
- }
- else
- app.displayError("System error updating group:" + t.getMessage());
- }
+ @Override
+ public void onError(Throwable t) {
+ GWT.log("", t);
+ app.setError(t);
+ if(t instanceof RestException) {
+ app.displayError("Unable to update group:" + ((RestException) t).getHttpStatusText());
+ }
+ else {
+ app.displayError("System error updating group:" + t.getMessage());
+ }
+ }
- @Override
- protected void onUnauthorized(Response response) {
- app.sessionExpired();
- }
- };
- updateGroup.setHeader("X-Auth-Token", app.getUserToken());
- String groupMembers = "";
- if (!group.getMembers().isEmpty()) {
- for (String u : group.getMembers())
- groupMembers += (URL.encodePathSegment(u) + ",");
- }
- else
- groupMembers = "~";
- updateGroup.setHeader("X-Account-Group-" + URL.encodePathSegment(group.getName()), groupMembers);
- Scheduler.get().scheduleDeferred(updateGroup);
- }
+ @Override
+ protected void onUnauthorized(Response response) {
+ app.sessionExpired();
+ }
+ };
+ updateGroup.setHeader(Const.X_AUTH_TOKEN, app.getUserToken());
+ final String groupMembers;
+ if(!group.getUsers().isEmpty()) {
+ groupMembers = group.encodeUserIDsForXAccountGroup();
+ }
+ else {
+ groupMembers = "~";
+ }
+ updateGroup.setHeader(Const.X_ACCOUNT_GROUP_ + URL.encodePathSegment(group.getName()), groupMembers);
+ Scheduler.get().scheduleDeferred(updateGroup);
+ }
}
if (iter.hasNext()) {
File file = iter.next();
String path = "/" + Const.HOME_CONTAINER + "/" + file.getPath();
- PutRequest untrashFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {
+ PutRequest untrashFile = new PutRequest(app, app.getApiPath(), app.getUserID(), path) {
@Override
public void onSuccess(Resource result) {
untrashFiles(iter, callback);
if (iter.hasNext()) {
File file = iter.next();
String path = "/" + Const.TRASH_CONTAINER + "/" + file.getPath();
- PutRequest trashFile = new PutRequest(app.getApiPath(), app.getUserID(), path) {
+ PutRequest trashFile = new PutRequest(app, app.getApiPath(), app.getUserID(), path) {
@Override
public void onSuccess(Resource result) {
trashFiles(iter, callback);
package gr.grnet.pithos.web.client.foldertree;
-import gr.grnet.pithos.web.client.Const;
-import gr.grnet.pithos.web.client.Resource;
-import gr.grnet.pithos.web.client.grouptree.Group;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
import com.google.gwt.http.client.Header;
import com.google.gwt.http.client.Response;
import com.google.gwt.http.client.URL;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
+import gr.grnet.pithos.web.client.Const;
+import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.Resource;
+import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
+import gr.grnet.pithos.web.client.catalog.UserCatalogs;
+import gr.grnet.pithos.web.client.grouptree.Group;
+import gr.grnet.pithos.web.client.grouptree.User;
+
+import java.util.*;
/**
* Created by IntelliJ IDEA. User: chstath Date: 5/19/11 Time: 2:55 PM To change this template use File | Settings |
* File Templates.
*/
public class AccountResource extends Resource {
+ private final Pithos app;
private long numberOfContainers = 0;
private Date lastLogin = null;
private Date lastModified = null;
-
+
private List<Folder> containers = new ArrayList<Folder>();
private Date currentLogin = null;
private List<Group> groups = new ArrayList<Group>();
+ public AccountResource(Pithos app) {
+ this.app = app;
+ }
+
public long getQuota() {
return quota;
}
}
@Override
- public Date getLastModified() {
+ public Date getLastModified() {
return lastModified;
}
this.currentLogin = currentLogin;
}
+ private void doAddUsersByIDs(final List<String> userIDs, final String groupName) {
+ app.LOG("AccountResource::doAddUsersByIDs(), group = ", groupName);
+ final Group group = new Group(groupName);
+ for(String userID : userIDs) {
+ final String userDisplayName = app.getUserDisplayNameForID(userID);
+ final User user = new User(userID, userDisplayName, groupName);
+ group.addUser(user);
+ app.LOG("AccountResource::doAddUsersByIDs(), user = (", userID, ", ", userDisplayName, ")");
+
+ }
+ groups.add(group);
+
+ }
+
public void populate(String owner, Response response) {
DateTimeFormat df = DateTimeFormat.getFormat(PredefinedFormat.RFC_2822);
groups.clear();
- for (Header h : response.getHeaders()) {
- if (h != null) {
- String name = h.getName();
- if (name.startsWith("X-Account-Group-")) {
- String groupName = URL.decodePathSegment(name.substring("X-Account-Group-".length()));
- Group g = new Group(groupName);
- String[] members = h.getValue().split(",");
- for (String s : members)
- g.addMember(URL.decodePathSegment(s).trim());
- groups.add(g);
- }
- else if (name.equals("X-Account-Container-Count")) {
- numberOfContainers = Long.valueOf(h.getValue());
- }
- else if (name.equals("X-Account-Object-Count")) {
- numberOfObjects = Long.valueOf(h.getValue());
- }
- else if (name.equals("X-Account-Bytes-Used")) {
- bytesUsed = Long.valueOf(h.getValue());
- }
- else if (name.equals("X-Account-Policy-Quota")) {
- quota = Long.valueOf(h.getValue());
- }
- else if (name.equals("X-Account-Last-Login")) {
- lastLogin = df.parse(h.getValue());
- }
- else if (name.equals("Last-Modified")) {
- lastModified = df.parse(h.getValue());
- }
- }
+
+ final Map<String, List<String>> parsedGroups = new HashMap<String, List<String>>();
+
+ for(Header h : response.getHeaders()) {
+ if(h != null) {
+ String name = h.getName();
+ if(name.startsWith(Const.X_ACCOUNT_GROUP_)) {
+ final String groupName = URL.decodePathSegment(name.substring(Const.X_ACCOUNT_GROUP_.length()));
+ final String[] users = h.getValue().split(",");
+ final List<String> userIDs = new ArrayList<String>();
+ for(String user : users) {
+ final String userID = URL.decodePathSegment(user).trim();
+ userIDs.add(userID);
+ }
+ parsedGroups.put(groupName, userIDs);
+ }
+ else if(name.equals(Const.X_ACCOUNT_CONTAINER_COUNT)) {
+ numberOfContainers = Long.valueOf(h.getValue());
+ }
+ else if(name.equals(Const.X_ACCOUNT_OBJECT_COUNT)) {
+ numberOfObjects = Long.valueOf(h.getValue());
+ }
+ else if(name.equals(Const.X_ACCOUNT_BYTES_USED)) {
+ bytesUsed = Long.valueOf(h.getValue());
+ }
+ else if(name.equals(Const.X_ACCOUNT_POLICY_QUOTA)) {
+ quota = Long.valueOf(h.getValue());
+ }
+ else if(name.equals(Const.X_ACCOUNT_LAST_LOGIN)) {
+ lastLogin = df.parse(h.getValue());
+ }
+ else if(name.equals(Const.LAST_MODIFIED)) {
+ lastModified = df.parse(h.getValue());
+ }
+ }
+ }
+
+ // Gather all unknown users for the groups
+ final List<String> userIDsWithUnknownDisplayName = new ArrayList<String>();
+ for(Map.Entry<String, List<String>> parsedGroupEntry : parsedGroups.entrySet()) {
+ final List<String> groupUserIDs = parsedGroupEntry.getValue();
+ userIDsWithUnknownDisplayName.addAll(app.filterUserIDsWithUnknownDisplayName(groupUserIDs));
+ }
+ if(userIDsWithUnknownDisplayName.size() == 0) {
+ for(Map.Entry<String, List<String>> parsedGroupEntry : parsedGroups.entrySet()) {
+ final String groupName = parsedGroupEntry.getKey();
+ final List<String> groupUserIDs = parsedGroupEntry.getValue();
+ doAddUsersByIDs(groupUserIDs, groupName);
+ }
+ }
+ else {
+ new UpdateUserCatalogs(app, userIDsWithUnknownDisplayName) {
+ @Override
+ public void onSuccess(UserCatalogs requestedUserCatalogs, UserCatalogs updatedUserCatalogs) {
+ for(Map.Entry<String, List<String>> parsedGroupEntry : parsedGroups.entrySet()) {
+ final String groupName = parsedGroupEntry.getKey();
+ final List<String> groupUserIDs = parsedGroupEntry.getValue();
+ doAddUsersByIDs(groupUserIDs, groupName);
+ }
+ }
+ }.scheduleEntry();
}
- if (response.getText() != null && response.getText().length() > 0) {
- containers.clear();
- JSONValue json = JSONParser.parseStrict(response.getText());
- JSONArray array = json.isArray();
- if (array != null) {
- for (int i=0; i<array.size(); i++) {
- JSONObject o = array.get(i).isObject();
- if (o != null) {
- Folder f = new Folder();
- f.populate(null, o, owner, null);
- containers.add(f);
- }
- }
- }
+ if(response.getText() != null && response.getText().length() > 0) {
+ containers.clear();
+ JSONValue json = JSONParser.parseStrict(response.getText());
+ JSONArray array = json.isArray();
+ if(array != null) {
+ for(int i = 0; i < array.size(); i++) {
+ JSONObject o = array.get(i).isObject();
+ if(o != null) {
+ Folder f = new Folder();
+ f.populate(null, o, owner, null);
+ containers.add(f);
+ }
+ }
+ }
}
}
- public static AccountResource createFromResponse(String owner, Response response, AccountResource result) {
- AccountResource a;
- if (result == null)
- a = new AccountResource();
- else
- a = result;
+ public static AccountResource createFromResponse(Pithos app, String owner, Response response, AccountResource result) {
+ AccountResource a;
+ if(result == null) {
+ a = new AccountResource(app);
+ }
+ else {
+ a = result;
+ }
a.populate(owner, response);
return a;
}
- private String getSize(Long size, Double division){
- Double res = Double.valueOf(size.toString())/division;
- NumberFormat nf = NumberFormat.getFormat("######.#");
+ private String getSize(Long size, Double division) {
+ Double res = Double.valueOf(size.toString()) / division;
+ NumberFormat nf = NumberFormat.getFormat(Const.NUMBER_FORMAT_1);
return nf.format(res);
}
public String getFileSizeAsString() {
- if (bytesUsed < 1024)
+ if(bytesUsed < 1024) {
return String.valueOf(bytesUsed) + "B";
- else if (bytesUsed < 1024*1024)
+ }
+ else if(bytesUsed < 1024 * 1024) {
return getSize(bytesUsed, 1024D) + "KB";
- else if (bytesUsed < 1024*1024*1024)
- return getSize(bytesUsed,(1024D*1024D)) + "MB";
- return getSize(bytesUsed , (1024D*1024D*1024D)) + "GB";
+ }
+ else if(bytesUsed < 1024 * 1024 * 1024) {
+ return getSize(bytesUsed, (1024D * 1024D)) + "MB";
+ }
+ return getSize(bytesUsed, (1024D * 1024D * 1024D)) + "GB";
}
public String getQuotaAsString() {
- if (quota < 1024)
+ if(quota < 1024) {
return String.valueOf(quota) + "B";
- else if (quota < 1024 * 1024)
+ }
+ else if(quota < 1024 * 1024) {
return getSize(quota, 1024D) + "KB";
- else if (quota < 1024 * 1024 * 1024)
- return getSize(quota,(1024D * 1024D)) + "MB";
- return getSize(quota , (1024D * 1024D * 1024D)) + "GB";
+ }
+ else if(quota < 1024 * 1024 * 1024) {
+ return getSize(quota, (1024D * 1024D)) + "MB";
+ }
+ return getSize(quota, (1024D * 1024D * 1024D)) + "GB";
}
public List<Group> getGroups() {
return groups;
}
-
+
public boolean hasHomeContainer() {
- for (Folder f : containers)
- if (f.getName().equals(Const.HOME_CONTAINER))
- return true;
- return false;
+ for(Folder f : containers) {
+ if(f.getName().equals(Const.HOME_CONTAINER)) {
+ return true;
+ }
+ }
+ return false;
}
public boolean hasTrashContainer() {
- for (Folder f : containers)
- if (f.getName().equals(Const.TRASH_CONTAINER))
- return true;
- return false;
+ for(Folder f : containers) {
+ if(f.getName().equals(Const.TRASH_CONTAINER)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void addGroup(Group group) {
+ groups.add(group);
+ }
+
+ public void removeGroup(Group group) {
+ groups.remove(group);
}
- public void addGroup(Group newGroup) {
- groups.add(newGroup);
- }
-
- public void removeGroup(Group group) {
- groups.remove(group);
- }
-
- public Folder getTrash() {
- for (Folder c : containers) {
- if (c.getName().equals(Const.TRASH_CONTAINER))
- return c;
- }
- return null;
- }
-
- public double getUsedPercentage() {
- if (quota == 0)
- return 0;
- return ((double) bytesUsed) / quota;
- }
-
- public Folder getPithos() {
- for (Folder f : containers)
- if (f.getName().equals(Const.HOME_CONTAINER))
- return f;
- return null;
- }
-
- public Group getGroup(String groupName) {
- for (Group g : groups)
- if (g.getName().equalsIgnoreCase(groupName))
- return g;
- return null;
- }
+ public Folder getTrash() {
+ for(Folder c : containers) {
+ if(c.getName().equals(Const.TRASH_CONTAINER)) {
+ return c;
+ }
+ }
+ return null;
+ }
+
+ public double getUsedPercentage() {
+ if(quota == 0) {
+ return 0;
+ }
+ return ((double) bytesUsed) / quota;
+ }
+
+ public Folder getPithos() {
+ for(Folder f : containers) {
+ if(f.getName().equals(Const.HOME_CONTAINER)) {
+ return f;
+ }
+ }
+ return null;
+ }
+
+ public Group getGroup(String groupName) {
+ for(Group g : groups) {
+ if(g.getName().equalsIgnoreCase(groupName)) {
+ return g;
+ }
+ }
+ return null;
+ }
}
final Folder f = iter.next();
String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
@Override
public void onSuccess(Folder _result) {
fetchFolder(iter, callback);
public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles, final Command callback) {
String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
@Override
public void onSuccess(final Folder _result) {
if (showfiles)
package gr.grnet.pithos.web.client.grouptree;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
-public class Group {
- private String name;
+public final class Group {
+ private final String name;
- private List<String> members = new ArrayList<String>();
+ private final List<User> users = new ArrayList<User>();
- public Group(String _name) {
- name = _name;
+ public Group(String name) {
+ this.name = name;
}
- public List<String> getMembers() {
- return members;
+ public List<User> getUsers() {
+ return Collections.unmodifiableList(users);
}
public String getName() {
return name;
}
- public void addMember(String user) {
- members.add(user);
+ public void addUser(User user) {
+ this.users.add(user);
}
- public void removeMember(String username) {
- members.remove(username);
+ public void removeUser(User user) {
+ this.users.remove(user);
}
+
+ public String encodeUserIDsForXAccountGroup() {
+ final StringBuilder sb = new StringBuilder();
+ for(int i=0; i<users.size(); i++) {
+ final User user = users.get(i);
+ sb.append(user.getUserID());
+ if(i < users.size() - 1) {
+ sb.append(",");
+ }
+ }
+
+ return sb.toString();
+ }
+
+ @Override
+ public String toString() {
+ return "Group(" + name + ", " + users.size()+ " users)";
+ }
+
}
package gr.grnet.pithos.web.client.grouptree;
-import gr.grnet.pithos.web.client.Pithos;
-import gr.grnet.pithos.web.client.commands.CreateGroupCommand;
-import gr.grnet.pithos.web.client.foldertree.File;
-import gr.grnet.pithos.web.client.grouptree.GroupTreeView.Templates;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.Cell;
import com.google.gwt.event.dom.client.ContextMenuEvent;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.TreeViewModel;
+import gr.grnet.pithos.web.client.Pithos;
+import gr.grnet.pithos.web.client.commands.CreateGroupCommand;
+import gr.grnet.pithos.web.client.foldertree.File;
+import gr.grnet.pithos.web.client.grouptree.GroupTreeView.Templates;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
public class GroupTreeViewModel implements TreeViewModel {
+ final Group CreateGroupPlaceholder = new Group("Create new group...");
protected Pithos app;
- private Cell<Group> groupCell = new AbstractCell<Group>(ContextMenuEvent.getType().getName()) {
+ private Cell<Group> groupCell = new AbstractCell<Group>(ContextMenuEvent.getType().getName()) {
- @Override
- public void render(Context context, Group value, SafeHtmlBuilder sb) {
+ @Override
+ public void render(Context context, Group group, SafeHtmlBuilder sb) {
String html = AbstractImagePrototype.create(GroupTreeView.images.group()).getHTML();
sb.appendHtmlConstant(html).appendHtmlConstant(" ");
- sb.append(Templates.INSTANCE.nameSpan(value.getName()));
- }
-
+ sb.append(Templates.INSTANCE.nameSpan(group.getName()));
+ }
+
@Override
public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, Group group, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<Group> valueUpdater) {
- if (!group.equals(createGroup)) {
- GroupTreeViewModel.this.groupSelectionModel.setSelected(group, true);
- if (event.getType().equals(ContextMenuEvent.getType().getName())) {
- GroupContextMenu menu = new GroupContextMenu(app, GroupTreeView.images, group);
- menu.setPopupPosition(event.getClientX(), event.getClientY());
- menu.show();
- }
- }
+ if(!group.equals(CreateGroupPlaceholder)) {
+ GroupTreeViewModel.this.groupSelectionModel.setSelected(group, true);
+ if(event.getType().equals(ContextMenuEvent.getType().getName())) {
+ GroupContextMenu menu = new GroupContextMenu(app, GroupTreeView.images, group);
+ menu.setPopupPosition(event.getClientX(), event.getClientY());
+ menu.show();
+ }
+ }
}
- };
+ };
private Cell<User> userCell = new AbstractCell<User>(ContextMenuEvent.getType().getName()) {
- @Override
- public void render(Context context, User value, SafeHtmlBuilder sb) {
+ @Override
+ public void render(Context context, User user, final SafeHtmlBuilder sb) {
String html = AbstractImagePrototype.create(GroupTreeView.images.user()).getHTML();
sb.appendHtmlConstant(html).appendHtmlConstant(" ");
- sb.append(Templates.INSTANCE.nameSpan(value.getName()));
- }
+ final String userDisplayName = user.getUserDisplayName();
+ sb.append(Templates.INSTANCE.nameSpan(userDisplayName));
+ }
@Override
public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, User user, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<User> valueUpdater) {
GroupTreeViewModel.this.userSelectionModel.setSelected(user, true);
- if (event.getType().equals(ContextMenuEvent.getType().getName())) {
+ if(event.getType().equals(ContextMenuEvent.getType().getName())) {
UserContextMenu menu = new UserContextMenu(app, GroupTreeView.images, user);
menu.setPopupPosition(event.getClientX(), event.getClientY());
menu.show();
protected ListDataProvider<Group> groupsDataProvider = new ListDataProvider<Group>();
protected Map<Group, ListDataProvider<User>> userDataProviderMap = new HashMap<Group, ListDataProvider<User>>();
-
+
SingleSelectionModel<Group> groupSelectionModel;
SingleSelectionModel<User> userSelectionModel;
-
- final Group createGroup = new Group("Create new group...");
public GroupTreeViewModel(Pithos _app) {
app = _app;
- groupSelectionModel = new SingleSelectionModel<Group>();
- app.addSelectionModel(groupSelectionModel);
- groupSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-
- @Override
- public void onSelectionChange(SelectionChangeEvent event) {
- Group selected = groupSelectionModel.getSelectedObject();
- if (selected != null) {
- app.deselectOthers(app.getGroupTreeView(), groupSelectionModel);
- app.showFiles(new HashSet<File>());
- app.disableUploadArea();
- app.upload.setEnabled(false);
- app.showRelevantToolbarButtons();
- if (selected.equals(createGroup)) {
- new CreateGroupCommand(app, null).execute();
- groupSelectionModel.setSelected(createGroup, false);
- }
- }
- else {
- if (app.getSelectedTree().equals(app.getGroupTreeView()))
- app.setSelectedTree(null);
- if (app.getSelectedTree() == null)
- app.showRelevantToolbarButtons();
- }
- }
- });
-
- userSelectionModel = new SingleSelectionModel<User>();
- app.addSelectionModel(userSelectionModel);
- userSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
-
- @Override
- public void onSelectionChange(SelectionChangeEvent event) {
- if (userSelectionModel.getSelectedObject() != null) {
- app.deselectOthers(app.getGroupTreeView(), userSelectionModel);
- app.showFiles(new HashSet<File>());
- app.showRelevantToolbarButtons();
- }
- else {
- if (app.getSelectedTree().equals(app.getGroupTreeView()))
- app.setSelectedTree(null);
- if (app.getSelectedTree() == null)
- app.showRelevantToolbarButtons();
- }
- }
- });
-}
+ groupSelectionModel = new SingleSelectionModel<Group>();
+ app.addSelectionModel(groupSelectionModel);
+ groupSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
+
+ @Override
+ public void onSelectionChange(SelectionChangeEvent event) {
+ Group selected = groupSelectionModel.getSelectedObject();
+ if(selected != null) {
+ app.deselectOthers(app.getGroupTreeView(), groupSelectionModel);
+ app.showFiles(new HashSet<File>());
+ app.disableUploadArea();
+ app.upload.setEnabled(false);
+ app.showRelevantToolbarButtons();
+ if(selected.equals(CreateGroupPlaceholder)) {
+ new CreateGroupCommand(app, null).execute();
+ groupSelectionModel.setSelected(CreateGroupPlaceholder, false);
+ }
+ }
+ else {
+ if(app.getSelectedTree().equals(app.getGroupTreeView())) {
+ app.setSelectedTree(null);
+ }
+ if(app.getSelectedTree() == null) {
+ app.showRelevantToolbarButtons();
+ }
+ }
+ }
+ });
+
+ userSelectionModel = new SingleSelectionModel<User>();
+ app.addSelectionModel(userSelectionModel);
+ userSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
+
+ @Override
+ public void onSelectionChange(SelectionChangeEvent event) {
+ if(userSelectionModel.getSelectedObject() != null) {
+ app.deselectOthers(app.getGroupTreeView(), userSelectionModel);
+ app.showFiles(new HashSet<File>());
+ app.showRelevantToolbarButtons();
+ }
+ else {
+ if(app.getSelectedTree().equals(app.getGroupTreeView())) {
+ app.setSelectedTree(null);
+ }
+ if(app.getSelectedTree() == null) {
+ app.showRelevantToolbarButtons();
+ }
+ }
+ }
+ });
+ }
@Override
public <T> NodeInfo<?> getNodeInfo(T value) {
- if (value == null) {
- groupsDataProvider.getList().clear();
- groupsDataProvider.getList().addAll(app.getAccount().getGroups());
- groupsDataProvider.getList().add(createGroup);
+ app.LOG("GroupTreeViewModel::getNodeInfo(), value = ", value);
+ if(value == null) {
+ groupsDataProvider.getList().clear();
+ groupsDataProvider.getList().addAll(app.getAccount().getGroups());
+ groupsDataProvider.getList().add(CreateGroupPlaceholder);
return new DefaultNodeInfo<Group>(groupsDataProvider, groupCell, groupSelectionModel, null);
}
- Group g = (Group) value;
- if (userDataProviderMap.get(g) == null) {
- userDataProviderMap.put(g, new ListDataProvider<User>());
- }
- final ListDataProvider<User> dataProvider = userDataProviderMap.get(g);
- dataProvider.getList().clear();
- for (String u : g.getMembers())
- dataProvider.getList().add(new User(u, g.getName()));
- return new DefaultNodeInfo<User>(dataProvider, userCell, userSelectionModel, null);
+ final Group group = (Group) value;
+ if(userDataProviderMap.get(group) == null) {
+ userDataProviderMap.put(group, new ListDataProvider<User>());
+ }
+ final ListDataProvider<User> dataProvider = userDataProviderMap.get(group);
+ dataProvider.getList().clear();
+ final List<User> users = group.getUsers();
+ for(User user : users) {
+ app.LOG("GroupTreeViewModel::getNodeInfo(), Add ", user);
+ dataProvider.getList().add(user);
+ }
+
+
+ return new DefaultNodeInfo<User>(dataProvider, userCell, userSelectionModel, null);
}
- @Override
+ @Override
public boolean isLeaf(Object o) {
- if (o instanceof User) {
- return true;
+ if(o instanceof User) {
+ return true;
+ }
+ else if(o instanceof Group) {
+ return ((Group) o).getUsers().isEmpty();
}
- else if (o instanceof Group)
- return ((Group) o).getMembers().isEmpty();
return false;
}
-
- public void updateGroupNode(Group group) {
- if (group == null) {
- groupsDataProvider.getList().clear();
- groupsDataProvider.getList().addAll(app.getAccount().getGroups());
- groupsDataProvider.getList().add(createGroup);
- }
- else {
- if (userDataProviderMap.get(group) == null) {
- userDataProviderMap.put(group, new ListDataProvider<User>());
- }
- final ListDataProvider<User> dataProvider = userDataProviderMap.get(group);
- dataProvider.getList().clear();
- for (String u : group.getMembers())
- dataProvider.getList().add(new User(u, group.getName()));
- }
- }
-
- public Object getSelectedObject() {
- if (groupSelectionModel.getSelectedObject() != null)
- return groupSelectionModel.getSelectedObject();
- if (userSelectionModel.getSelectedObject() != null)
- return userSelectionModel.getSelectedObject();
- return null;
- }
+
+ public void updateGroupNode(Group group) {
+ if(group == null) {
+ groupsDataProvider.getList().clear();
+ groupsDataProvider.getList().addAll(app.getAccount().getGroups());
+ groupsDataProvider.getList().add(CreateGroupPlaceholder);
+ }
+ else {
+ if(userDataProviderMap.get(group) == null) {
+ userDataProviderMap.put(group, new ListDataProvider<User>());
+ }
+ final ListDataProvider<User> dataProvider = userDataProviderMap.get(group);
+ dataProvider.getList().clear();
+ for(User user : group.getUsers()) {
+ app.LOG("GroupTreeViewModel::updateGroupNode(), group = ", group, ". Add ", user);
+ dataProvider.getList().add(user);
+ }
+ }
+ }
+
+ public Object getSelectedObject() {
+ if(groupSelectionModel.getSelectedObject() != null) {
+ return groupSelectionModel.getSelectedObject();
+ }
+ if(userSelectionModel.getSelectedObject() != null) {
+ return userSelectionModel.getSelectedObject();
+ }
+ return null;
+ }
}
package gr.grnet.pithos.web.client.grouptree;
-public class User {
- private String name;
-
- private String group;
-
- public User(String _name, String _group) {
- name = _name;
- group = _group;
+public final class User {
+ private final String userID;
+ private final String userDisplayName;
+ private final String group;
+
+ public User(String userID, String userDisplayName, String group) {
+ this.userID = userID;
+ this.userDisplayName = userDisplayName;
+ this.group = group;
+ }
+
+ public String getUserID() {
+ return userID;
}
- public String getName() {
- return name;
+ public String getUserDisplayName() {
+ return userDisplayName;
}
- public String getGroup() {
+ public String getGroup() {
return group;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if(this == o) {
+ return true;
+ }
+ if(o == null || getClass() != o.getClass()) {
+ return false;
+ }
+
+ User user = (User) o;
+
+ if(group != null ? !group.equals(user.group) : user.group != null) {
+ return false;
+ }
+ if(userID != null ? !userID.equals(user.userID) : user.userID != null) {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = userID != null ? userID.hashCode() : 0;
+ result = 31 * result + (group != null ? group.hashCode() : 0);
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "User(" + userID + ", " + userDisplayName + ", " + group + ")";
+ }
}
private void fetchSharedContainers(final Command callback) {
String path = "?format=json&shared=&public=";
- GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), app.getUserID(), path) {
+ GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(app, AccountResource.class, app.getApiPath(), app.getUserID(), path) {
@Override
public void onSuccess(final AccountResource _result) {
firstLevelDataProvider.getList().clear();
final Folder f = iter.next();
String path = "/" + f.getContainer() + "?format=json&shared=&public=&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
@Override
public void onSuccess(Folder _result) {
fetchFolder(iter, callback);
public void fetchFolder(final Folder f, final boolean showfiles, final Command callback) {
String path = "/" + f.getContainer() + "?format=json&shared=&public=" + URL.encodeQueryString(f.getPrefix());
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
@Override
public void onSuccess(final Folder _result) {
for (File file : _result.getFiles()) {
// }-*/;
private void fetchSharingUsers(final Command callback) {
- GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(SharingUsers.class, app.getApiPath(), "", "?format=json") {
+ GetRequest<SharingUsers> getSharingUsers = new GetRequest<SharingUsers>(app, SharingUsers.class, app.getApiPath(), "", "?format=json") {
@Override
public void onSuccess(final SharingUsers _result) {
userLevelDataProviderForIDs.getList().clear();
}
private void fetchSharedContainers(final String userID, final ListDataProvider<Folder> dataProvider, final Command callback) {
- GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(AccountResource.class, app.getApiPath(), userID, "?format=json") {
+ GetRequest<AccountResource> getUserSharedContainers = new GetRequest<AccountResource>(app, AccountResource.class, app.getApiPath(), userID, "?format=json") {
@Override
public void onSuccess(AccountResource _result) {
final Folder f = folderIterator.next();
String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), userID, path, f) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), userID, path, f) {
@Override
public void onSuccess(Folder _result) {
dataProvider.getList().add(_result);
public void fetchFolder(final Folder f, final ListDataProvider<Folder> dataProvider, final boolean showfiles, final Command callback) {
String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix());
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), f.getOwnerID(), path, f) {
@Override
public void onSuccess(final Folder _result) {
if(showfiles) {
package gr.grnet.pithos.web.client.rest;
+import gr.grnet.pithos.web.client.Pithos;
import gr.grnet.pithos.web.client.Resource;
import java.util.HashMap;
protected static final int MAX_RETRIES = 3;
+ private final Pithos app;
+
protected int retries = 0;
private String api;
public abstract void onError(Throwable t);
- public DeleteRequest(String api, String owner, String path) {
+ public DeleteRequest(Pithos app, String api, String owner, String path) {
+ this.app = app;
this.api = api;
this.owner = owner;
this.path = path;
@Override
public Resource deserialize(Response response) {
- return Resource.createFromResponse(Resource.class, owner, response, null);
+ return Resource.createFromResponse(app, Resource.class, owner, response, null);
}
@Override
package gr.grnet.pithos.web.client.rest;
+import gr.grnet.pithos.web.client.Pithos;
import gr.grnet.pithos.web.client.Resource;
import java.util.HashMap;
protected static final int MAX_RETRIES = 3;
- protected int retries = 0;
+ protected int retries = 0;
+
+ private final Pithos app;
protected Class<T> resourceClass;
public abstract void onError(Throwable t);
- public GetRequest(Class<T> resourceClass, String api, String owner, String path, int okCode, T result) {
+ public GetRequest(Pithos app, Class<T> resourceClass, String api, String owner, String path, int okCode, T result) {
+ this.app = app;
this.resourceClass = resourceClass;
this.api = api;
this.owner = owner;
this.result = result;
}
- public GetRequest(Class<T> resourceClass, String api, String owner, String path) {
- this(resourceClass, api, owner, path, -1, null);
+ public GetRequest(Pithos app, Class<T> resourceClass, String api, String owner, String path) {
+ this(app, resourceClass, api, owner, path, -1, null);
}
- public GetRequest(Class<T> resourceClass, String api, String owner, String path, T result) {
- this(resourceClass, api, owner, path, -1, result);
+ public GetRequest(Pithos app, Class<T> resourceClass, String api, String owner, String path, T result) {
+ this(app, resourceClass, api, owner, path, -1, result);
}
@Override
@Override
public T deserialize(Response response) {
- return Resource.createFromResponse(resourceClass, owner, response, result);
+ return Resource.createFromResponse(app, resourceClass, owner, response, result);
}
@Override
package gr.grnet.pithos.web.client.rest;
+import gr.grnet.pithos.web.client.Pithos;
import gr.grnet.pithos.web.client.Resource;
import java.util.HashMap;
protected static final int MAX_RETRIES = 3;
+ private final Pithos app;
+
protected int retries = 0;
protected Class<T> aClass;
public abstract void onError(Throwable t);
- public HeadRequest(Class<T> aClass, String api, String owner, String path, int okCode, T result) {
+ public HeadRequest(Pithos app, Class<T> aClass, String api, String owner, String path, int okCode, T result) {
+ this.app = app;
this.aClass = aClass;
this.api = api;
this.owner = owner;
this.result = result;
}
- public HeadRequest(Class<T> aClass, String api, String owner, String path) {
- this(aClass, api, owner, path, Response.SC_NO_CONTENT, null);
+ public HeadRequest(Pithos app, Class<T> aClass, String api, String owner, String path) {
+ this(app, aClass, api, owner, path, Response.SC_NO_CONTENT, null);
}
- public HeadRequest(Class<T> aClass, String api, String owner, String path, T result) {
- this(aClass, api, owner, path, Response.SC_NO_CONTENT, result);
+ public HeadRequest(Pithos app, Class<T> aClass, String api, String owner, String path, T result) {
+ this(app, aClass, api, owner, path, Response.SC_NO_CONTENT, result);
}
@Override
@Override
public T deserialize(Response response) {
- return Resource.createFromResponse(aClass, owner, response, result);
+ return Resource.createFromResponse(app, aClass, owner, response, result);
}
@Override
package gr.grnet.pithos.web.client.rest;
+import gr.grnet.pithos.web.client.Pithos;
import gr.grnet.pithos.web.client.Resource;
import java.util.HashMap;
public abstract class PostRequest implements ScheduledCommand {
+ private final Pithos app;
+
private String api;
protected String owner;
public abstract void onError(Throwable t);
- public PostRequest(String api, String owner, String path) {
+ public PostRequest(Pithos app, String api, String owner, String path) {
+ this.app = app;
this.api = api;
this.owner = owner;
this.path = path;
}
- public PostRequest(String api, String owner, String path, String data) {
+ public PostRequest(Pithos app, String api, String owner, String path, String data) {
+ this.app = app;
this.api = api;
this.owner = owner;
this.path = path;
@Override
public Resource deserialize(Response response) {
- return Resource.createFromResponse(Resource.class, owner, response, null);
+ return Resource.createFromResponse(app, Resource.class, owner, response, null);
}
@Override
package gr.grnet.pithos.web.client.rest;
+import gr.grnet.pithos.web.client.Pithos;
import gr.grnet.pithos.web.client.Resource;
import java.util.HashMap;
public abstract class PutRequest implements ScheduledCommand {
+ private final Pithos app;
+
private String api;
protected String owner;
public abstract void onError(Throwable t);
- public PutRequest(String api, String owner, String path) {
+ public PutRequest(Pithos app, String api, String owner, String path) {
+ this.app = app;
this.api = api;
this.owner = owner;
this.path = path;
@Override
public Resource deserialize(Response response) {
- return Resource.createFromResponse(Resource.class, owner, response, null);
+ return Resource.createFromResponse(app, Resource.class, owner, response, null);
}
@Override
if (iter.hasNext()) {
Folder f = iter.next();
String path = f.getUri() + "?format=json&meta=" + t.getName();
- GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, app.getApiPath(), app.getUserID(), path) {
+ GetRequest<Folder> getFolder = new GetRequest<Folder>(app, Folder.class, app.getApiPath(), app.getUserID(), path) {
@Override
public void onSuccess(Folder _result) {
files.addAll(_result.getFiles());