Author: vjrj Date: 2008-09-18 02:45:41 +0200 (Thu, 18 Sep 2008) New Revision: 872 Added: trunk/img/nav-icons/gallery_add.png trunk/img/nav-icons/room.png trunk/img/nav-icons/room_add.png trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/gallery_add.png trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/room.png trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/room_add.png trunk/src/main/java/org/ourproject/kune/platf/server/auth/ActionLevel.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorToolbar.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbar.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbarView.java Removed: trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessType.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizated.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizatedMethodInterceptor.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizated.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizatedMethodInterceptor.java Modified: trunk/img/nav-icons/upload.png trunk/pom.xml trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineXmpp.java trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java trunk/src/main/java/org/ourproject/kune/docs/client/ctx/admin/AdminContextPresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/dto/GroupDTO.java trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentService.java trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentServiceAsync.java trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupService.java trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupServiceAsync.java trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkService.java trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkServiceAsync.java trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java trunk/src/main/java/org/ourproject/kune/platf/client/state/ContentProviderDefault.java trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/FileUploaderDialog.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rate/RateItPresenter.java trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/upload.gif trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/upload.png trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java trunk/src/main/java/org/ourproject/kune/platf/server/access/Access.java trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessService.java trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessServiceDefault.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/Authorizated.java trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/GroupManager.java trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/GroupManagerDefault.java trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java trunk/src/main/java/org/ourproject/kune/platf/server/rpc/SocialNetworkRPC.java trunk/src/main/java/org/ourproject/kune/platf/server/state/StateServiceDefault.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigator.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPanel.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorView.java trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/GroupMembersSummaryPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/SocialNetworkPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentCommentServiceTest.java trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceAddTest.java trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceGetTest.java trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceIntegrationTest.java trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceSaveTest.java trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceVariousTest.java trunk/src/test/java/org/ourproject/kune/platf/integration/socialnet/SocialNetworkServiceTest.java trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthenticatedMethodInterceptorTest.java trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptorTest.java Log: Complete - task 38: Auth*MethodInterceptors Tests and refactorization (now userhash + StateToken are checked with annotations in services) Incomplete - task 45: setContext/Content Incomplete - task 54: ContextNav refactorization (less bussiness logic in view) and tests Added: trunk/img/nav-icons/gallery_add.png =================================================================== (Binary files differ) Property changes on: trunk/img/nav-icons/gallery_add.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/img/nav-icons/room.png =================================================================== (Binary files differ) Property changes on: trunk/img/nav-icons/room.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/img/nav-icons/room_add.png =================================================================== (Binary files differ) Property changes on: trunk/img/nav-icons/room_add.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/img/nav-icons/upload.png =================================================================== (Binary files differ) Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/pom.xml 2008-09-18 00:45:41 UTC (rev 872) @@ -326,7 +326,7 @@ <plugin> <groupId>com.totsp.gwt</groupId> <artifactId>maven-googlewebtoolkit2-plugin</artifactId> - <version>2.0-beta14</version> + <version>2.0-beta23</version> <configuration> <logLevel>INFO</logLevel> <style>PRETTY</style> Modified: trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineXmpp.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineXmpp.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineXmpp.java 2008-09-18 00:45:41 UTC (rev 872) @@ -76,8 +76,14 @@ }; final String initialWindowTitle = Window.getTitle(); chatOptions.userOptions = userChatOptions; - emiteDialog.start(userChatOptions, chatOptions.httpBase, chatOptions.roomHost, initialWindowTitle, - avatarProvider, i18n.t("Chat")); + if (emiteDialog.isDialogNotStarted()) { + emiteDialog.start(userChatOptions, chatOptions.httpBase, chatOptions.roomHost, initialWindowTitle, + avatarProvider, i18n.t("Chat")); + } else { + emiteDialog.setEnableStatusUI(true); + emiteDialog.refreshUserInfo(chatOptions.userOptions); + + } emiteDialog.show(OwnStatus.online); if (traybarButton == null) { traybarButton = new ToolbarButton(); @@ -106,7 +112,6 @@ } }); } - emiteDialog.setEnableStatusUI(true); emiteDialog.hide(); emiteDialog.onChatAttended(new Slot<String>() { public void onEvent(final String parameter) { Modified: trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/docs/client/DocumentClientTool.java 2008-09-18 00:45:41 UTC (rev 872) @@ -28,6 +28,7 @@ import org.ourproject.kune.platf.client.actions.ActionMenuDescriptor; import org.ourproject.kune.platf.client.actions.ActionPosition; import org.ourproject.kune.platf.client.dto.AccessRolDTO; +import org.ourproject.kune.platf.client.dto.ContentDTO; import org.ourproject.kune.platf.client.dto.InitDataDTO; import org.ourproject.kune.platf.client.dto.StateDTO; import org.ourproject.kune.platf.client.dto.StateToken; @@ -44,6 +45,7 @@ import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; import org.ourproject.kune.workspace.client.themes.WsThemePresenter; +import com.allen_sauer.gwt.log.client.Log; import com.calclab.suco.client.provider.Provider; import com.calclab.suco.client.signal.Slot; @@ -102,23 +104,21 @@ private void createActions() { final ActionMenuDescriptor<StateToken> addFolder = createFolderAction(TYPE_FOLDER, "images/nav/folder_add.png", i18n.t("New folder"), i18n.t("File"), i18n.t("New")); - final ActionMenuDescriptor<StateToken> addGallery = createFolderAction(TYPE_GALLERY, "images/nav/gallery.png", - i18n.t("New gallery"), i18n.t("File"), i18n.t("New")); + final ActionMenuDescriptor<StateToken> addGallery = createFolderAction(TYPE_GALLERY, + "images/nav/gallery_add.png", i18n.t("New gallery"), i18n.t("File"), i18n.t("New")); final ActionMenuDescriptor<StateToken> addDoc = new ActionMenuDescriptor<StateToken>(AccessRolDTO.Editor, ActionPosition.topbarAndItemMenu, new Slot<StateToken>() { public void onEvent(final StateToken token) { + Site.showProgressProcessing(); contentServiceProvider.get().addContent(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), - session.getCurrentState().getContainer().getId(), i18n.t("New document"), + session.getCurrentState().getStateToken(), i18n.t("New document"), new AsyncCallbackSimple<StateDTO>() { public void onSuccess(final StateDTO state) { - contextNavigator.setState(state); + contextNavigator.setEditOnNextStateChange(true); stateManager.setRetrievedState(state); - contextNavigator.editItem(state.getStateToken()); } }); - } }); addDoc.setTextDescription(i18n.t("New document")); @@ -141,8 +141,7 @@ final ActionMenuDescriptor<StateToken> delContent = new ActionMenuDescriptor<StateToken>( AccessRolDTO.Administrator, ActionPosition.topbarAndItemMenu, new Slot<StateToken>() { public void onEvent(final StateToken token) { - contentServiceProvider.get().delContent(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), token.getDocument(), + contentServiceProvider.get().delContent(session.getUserHash(), token, new AsyncCallbackSimple<String>() { public void onSuccess(final String result) { final StateToken parent = token.clone().clearDocument(); @@ -165,6 +164,11 @@ }); go.setTextDescription(i18n.t("Open")); go.setIconUrl("images/nav/go.png"); + go.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken currentStateToken) { + return !contextNavigator.isSelected(currentStateToken); + } + }); final ActionDescriptor<StateToken> rename = new ActionDescriptor<StateToken>(AccessRolDTO.Editor, ActionPosition.itemMenu, new Slot<StateToken>() { @@ -181,22 +185,37 @@ } }); goGroupHome.setIconUrl("images/group-home.png"); - goGroupHome.setLeftSeparator(ActionButtonSeparator.fill); - goGroupHome.setRightSeparator(ActionButtonSeparator.separator); goGroupHome.setEnableCondition(new ActionEnableCondition<StateToken>() { - public boolean mustBeEnabled(final StateToken param) { - return !param.equals(session.getCurrentState().getStateToken()); + public boolean mustBeEnabled(final StateToken currentStateToken) { + final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent() + .getStateToken(); + return !currentStateToken.equals(defContentToken); } }); final ActionMenuDescriptor<StateToken> setAsDefGroupContent = new ActionMenuDescriptor<StateToken>( AccessRolDTO.Administrator, ActionPosition.itemMenu, new Slot<StateToken>() { public void onEvent(final StateToken token) { - Site.info("In development"); + Site.showProgressProcessing(); + contentServiceProvider.get().setAsDefaultContent(session.getUserHash(), token, + new AsyncCallbackSimple<ContentDTO>() { + public void onSuccess(ContentDTO defContent) { + session.getCurrentState().getGroup().setDefaultContent(defContent); + Site.hideProgress(); + Site.info(i18n.t("Document selected as the group homepage")); + } + }); } }); setAsDefGroupContent.setTextDescription(i18n.t("Set this as the group default page")); setAsDefGroupContent.setIconUrl("images/group-home.png"); + setAsDefGroupContent.setEnableCondition(new ActionEnableCondition<StateToken>() { + public boolean mustBeEnabled(final StateToken currentStateToken) { + final StateToken defContentToken = session.getCurrentState().getGroup().getDefaultContent() + .getStateToken(); + return !contextNavigator.isSelected(defContentToken); + } + }); final ActionButtonDescriptor<StateToken> refresh = new ActionButtonDescriptor<StateToken>(AccessRolDTO.Viewer, ActionPosition.topbar, new Slot<StateToken>() { @@ -207,6 +226,7 @@ }); refresh.setIconUrl("images/nav/refresh.png"); refresh.setToolTip(i18n.t("Refresh")); + refresh.setLeftSeparator(ActionButtonSeparator.fill); final ActionDescriptor<StateToken> uploadFile = createUploadAction(i18n.t("Upload file"), "images/nav/upload.png", i18n.t("Upload some files (images, PDFs, ...)"), null); @@ -220,7 +240,7 @@ } }); - // contextNavigator.addAction(TYPE_FOLDER, go); + contextNavigator.addAction(TYPE_FOLDER, go); contextNavigator.addAction(TYPE_FOLDER, addDoc); contextNavigator.addAction(TYPE_FOLDER, addFolder); contextNavigator.addAction(TYPE_FOLDER, delContainer); @@ -229,10 +249,14 @@ contextNavigator.addAction(TYPE_FOLDER, refresh); contextNavigator.addAction(TYPE_FOLDER, uploadFile); + contextNavigator.addAction(TYPE_BLOG, go); contextNavigator.addAction(TYPE_BLOG, uploadFile); contextNavigator.addAction(TYPE_BLOG, setAsDefGroupContent); + contextNavigator.addAction(TYPE_BLOG, refresh); + contextNavigator.addAction(TYPE_GALLERY, go); contextNavigator.addAction(TYPE_GALLERY, goGroupHome); + contextNavigator.addAction(TYPE_GALLERY, refresh); contextNavigator.addAction(TYPE_ROOT, addDoc); contextNavigator.addAction(TYPE_ROOT, addFolder); @@ -241,7 +265,7 @@ contextNavigator.addAction(TYPE_ROOT, refresh); contextNavigator.addAction(TYPE_ROOT, uploadFile); - // contextNavigator.addAction(TYPE_DOCUMENT, go); + contextNavigator.addAction(TYPE_DOCUMENT, go); contextNavigator.addAction(TYPE_DOCUMENT, delContent); contextNavigator.addAction(TYPE_DOCUMENT, rename); contextNavigator.addAction(TYPE_DOCUMENT, goGroupHome); @@ -254,14 +278,14 @@ final ActionMenuDescriptor<StateToken> addFolder; addFolder = new ActionMenuDescriptor<StateToken>(AccessRolDTO.Editor, ActionPosition.topbarAndItemMenu, new Slot<StateToken>() { - public void onEvent(final StateToken parameter) { - contentServiceProvider.get().addFolder(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), new Long(parameter.getFolder()), - textDescription, contentTypeId, new AsyncCallbackSimple<StateDTO>() { + public void onEvent(final StateToken stateToken) { + Site.showProgressProcessing(); + contentServiceProvider.get().addFolder(session.getUserHash(), stateToken, textDescription, + contentTypeId, new AsyncCallbackSimple<StateDTO>() { + public void onSuccess(final StateDTO state) { - contextNavigator.setState(state); + contextNavigator.setEditOnNextStateChange(true); stateManager.setRetrievedState(state); - contextNavigator.editItem(state.getStateToken()); } }); } @@ -279,7 +303,10 @@ uploadFile = new ActionButtonDescriptor<StateToken>(AccessRolDTO.Editor, ActionPosition.bootombarAndItemMenu, new Slot<StateToken>() { public void onEvent(final StateToken token) { - fileUploaderProvider.get().setPermittedExtensions(permitedExtensions); + if (permitedExtensions != null) { + Log.info("Permited extensions (in dev): " + permitedExtensions); + fileUploaderProvider.get().setPermittedExtensions(permitedExtensions); + } fileUploaderProvider.get().show(); } }); Modified: trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/docs/client/cnt/DocumentContentPresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -105,8 +105,7 @@ public void onDeleteClicked() { Site.showProgressProcessing(); - contentServiceProvider.get().delContent(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), content.getDocumentId(), + contentServiceProvider.get().delContent(session.getUserHash(), content.getStateToken(), new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { Site.hideProgress(); @@ -154,8 +153,8 @@ public void onSave(final String text) { content.setContent(text); Site.showProgressSaving(); - contentServiceProvider.get().save(session.getUserHash(), session.getCurrentState().getGroup().getShortName(), - content.getDocumentId(), content.getContent(), new AsyncCallback<Integer>() { + contentServiceProvider.get().save(session.getUserHash(), content.getStateToken(), content.getContent(), + new AsyncCallback<Integer>() { public void onFailure(final Throwable caught) { Site.hideProgress(); try { Modified: trunk/src/main/java/org/ourproject/kune/docs/client/ctx/admin/AdminContextPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/docs/client/ctx/admin/AdminContextPresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/docs/client/ctx/admin/AdminContextPresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -65,8 +65,8 @@ public void addAuthor(final String authorShortName) { Site.showProgressProcessing(); final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().addAuthor(session.getUserHash(), currentState.getGroup().getShortName(), - currentState.getDocumentId(), authorShortName, new AsyncCallbackSimple<Object>() { + contentServiceProvider.get().addAuthor(session.getUserHash(), currentState.getStateToken(), authorShortName, + new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { Site.hideProgress(); stateManager.reload(); @@ -77,8 +77,8 @@ public void delAuthor(final String authorShortName) { Site.showProgressProcessing(); final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().removeAuthor(session.getUserHash(), currentState.getGroup().getShortName(), - currentState.getDocumentId(), authorShortName, new AsyncCallbackSimple<Object>() { + contentServiceProvider.get().removeAuthor(session.getUserHash(), currentState.getStateToken(), authorShortName, + new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { Site.hideProgress(); stateManager.reload(); @@ -89,8 +89,8 @@ public void doChangeLanguage(final String langCode) { Site.showProgressProcessing(); final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().setLanguage(session.getUserHash(), currentState.getGroup().getShortName(), - currentState.getDocumentId(), langCode, new AsyncCallbackSimple<I18nLanguageDTO>() { + contentServiceProvider.get().setLanguage(session.getUserHash(), currentState.getStateToken(), langCode, + new AsyncCallbackSimple<I18nLanguageDTO>() { public void onSuccess(final I18nLanguageDTO lang) { Site.hideProgress(); entitySubTitle.setContentLanguage(lang.getEnglishName()); @@ -109,8 +109,8 @@ public void setPublishedOn(final Date publishedOn) { Site.showProgressProcessing(); final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().setPublishedOn(session.getUserHash(), currentState.getGroup().getShortName(), - currentState.getDocumentId(), publishedOn, new AsyncCallbackSimple<Object>() { + contentServiceProvider.get().setPublishedOn(session.getUserHash(), currentState.getStateToken(), publishedOn, + new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { Site.hideProgress(); entityTitle.setContentDate(publishedOn); @@ -159,8 +159,8 @@ public void setTags(final String tagsString) { Site.showProgressProcessing(); final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().setTags(session.getUserHash(), currentState.getGroup().getShortName(), - currentState.getDocumentId(), tagsString, new AsyncCallbackSimple<List<TagResultDTO>>() { + contentServiceProvider.get().setTags(session.getUserHash(), currentState.getStateToken(), tagsString, + new AsyncCallbackSimple<List<TagResultDTO>>() { public void onSuccess(final List<TagResultDTO> result) { tagsSummaryProvider.get().setGroupTags(result); Site.hideProgress(); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/dto/GroupDTO.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/dto/GroupDTO.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/dto/GroupDTO.java 2008-09-18 00:45:41 UTC (rev 872) @@ -20,7 +20,6 @@ package org.ourproject.kune.platf.client.dto; - import com.google.gwt.user.client.rpc.IsSerializable; public class GroupDTO implements IsSerializable { @@ -30,9 +29,7 @@ private String longName; private String publicDesc; private GroupType type; - private String defaultToolName; - private Long defaultFolderId; - private Long defaultContentId; + private ContentDTO defaultContent; private LicenseDTO defaultLicense; private String workspaceTheme; private String tags; @@ -56,20 +53,6 @@ return false; } final GroupDTO other = (GroupDTO) obj; - if (defaultContentId == null) { - if (other.defaultContentId != null) { - return false; - } - } else if (!defaultContentId.equals(other.defaultContentId)) { - return false; - } - if (defaultFolderId == null) { - if (other.defaultFolderId != null) { - return false; - } - } else if (!defaultFolderId.equals(other.defaultFolderId)) { - return false; - } if (defaultLicense == null) { if (other.defaultLicense != null) { return false; @@ -77,13 +60,6 @@ } else if (!defaultLicense.equals(other.defaultLicense)) { return false; } - if (defaultToolName == null) { - if (other.defaultToolName != null) { - return false; - } - } else if (!defaultToolName.equals(other.defaultToolName)) { - return false; - } if (id == null) { if (other.id != null) { return false; @@ -118,22 +94,14 @@ return true; } - public Long getDefaultContentId() { - return defaultContentId; + public ContentDTO getDefaultContent() { + return defaultContent; } - public Long getDefaultFolderId() { - return defaultFolderId; - } - public LicenseDTO getDefaultLicense() { return defaultLicense; } - public String getDefaultToolName() { - return defaultToolName; - } - public Long getId() { return id; } @@ -165,10 +133,7 @@ public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + (defaultContentId == null ? 0 : defaultContentId.hashCode()); - result = prime * result + (defaultFolderId == null ? 0 : defaultFolderId.hashCode()); result = prime * result + (defaultLicense == null ? 0 : defaultLicense.hashCode()); - result = prime * result + (defaultToolName == null ? 0 : defaultToolName.hashCode()); result = prime * result + (id == null ? 0 : id.hashCode()); result = prime * result + (longName == null ? 0 : longName.hashCode()); result = prime * result + (publicDesc == null ? 0 : publicDesc.hashCode()); @@ -177,22 +142,14 @@ return result; } - public void setDefaultContentId(final Long defaultContentId) { - this.defaultContentId = defaultContentId; + public void setDefaultContent(final ContentDTO defaultContent) { + this.defaultContent = defaultContent; } - public void setDefaultFolderId(final Long defaultFolderId) { - this.defaultFolderId = defaultFolderId; - } - public void setDefaultLicense(final LicenseDTO defaultLicense) { this.defaultLicense = defaultLicense; } - public void setDefaultToolName(final String defaultToolName) { - this.defaultToolName = defaultToolName; - } - public void setId(final Long id) { this.id = id; } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentService.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentService.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentService.java 2008-09-18 00:45:41 UTC (rev 872) @@ -24,6 +24,7 @@ import java.util.List; import org.ourproject.kune.platf.client.dto.CommentDTO; +import org.ourproject.kune.platf.client.dto.ContentDTO; import org.ourproject.kune.platf.client.dto.I18nLanguageDTO; import org.ourproject.kune.platf.client.dto.StateDTO; import org.ourproject.kune.platf.client.dto.StateToken; @@ -34,48 +35,45 @@ public interface ContentService extends RemoteService { - void addAuthor(String userHash, String groupShortName, String documentId, String authorShortName) + void addAuthor(String userHash, StateToken token, String authorShortName) throws DefaultException; + + CommentDTO addComment(String userHash, StateToken token, Long parentCommentId, String commentText) throws DefaultException; - CommentDTO addComment(String userHash, String groupShortName, String documentId, Long parentCommentId, - String commentText) throws DefaultException; + CommentDTO addComment(String userHash, StateToken token, String commentText) throws DefaultException; - CommentDTO addComment(String userHash, String groupShortName, String documentId, String commentText) - throws DefaultException; + StateDTO addContent(String user, StateToken parentToken, String name) throws DefaultException; - StateDTO addContent(String user, String groupShortName, Long parentFolderId, String name) throws DefaultException; + StateDTO addFolder(String hash, StateToken parentToken, String typeId, String title) throws DefaultException; - StateDTO addFolder(String hash, String groupShortName, Long parentFolderId, String typeId, String title) - throws DefaultException; + StateDTO addRoom(String user, StateToken parentToken, String name) throws DefaultException; - StateDTO addRoom(String user, String groupShortName, Long parentFolderId, String name) throws DefaultException; + void delContent(String userHash, StateToken token) throws DefaultException; - void delContent(String userHash, String groupShortName, String documentId) throws DefaultException; + StateDTO getContent(String userHash, StateToken token) throws DefaultException; - StateDTO getContent(String userHash, String groupShortName, StateToken token) throws DefaultException; + List<TagResultDTO> getSummaryTags(String userHash, StateToken groupToken) throws DefaultException; - List<TagResultDTO> getSummaryTags(String userHash, String groupShortName) throws DefaultException; + CommentDTO markCommentAsAbuse(String userHash, StateToken token, Long commentId) throws DefaultException; - CommentDTO markCommentAsAbuse(String userHash, String groupShortName, String documentId, Long commentId) - throws DefaultException; + void rateContent(String userHash, StateToken token, Double value) throws DefaultException; - void rateContent(String userHash, String groupShortName, String documentId, Double value) throws DefaultException; + void removeAuthor(String userHash, StateToken token, String authorShortName) throws DefaultException; - void removeAuthor(String userHash, String groupShortName, String documentId, String authorShortName) - throws DefaultException; + String renameContainer(String userHash, StateToken token, String newName) throws DefaultException; - String rename(String userHash, String groupShortName, String token, String newName) throws DefaultException; + String renameContent(String userHash, StateToken token, String newName) throws DefaultException; - Integer save(String user, String groupShortName, String documentId, String content) throws DefaultException; + Integer save(String user, StateToken token, String content) throws DefaultException; - I18nLanguageDTO setLanguage(String userHash, String groupShortName, String documentId, String languageCode) - throws DefaultException; + ContentDTO setAsDefaultContent(String userHash, StateToken token); - void setPublishedOn(String userHash, String groupShortName, String documentId, Date date) throws DefaultException; + I18nLanguageDTO setLanguage(String userHash, StateToken token, String languageCode) throws DefaultException; - List<TagResultDTO> setTags(String userHash, String groupShortName, String documentId, String tags) - throws DefaultException; + void setPublishedOn(String userHash, StateToken token, Date date) throws DefaultException; - CommentDTO voteComment(String userHash, String groupShortName, String documentId, Long commentId, - boolean votePositive) throws DefaultException; + List<TagResultDTO> setTags(String userHash, StateToken token, String tags) throws DefaultException; + + CommentDTO voteComment(String userHash, StateToken token, Long commentId, boolean votePositive) + throws DefaultException; } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentServiceAsync.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentServiceAsync.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/rpc/ContentServiceAsync.java 2008-09-18 00:45:41 UTC (rev 872) @@ -24,6 +24,7 @@ import java.util.List; import org.ourproject.kune.platf.client.dto.CommentDTO; +import org.ourproject.kune.platf.client.dto.ContentDTO; import org.ourproject.kune.platf.client.dto.I18nLanguageDTO; import org.ourproject.kune.platf.client.dto.StateDTO; import org.ourproject.kune.platf.client.dto.StateToken; @@ -33,53 +34,46 @@ public interface ContentServiceAsync { - void addAuthor(String userHash, String groupShortName, String documentId, String authorShortName, - AsyncCallback<?> asyncCallback); + void addAuthor(String userHash, StateToken token, String authorShortName, AsyncCallback<?> asyncCallback); - void addComment(String userHash, String groupShortName, String documentId, Long parentCommentId, - String commentText, AsyncCallback<CommentDTO> asyncCallback); - - void addComment(String userHash, String groupShortName, String documentId, String commentText, + void addComment(String userHash, StateToken token, Long parentCommentId, String commentText, AsyncCallback<CommentDTO> asyncCallback); - void addContent(String user, String groupShortName, Long parentFolderId, String name, - AsyncCallback<StateDTO> callback); + void addComment(String userHash, StateToken token, String commentText, AsyncCallback<CommentDTO> asyncCallback); - void addFolder(String hash, String groupShortName, Long parentFolderId, String title, String typeId, - AsyncCallback<StateDTO> callback); + void addContent(String user, StateToken parentToken, String name, AsyncCallback<StateDTO> callback); - void addRoom(String user, String groupShortName, Long parentFolderId, String name, AsyncCallback<StateDTO> callback); + void addFolder(String hash, StateToken parentToken, String title, String typeId, AsyncCallback<StateDTO> callback); - void delContent(String userHash, String groupShortName, String documentId, AsyncCallback<?> asyncCallback); + void addRoom(String user, StateToken parentToken, String name, AsyncCallback<StateDTO> callback); - void getContent(String user, String groupShortName, StateToken newState, AsyncCallback<StateDTO> callback); + void delContent(String userHash, StateToken token, AsyncCallback<?> asyncCallback); - void getSummaryTags(String userHash, String groupShortName, AsyncCallback<List<TagResultDTO>> asyncCallback); + void getContent(String user, StateToken newState, AsyncCallback<StateDTO> callback); - void markCommentAsAbuse(String userHash, String groupShortName, String documentId, Long commentId, - AsyncCallback<CommentDTO> asyncCallback); + void getSummaryTags(String userHash, StateToken groupToken, AsyncCallback<List<TagResultDTO>> asyncCallback); - void rateContent(String userHash, String groupShortName, String documentId, Double value, - AsyncCallback<?> asyncCallback); + void markCommentAsAbuse(String userHash, StateToken token, Long commentId, AsyncCallback<CommentDTO> asyncCallback); - void removeAuthor(String userHash, String groupShortName, String documentId, String authorShortName, - AsyncCallback<?> asyncCallback); + void rateContent(String userHash, StateToken token, Double value, AsyncCallback<?> asyncCallback); - void rename(String userHash, String groupShortName, String token, String newName, - AsyncCallback<String> asyncCallback); + void removeAuthor(String userHash, StateToken token, String authorShortName, AsyncCallback<?> asyncCallback); - void save(String user, String groupShortName, String documentId, String content, - AsyncCallback<Integer> asyncCallback); + void renameContainer(String userHash, StateToken token, String newName, AsyncCallback<String> asyncCallback); - void setLanguage(String userHash, String groupShortName, String documentId, String languageCode, + void renameContent(String userHash, StateToken token, String newName, AsyncCallback<String> asyncCallback); + + void save(String user, StateToken token, String content, AsyncCallback<Integer> asyncCallback); + + void setAsDefaultContent(String userHash, StateToken token, AsyncCallback<ContentDTO> asyncCallback); + + void setLanguage(String userHash, StateToken token, String languageCode, AsyncCallback<I18nLanguageDTO> asyncCallback); - void setPublishedOn(String userHash, String groupShortName, String documentId, Date publishedOn, - AsyncCallback<?> asyncCallback); + void setPublishedOn(String userHash, StateToken token, Date publishedOn, AsyncCallback<?> asyncCallback); - void setTags(String userHash, String groupShortName, String documentId, String tags, - AsyncCallback<List<TagResultDTO>> asyncCallback); + void setTags(String userHash, StateToken token, String tags, AsyncCallback<List<TagResultDTO>> asyncCallback); - void voteComment(String userHash, String groupShortName, String documentId, Long commentId, boolean votePositive, + void voteComment(String userHash, StateToken token, Long commentId, boolean votePositive, AsyncCallback<CommentDTO> asyncCallback); } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupService.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupService.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupService.java 2008-09-18 00:45:41 UTC (rev 872) @@ -28,7 +28,7 @@ public interface GroupService extends RemoteService { - void changeGroupWsTheme(String userHash, String groupShortName, String theme) throws DefaultException; + void changeGroupWsTheme(String userHash, StateToken groupToken, String theme) throws DefaultException; StateToken createNewGroup(String userHash, GroupDTO group) throws DefaultException; Modified: trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupServiceAsync.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupServiceAsync.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/rpc/GroupServiceAsync.java 2008-09-18 00:45:41 UTC (rev 872) @@ -27,8 +27,8 @@ public interface GroupServiceAsync { + void changeGroupWsTheme(String userHash, StateToken groupToken, String theme, AsyncCallback<?> callback); + void createNewGroup(String userHash, GroupDTO group, AsyncCallback<StateToken> callback); - void changeGroupWsTheme(String userHash, String groupShortName, String theme, AsyncCallback<?> callback); - } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkService.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkService.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkService.java 2008-09-18 00:45:41 UTC (rev 872) @@ -23,41 +23,42 @@ import org.ourproject.kune.platf.client.dto.SocialNetworkDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkRequestResult; import org.ourproject.kune.platf.client.dto.SocialNetworkResultDTO; +import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.errors.DefaultException; import com.google.gwt.user.client.rpc.RemoteService; public interface SocialNetworkService extends RemoteService { - SocialNetworkResultDTO AcceptJoinGroup(String hash, String groupShortName, String groupToAcceptShortName) + SocialNetworkResultDTO AcceptJoinGroup(String hash, StateToken groupToken, String groupToAcceptShortName) throws DefaultException; - SocialNetworkResultDTO addAdminMember(String hash, String groupShortName, String groupToAddShortName) + SocialNetworkResultDTO addAdminMember(String hash, StateToken groupToken, String groupToAddShortName) throws DefaultException; - SocialNetworkResultDTO addCollabMember(String hash, String groupShortName, String groupToAddShortName) + SocialNetworkResultDTO addCollabMember(String hash, StateToken groupToken, String groupToAddShortName) throws DefaultException; - SocialNetworkResultDTO addViewerMember(String hash, String groupShortName, String groupToAddShortName) + SocialNetworkResultDTO addViewerMember(String hash, StateToken groupToken, String groupToAddShortName) throws DefaultException; - SocialNetworkResultDTO deleteMember(String hash, String groupShortName, String groupToDeleteShortName) + SocialNetworkResultDTO deleteMember(String hash, StateToken groupToken, String groupToDeleteShortName) throws DefaultException; - SocialNetworkResultDTO denyJoinGroup(String hash, String groupShortName, String groupToDenyShortName) + SocialNetworkResultDTO denyJoinGroup(String hash, StateToken groupToken, String groupToDenyShortName) throws DefaultException; - SocialNetworkDTO getGroupMembers(String hash, String groupShortName) throws DefaultException; + SocialNetworkDTO getGroupMembers(String hash, StateToken groupToken) throws DefaultException; - ParticipationDataDTO getParticipation(String hash, String groupShortName) throws DefaultException; + ParticipationDataDTO getParticipation(String hash, StateToken groupToken) throws DefaultException; - SocialNetworkRequestResult requestJoinGroup(String hash, String groupShortName) throws DefaultException; + SocialNetworkRequestResult requestJoinGroup(String hash, StateToken groupToken) throws DefaultException; - SocialNetworkResultDTO setAdminAsCollab(String hash, String groupShortName, String groupToSetCollabShortName) + SocialNetworkResultDTO setAdminAsCollab(String hash, StateToken groupToken, String groupToSetCollabShortName) throws DefaultException; - SocialNetworkResultDTO setCollabAsAdmin(String hash, String groupShortName, String groupToSetAdminShortName) + SocialNetworkResultDTO setCollabAsAdmin(String hash, StateToken groupToken, String groupToSetAdminShortName) throws DefaultException; - SocialNetworkResultDTO unJoinGroup(String hash, String groupShortName) throws DefaultException; + SocialNetworkResultDTO unJoinGroup(String hash, StateToken groupToken) throws DefaultException; } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkServiceAsync.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkServiceAsync.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/rpc/SocialNetworkServiceAsync.java 2008-09-18 00:45:41 UTC (rev 872) @@ -21,40 +21,41 @@ import org.ourproject.kune.platf.client.dto.ParticipationDataDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkResultDTO; +import org.ourproject.kune.platf.client.dto.StateToken; import com.google.gwt.user.client.rpc.AsyncCallback; public interface SocialNetworkServiceAsync { - void requestJoinGroup(String hash, String groupShortName, AsyncCallback<?> callback); + void AcceptJoinGroup(String hash, StateToken groupToken, String groupToAcceptShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void AcceptJoinGroup(String hash, String groupShortName, String groupToAcceptShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void addAdminMember(String hash, StateToken groupToken, String groupToAddShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void deleteMember(String hash, String groupShortName, String groupToDeleteShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void addCollabMember(String hash, StateToken groupToken, String groupToAddShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void denyJoinGroup(String hash, String groupShortName, String groupToDenyShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void addViewerMember(String hash, StateToken groupToken, String groupToAddShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void unJoinGroup(String hash, String groupShortName, AsyncCallback<SocialNetworkResultDTO> callback); + void deleteMember(String hash, StateToken groupToken, String groupToDeleteShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void setCollabAsAdmin(String hash, String groupShortName, String groupToSetAdminShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void denyJoinGroup(String hash, StateToken groupToken, String groupToDenyShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void setAdminAsCollab(String hash, String groupShortName, String groupToSetCollabShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void getGroupMembers(String hash, StateToken groupToken, AsyncCallback<SocialNetworkResultDTO> callback); - void addAdminMember(String hash, String groupShortName, String groupToAddShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void getParticipation(String hash, StateToken groupToken, AsyncCallback<ParticipationDataDTO> callback); - void addCollabMember(String hash, String groupShortName, String groupToAddShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void requestJoinGroup(String hash, StateToken groupToken, AsyncCallback<?> callback); - void addViewerMember(String hash, String groupShortName, String groupToAddShortName, - AsyncCallback<SocialNetworkResultDTO> callback); + void setAdminAsCollab(String hash, StateToken groupToken, String groupToSetCollabShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void getGroupMembers(String hash, String groupShortName, AsyncCallback<SocialNetworkResultDTO> callback); + void setCollabAsAdmin(String hash, StateToken groupToken, String groupToSetAdminShortName, + AsyncCallback<SocialNetworkResultDTO> callback); - void getParticipation(String hash, String groupShortName, AsyncCallback<ParticipationDataDTO> callback); + void unJoinGroup(String hash, StateToken groupToken, AsyncCallback<SocialNetworkResultDTO> callback); } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/services/KuneModule.java 2008-09-18 00:45:41 UTC (rev 872) @@ -36,6 +36,7 @@ import org.ourproject.kune.workspace.client.ctxnav.ContextNavigator; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigatorPanel; import org.ourproject.kune.workspace.client.ctxnav.ContextNavigatorPresenter; +import org.ourproject.kune.workspace.client.ctxnav.ContextNavigatorToolbar; import org.ourproject.kune.workspace.client.editor.TextEditor; import org.ourproject.kune.workspace.client.editor.TextEditorPanel; import org.ourproject.kune.workspace.client.editor.TextEditorPresenter; @@ -589,9 +590,11 @@ register(SingletonScope.class, new Factory<ContextNavigator>(ContextNavigator.class) { public ContextNavigator create() { + final ContextNavigatorToolbar contextNavigatorToolbar = new ContextNavigatorToolbar($(Session.class), + $$(ActionManager.class), ws); final ContextNavigatorPresenter presenter = new ContextNavigatorPresenter($(StateManager.class), $(Session.class), $$(ContentServiceAsync.class), i18n, $(EntityTitle.class), - $$(ActionManager.class)); + $$(ActionManager.class), contextNavigatorToolbar); final ContextNavigatorPanel panel = new ContextNavigatorPanel(presenter, i18n, ws); presenter.init(panel); return presenter; Modified: trunk/src/main/java/org/ourproject/kune/platf/client/state/ContentProviderDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/state/ContentProviderDefault.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/state/ContentProviderDefault.java 2008-09-18 00:45:41 UTC (rev 872) @@ -49,7 +49,7 @@ if (catched != null) { callback.onSuccess(catched); } else { - server.getContent(user, newState.getGroup(), newState, callback); + server.getContent(user, newState, callback); } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/state/StateManagerDefault.java 2008-09-18 00:45:41 UTC (rev 872) @@ -139,9 +139,9 @@ siteTokens.remove(token); } - public void setRetrievedState(final StateDTO content) { - final StateToken state = content.getStateToken(); - contentProvider.cache(state, content); + public void setRetrievedState(final StateDTO newState) { + contentProvider.cache(newState.getStateToken(), newState); + setState(newState); } public void setSocialNetwork(final SocialNetworkResultDTO socialNet) { @@ -171,18 +171,10 @@ } } - private void loadContent(final StateDTO state) { - onStateChanged.fire(state); - Site.hideProgress(); - } - private void onHistoryChanged(final StateToken newState) { contentProvider.getContent(session.getUserHash(), newState, new AsyncCallbackSimple<StateDTO>() { public void onSuccess(final StateDTO newState) { - loadContent(newState); - session.setCurrent(newState); - checkGroupAndToolChange(oldState, newState); - oldState = newState; + setState(newState); } }); } @@ -191,10 +183,17 @@ if (oldState == null) { onHistoryChanged(new StateToken()); } else { - final StateDTO currentState = session.getCurrentState(); - session.setCurrent(oldState); - checkGroupAndToolChange(currentState, oldState); - loadContent(oldState); + final StateDTO newState = oldState; + oldState = session.getCurrentState(); + setState(newState); } } + + private void setState(final StateDTO newState) { + session.setCurrent(newState); + onStateChanged.fire(newState); + Site.hideProgress(); + checkGroupAndToolChange(oldState, newState); + oldState = newState; + } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/FileUploaderDialog.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/FileUploaderDialog.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/FileUploaderDialog.java 2008-09-18 00:45:41 UTC (rev 872) @@ -8,6 +8,8 @@ import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.JavaScriptObject; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.DeferredCommand; import com.gwtext.client.core.EventObject; import com.gwtext.client.core.UrlParam; import com.gwtext.client.widgets.Button; @@ -20,62 +22,17 @@ private static final String URL = "/services/fileupload"; - private final UploadDialog dialog; + private UploadDialog dialog; private ToolbarButton traybarButton; private final I18nUITranslationService i18n; private final WorkspaceSkeleton ws; + private final Session session; public FileUploaderDialog(final I18nUITranslationService i18n, final WorkspaceSkeleton ws, final Session session) { this.i18n = i18n; this.ws = ws; - dialog = new UploadDialog(i18n.t("File uploader"), false, true); - // dialog.setUploadAutostart(true); - dialog.setResetOnHide(false); - dialog.addListener(new UploadDialogListenerAdapter() { - - @Override - public void onFileUploadStart(final UploadDialog source, final String filename) { - setUploadParams(session.getUserHash(), session.getCurrentState().getStateToken().toString(), filename); - } - - @Override - public void onUploadComplete(final UploadDialog source) { - if (!dialog.isVisible()) { - Site.info(i18n.t("Upload completed")); - traybarButton.destroy(); - traybarButton = null; - } - } - - @Override - public void onUploadError(final UploadDialog source, final String filename, final JavaScriptObject data) { - showError(); - } - - @Override - public void onUploadFailed(final UploadDialog source, final String filename) { - showError(); - } - - private void setUploadParams(final String userhash, final String currentStateToken, final String filename) { - Log.info("Setting upload params"); - final UrlParam param[] = new UrlParam[3]; - param[0] = new UrlParam("userhash", userhash); - param[1] = new UrlParam("currentStateToken", currentStateToken); - param[2] = new UrlParam("filename", filename); - dialog.setBaseParams(param); - dialog.setPostVarName(filename); - } - - private void showError() { - if (!dialog.isVisible()) { - Site.veryImportant(i18n.t("Error uploading")); - } - } - - }); - dialog.setUrl(URL); - + this.session = session; + createDialog(false); } public void hide() { @@ -83,7 +40,16 @@ } public void setPermittedExtensions(final String extensions) { - dialog.setPermittedExtensions((String[]) KuneStringUtils.splitTags(extensions).toArray()); + DeferredCommand.addCommand(new Command() { + public void execute() { + final Object[] objs = KuneStringUtils.splitTags(extensions).toArray(); + final String[] exts = new String[objs.length]; + for (int i = 0; i < objs.length; i++) { + exts[i] = (String) objs[i]; + } + dialog.setPermittedExtensions(exts); + } + }); } public void show() { @@ -103,6 +69,71 @@ }); ws.getSiteTraybar().addButton(traybarButton); } - dialog.show(); + if (dialog == null) { + createDialog(true); + } else { + dialog.show(); + } } + + private void createDialog(final boolean show) { + DeferredCommand.addCommand(new Command() { + + public void execute() { + + dialog = new UploadDialog(i18n.t("File uploader"), false, true); + // dialog.setUploadAutostart(true); + dialog.setResetOnHide(false); + dialog.addListener(new UploadDialogListenerAdapter() { + @Override + public void onFileUploadStart(final UploadDialog source, final String filename) { + setUploadParams(session.getUserHash(), session.getCurrentState().getStateToken().toString(), + filename); + } + + @Override + public void onUploadComplete(final UploadDialog source) { + if (!dialog.isVisible()) { + Site.info(i18n.t("Upload completed")); + traybarButton.destroy(); + traybarButton = null; + } + } + + @Override + public void onUploadError(final UploadDialog source, final String filename, + final JavaScriptObject data) { + showError(); + } + + @Override + public void onUploadFailed(final UploadDialog source, final String filename) { + showError(); + } + + private void setUploadParams(final String userhash, final String currentStateToken, + final String filename) { + Log.info("Setting upload params"); + final UrlParam param[] = new UrlParam[3]; + param[0] = new UrlParam("userhash", userhash); + param[1] = new UrlParam("currentStateToken", currentStateToken); + param[2] = new UrlParam("filename", filename); + dialog.setBaseParams(param); + dialog.setPostVarName(filename); + } + + private void showError() { + if (!dialog.isVisible()) { + Site.veryImportant(i18n.t("Error uploading")); + } + } + + }); + dialog.setUrl(URL); + if (show) { + dialog.show(); + } + } + }); + } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rate/RateItPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rate/RateItPresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rate/RateItPresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -85,8 +85,8 @@ setRatePanel(newValue); Site.showProgressProcessing(); final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().rateContent(session.getUserHash(), currentState.getGroup().getShortName(), - currentState.getDocumentId(), newValue, new AsyncCallbackSimple<Object>() { + contentServiceProvider.get().rateContent(session.getUserHash(), currentState.getStateToken(), newValue, + new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { Site.hideProgress(); Site.info(i18n.t("Content rated")); Added: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/gallery_add.png =================================================================== (Binary files differ) Property changes on: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/gallery_add.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/room.png =================================================================== (Binary files differ) Property changes on: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/room.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/room_add.png =================================================================== (Binary files differ) Property changes on: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/room_add.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/upload.gif =================================================================== (Binary files differ) Modified: trunk/src/main/java/org/ourproject/kune/platf/public/images/nav/upload.png =================================================================== (Binary files differ) Modified: trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/PlatformServerModule.java 2008-09-18 00:45:41 UTC (rev 872) @@ -41,8 +41,6 @@ import org.ourproject.kune.platf.server.auth.AuthenticatedMethodInterceptor; import org.ourproject.kune.platf.server.auth.Authorizated; import org.ourproject.kune.platf.server.auth.AuthorizatedMethodInterceptor; -import org.ourproject.kune.platf.server.auth.GroupAuthorizated; -import org.ourproject.kune.platf.server.auth.GroupAuthorizatedMethodInterceptor; import org.ourproject.kune.platf.server.auth.SessionService; import org.ourproject.kune.platf.server.auth.SessionServiceDefault; import org.ourproject.kune.platf.server.content.CommentManager; @@ -116,8 +114,6 @@ outermostCall(new AuthenticatedMethodInterceptor())); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Authorizated.class), outermostCall(new AuthorizatedMethodInterceptor())); - bindInterceptor(Matchers.any(), Matchers.annotatedWith(GroupAuthorizated.class), - outermostCall(new GroupAuthorizatedMethodInterceptor())); } private void bindManagers() { Modified: trunk/src/main/java/org/ourproject/kune/platf/server/access/Access.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/access/Access.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/access/Access.java 2008-09-18 00:45:41 UTC (rev 872) @@ -29,17 +29,29 @@ private Content content; private Container container; private AccessLists contentAccessLists; - private AccessLists folderAccessLists; + private AccessLists containerAccessLists; private AccessLists groupAccessLists; private AccessRights contentRights; - private AccessRights folderRights; + private AccessRights containerRights; private AccessRights groupRights; public Access(final Content descriptor, final Container container) { setContent(descriptor); - setFolder(container); + setContainer(container); } + public Container getContainer() { + return container; + } + + public AccessLists getContainerAccessLists() { + return containerAccessLists; + } + + public AccessRights getContainerRights() { + return containerRights; + } + public Content getContent() { return content; } @@ -52,18 +64,6 @@ return contentRights; } - public Container getFolder() { - return container; - } - - public AccessLists getFolderAccessLists() { - return folderAccessLists; - } - - public AccessRights getFolderRights() { - return folderRights; - } - public AccessLists getGroupAccessLists() { return groupAccessLists; } @@ -72,18 +72,31 @@ return groupRights; } + public boolean hasContainerRights() { + return containerRights != null; + } + public boolean hasContentRights() { return contentRights != null; } - public boolean hasFolderRights() { - return folderRights != null; - } - public boolean hasGroupRights() { return groupRights != null; } + public void setContainer(final Container container) { + this.container = container; + containerAccessLists = container != null ? getContainerAccessLists(container) : null; + groupAccessLists = containerAccessLists; + } + + public void setContainerRights(final AccessRights accessRights) { + this.containerRights = accessRights; + if (equalsAccessLists()) { + this.contentRights = accessRights; + } + } + public void setContent(final Content descriptor) { this.content = descriptor; contentAccessLists = descriptor != null ? getContentAccessList(descriptor) : null; @@ -92,39 +105,26 @@ public void setContentRights(final AccessRights accessRights) { this.contentRights = accessRights; if (equalsAccessLists()) { - this.folderRights = accessRights; + this.containerRights = accessRights; } } public void setContentWidthFolderRights(final Content content) { setContent(content); - this.contentRights = folderRights; + this.contentRights = containerRights; } - public void setFolder(final Container container) { - this.container = container; - folderAccessLists = container != null ? getFolderAccessLists(container) : null; - groupAccessLists = folderAccessLists; - } - - public void setFolderRights(final AccessRights accessRights) { - this.folderRights = accessRights; - if (equalsAccessLists()) { - this.contentRights = accessRights; - } - } - public void setGroupRights(final AccessRights accessRights) { this.groupRights = accessRights; } private boolean equalsAccessLists() { - if (contentAccessLists == folderAccessLists) { + if (contentAccessLists == containerAccessLists) { return true; } else if (contentAccessLists != null) { - return contentAccessLists.equals(folderAccessLists); + return contentAccessLists.equals(containerAccessLists); } else { - return folderAccessLists.equals(contentAccessLists); + return containerAccessLists.equals(contentAccessLists); } } @@ -139,7 +139,7 @@ return accessLists; } - private AccessLists getFolderAccessLists(final Container container) { + private AccessLists getContainerAccessLists(final Container container) { return container.getOwner().getSocialNetwork().getAccessLists(); } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessService.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessService.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessService.java 2008-09-18 00:45:41 UTC (rev 872) @@ -22,16 +22,17 @@ import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.errors.DefaultException; +import org.ourproject.kune.platf.server.domain.Container; import org.ourproject.kune.platf.server.domain.Content; import org.ourproject.kune.platf.server.domain.Group; import org.ourproject.kune.platf.server.domain.User; public interface AccessService { - Content accessToContent(Long contentId, User user, AccessType accessType) throws DefaultException; + Container accessToContainer(Long folderId, User user, AccessRol accessRol) throws DefaultException; - Access getAccess(User user, StateToken token, Group defaultGroup, AccessType accessType) throws DefaultException; + Content accessToContent(Long contentId, User user, AccessRol accessRol) throws DefaultException; - Access getFolderAccess(Group group, Long folderId, User user, AccessType accessType) throws DefaultException; + Access getAccess(User user, StateToken token, Group defaultGroup, AccessRol accessRol) throws DefaultException; } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessServiceDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessServiceDefault.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessServiceDefault.java 2008-09-18 00:45:41 UTC (rev 872) @@ -49,40 +49,37 @@ this.groupFinder = groupFinder; } - public Content accessToContent(final Long contentId, final User user, final AccessType accessType) + public Container accessToContainer(final Long folderId, final User user, final AccessRol accessRol) throws DefaultException { + final Container folder = finder.getFolder(folderId); + final Access access = new Access(null, folder); + addFolderRights(access, user); + addGroupRights(access, user); + return check(access, access.getContainerRights(), accessRol).getContainer(); + } + + public Content accessToContent(final Long contentId, final User user, final AccessRol accessRol) + throws DefaultException { final Content descriptor = finder.getContent(contentId); final Access access = new Access(descriptor, null); addContentRights(access, user); - return check(access, access.getContentRights(), accessType).getContent(); + return check(access, access.getContentRights(), accessRol).getContent(); } - public Access getAccess(final User user, final StateToken token, final Group defaultGroup, - final AccessType accessType) throws DefaultException { + public Access getAccess(final User user, final StateToken token, final Group defaultGroup, final AccessRol accessRol) + throws DefaultException { checkGroupExistence(token); final Content descriptor = finder.getContent(token, defaultGroup); final Access access = new Access(descriptor, descriptor.getContainer()); addContentRights(access, user); addFolderRights(access, user); addGroupRights(access, user); - if (!isValid(accessType, access.getContentRights()) || !isValid(accessType, access.getFolderRights())) { + if (!isValid(accessRol, access.getContentRights()) || !isValid(accessRol, access.getContainerRights())) { throw new AccessViolationException(); } return access; } - public Access getFolderAccess(final Group group, final Long folderId, final User user, final AccessType accessType) - throws DefaultException { - final Container folder = finder.getFolder(folderId); - if (!folder.getOwner().equals(group)) { - throw new AccessViolationException(); - } - final Access access = new Access(null, folder); - addFolderRights(access, user); - addGroupRights(access, user); - return check(access, access.getFolderRights(), accessType); - } - private void addContentRights(final Access access, final User user) { if (!access.hasContentRights()) { access.setContentRights(accessRightsService.get(user, access.getContentAccessLists())); @@ -90,8 +87,8 @@ } private void addFolderRights(final Access access, final User user) { - if (!access.hasFolderRights()) { - access.setFolderRights(accessRightsService.get(user, access.getFolderAccessLists())); + if (!access.hasContainerRights()) { + access.setContainerRights(accessRightsService.get(user, access.getContainerAccessLists())); } } @@ -101,9 +98,9 @@ } } - private Access check(final Access access, final AccessRights rights, final AccessType accessType) + private Access check(final Access access, final AccessRights rights, final AccessRol accessRol) throws AccessViolationException { - if (!isValid(accessType, rights)) { + if (!isValid(accessRol, rights)) { throw new AccessViolationException(); } return access; @@ -120,13 +117,13 @@ } } - private boolean isValid(final AccessType accessType, final AccessRights rights) { - switch (accessType) { - case READ: + private boolean isValid(final AccessRol accessRol, final AccessRights rights) { + switch (accessRol) { + case Viewer: return rights.isVisible(); - case EDIT: + case Editor: return rights.isEditable(); - case ADMIN: + case Administrator: return rights.isAdministrable(); default: return false; Deleted: trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessType.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessType.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/access/AccessType.java 2008-09-18 00:45:41 UTC (rev 872) @@ -1,28 +0,0 @@ -/* - * - * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) - * This file is part of kune. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -/** - * - */ -package org.ourproject.kune.platf.server.access; - -public enum AccessType { - READ, EDIT, ADMIN; -} \ No newline at end of file Added: trunk/src/main/java/org/ourproject/kune/platf/server/auth/ActionLevel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/ActionLevel.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/ActionLevel.java 2008-09-18 00:45:41 UTC (rev 872) @@ -0,0 +1,5 @@ +package org.ourproject.kune.platf.server.auth; + +public enum ActionLevel { + group, tool, container, content +} Modified: trunk/src/main/java/org/ourproject/kune/platf/server/auth/Authorizated.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/Authorizated.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/Authorizated.java 2008-09-18 00:45:41 UTC (rev 872) @@ -23,7 +23,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import org.ourproject.kune.platf.server.access.AccessType; +import org.ourproject.kune.platf.server.access.AccessRol; import com.google.inject.BindingAnnotation; @@ -40,8 +40,13 @@ @Retention(RetentionPolicy.RUNTIME) public @interface Authorizated { - AccessType accessTypeRequired() default AccessType.READ; + AccessRol accessRolRequired() default AccessRol.Viewer; - boolean checkContent() default false; + /** + * If the action is over a "group", "tool", "container" or over the content. + * + * @return + */ + ActionLevel actionLevel() default ActionLevel.content; } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptor.java 2008-09-18 00:45:41 UTC (rev 872) @@ -23,97 +23,108 @@ import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; +import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.errors.AccessViolationException; import org.ourproject.kune.platf.client.errors.ContentNotFoundException; import org.ourproject.kune.platf.server.UserSession; +import org.ourproject.kune.platf.server.access.AccessRights; +import org.ourproject.kune.platf.server.access.AccessRightsService; +import org.ourproject.kune.platf.server.access.AccessRol; import org.ourproject.kune.platf.server.access.AccessService; -import org.ourproject.kune.platf.server.access.AccessType; +import org.ourproject.kune.platf.server.domain.Container; import org.ourproject.kune.platf.server.domain.Content; import org.ourproject.kune.platf.server.domain.Group; -import org.ourproject.kune.platf.server.domain.SocialNetwork; import org.ourproject.kune.platf.server.domain.User; import org.ourproject.kune.platf.server.manager.GroupManager; import com.google.inject.Inject; import com.google.inject.Provider; +import com.google.inject.Singleton; +@Singleton public class AuthorizatedMethodInterceptor implements MethodInterceptor { @Inject - Provider<UserSession> userSessionProvider; + private Provider<UserSession> userSessionProvider; @Inject - Provider<GroupManager> groupManagerProvider; + private Provider<GroupManager> groupManagerProvider; @Inject - Provider<AccessService> accessServiceProvider; + private Provider<AccessRightsService> accessRightsServiceProvider; + @Inject + private Provider<AccessService> accessServiceProvider; public Object invoke(final MethodInvocation invocation) throws Throwable { - Object[] arguments = invocation.getArguments(); - String groupShortName = (String) arguments[1]; + final Object[] arguments = invocation.getArguments(); + final StateToken token = (StateToken) arguments[1]; - UserSession userSession = userSessionProvider.get(); - GroupManager groupManager = groupManagerProvider.get(); - AccessService accessService = accessServiceProvider.get(); + final UserSession userSession = userSessionProvider.get(); + final GroupManager groupManager = groupManagerProvider.get(); + final AccessService accessService = accessServiceProvider.get(); - Authorizated authoAnnotation = invocation.getStaticPart().getAnnotation(Authorizated.class); - AccessType accessType = authoAnnotation.accessTypeRequired(); - boolean checkContent = authoAnnotation.checkContent(); + final Authorizated authoAnnotation = invocation.getStaticPart().getAnnotation(Authorizated.class); + final AccessRol accessRol = authoAnnotation.accessRolRequired(); + final ActionLevel actionLevel = authoAnnotation.actionLevel(); - User user = userSession.getUser(); - Group group = Group.NO_GROUP; - try { - group = groupManager.findByShortName(groupShortName); - } catch (NoResultException e) { - // continue, and check later - } + final User user = userSession.getUser(); + Group group = Group.NO_GROUP; + try { + group = groupManager.findByShortName(token.getGroup()); + } catch (final NoResultException e) { + // continue, and check later + } - if (checkContent) { - String contentIdS = (String) arguments[2]; - Long contentId = parseId(contentIdS); - Content content = accessService.accessToContent(contentId, user, accessType); - if (!content.getContainer().getOwner().equals(group)) { - throw new AccessViolationException(); - } - } + switch (actionLevel) { + case content: + default: + final Content content = accessService.accessToContent(parseId(token.getDocument()), user, accessRol); + if (!content.getContainer().getOwner().equals(group)) { + throw new AccessViolationException(); + } + if (!content.getContainer().getId().equals(parseId(token.getFolder()))) { + throw new AccessViolationException(); + } + if (!content.getContainer().getToolName().equals(token.getTool())) { + throw new AccessViolationException(); + } + case container: + final Container container = accessService.accessToContainer(parseId(token.getFolder()), user, accessRol); + if (!container.getOwner().equals(group)) { + throw new AccessViolationException(); + } + case tool: + case group: + break; + } - if (!correctMember(user, group, accessType)) { - throw new AccessViolationException(); - } + if (!correctMember(user, group, accessRol)) { + throw new AccessViolationException(); + } - Object result = invocation.proceed(); - return result; + return invocation.proceed(); } - private boolean correctMember(final User user, final Group group, final AccessType memberType) - throws AccessViolationException { - boolean correctMember = false; + private boolean correctMember(final User user, final Group group, final AccessRol memberType) + throws AccessViolationException { - if (group == Group.NO_GROUP) { - throw new AccessViolationException(); - } - SocialNetwork sn = group.getSocialNetwork(); - Group userGroup; + final AccessRights accessRights = accessRightsServiceProvider.get().get(user, + group.getSocialNetwork().getAccessLists()); - if (user == null) { - userGroup = Group.NO_GROUP; - } else { - userGroup = user.getUserGroup(); - } - - if (memberType.equals(AccessType.ADMIN)) { - correctMember = sn.isAdmin(userGroup); - } else if (memberType.equals(AccessType.EDIT)) { - correctMember = sn.isCollab(userGroup) || sn.isAdmin(userGroup); - } else if (memberType.equals(AccessType.READ)) { - correctMember = sn.isViewer(userGroup) || sn.isCollab(userGroup) || sn.isAdmin(userGroup); - } - return correctMember; + switch (memberType) { + case Administrator: + return accessRights.isAdministrable(); + case Editor: + return accessRights.isEditable(); + default: + return accessRights.isVisible(); + } } private Long parseId(final String documentId) throws ContentNotFoundException { - try { - return new Long(documentId); - } catch (final NumberFormatException e) { - throw new ContentNotFoundException(); - } + try { + return new Long(documentId); + } catch (final NumberFormatException e) { + throw new ContentNotFoundException(); + } } + } Deleted: trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizated.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizated.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizated.java 2008-09-18 00:45:41 UTC (rev 872) @@ -1,44 +0,0 @@ -/* - * - * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) - * This file is part of kune. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -package org.ourproject.kune.platf.server.auth; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import org.ourproject.kune.platf.server.access.AccessType; - -import com.google.inject.BindingAnnotation; - -/** - * Use in RPC methods, for instance: <code> - * Authorizated(authLevelRequired = AuthLevelRequired.COLLAB, checkContent = true) </code> - * - * The first parameter in the method must be the userHash, the second parameter - * must be a content token - * - */ -@BindingAnnotation -@Retention(RetentionPolicy.RUNTIME) -public @interface ContentAuthorizated { - - AccessType accessTypeRequired() default AccessType.READ; - -} Deleted: trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizatedMethodInterceptor.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizatedMethodInterceptor.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/ContentAuthorizatedMethodInterceptor.java 2008-09-18 00:45:41 UTC (rev 872) @@ -1,85 +0,0 @@ -/* - * - * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) - * This file is part of kune. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -package org.ourproject.kune.platf.server.auth; - -import javax.persistence.NoResultException; - -import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; -import org.ourproject.kune.platf.client.dto.StateToken; -import org.ourproject.kune.platf.client.errors.AccessViolationException; -import org.ourproject.kune.platf.client.errors.ContentNotFoundException; -import org.ourproject.kune.platf.server.UserSession; -import org.ourproject.kune.platf.server.access.AccessService; -import org.ourproject.kune.platf.server.access.AccessType; -import org.ourproject.kune.platf.server.domain.Content; -import org.ourproject.kune.platf.server.domain.Group; -import org.ourproject.kune.platf.server.domain.User; -import org.ourproject.kune.platf.server.manager.GroupManager; - -import com.google.inject.Inject; -import com.google.inject.Provider; - -public class ContentAuthorizatedMethodInterceptor implements MethodInterceptor { - - @Inject - Provider<UserSession> userSessionProvider; - @Inject - Provider<GroupManager> groupManagerProvider; - @Inject - Provider<AccessService> accessServiceProvider; - - public Object invoke(final MethodInvocation invocation) throws Throwable { - final Object[] arguments = invocation.getArguments(); - final String groupShortName = (String) arguments[1]; - - final UserSession userSession = userSessionProvider.get(); - final GroupManager groupManager = groupManagerProvider.get(); - final AccessService accessService = accessServiceProvider.get(); - - final ContentAuthorizated authoAnnotation = invocation.getStaticPart().getAnnotation(ContentAuthorizated.class); - final AccessType accessType = authoAnnotation.accessTypeRequired(); - - final User user = userSession.getUser(); - Group group = Group.NO_GROUP; - try { - group = groupManager.findByShortName(groupShortName); - } catch (final NoResultException e) { - // continue, and check later - } - final StateToken contentToken = (StateToken) arguments[2]; - final Long contentId = parseId(contentToken.getDocument()); - - final Content content = accessService.accessToContent(contentId, user, accessType); - if (!content.getContainer().getOwner().equals(group)) { - throw new AccessViolationException(); - } - final Object result = invocation.proceed(); - return result; - } - - private Long parseId(final String documentId) throws ContentNotFoundException { - try { - return new Long(documentId); - } catch (final NumberFormatException e) { - throw new ContentNotFoundException(); - } - } -} Deleted: trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizated.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizated.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizated.java 2008-09-18 00:45:41 UTC (rev 872) @@ -1,24 +0,0 @@ -package org.ourproject.kune.platf.server.auth; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -import org.ourproject.kune.platf.server.access.AccessType; - -import com.google.inject.BindingAnnotation; - -/** - * Use in RPC methods, for instance: <code> - * GroupAuthorizated(authLevelRequired = AuthLevelRequired.COLLAB) </code> - * - * The first parameter in the method must be the userHash, the second the group - * shortName - * - */ -@BindingAnnotation -@Retention(RetentionPolicy.RUNTIME) -public @interface GroupAuthorizated { - - AccessType accessTypeRequired() default AccessType.READ; - -} Deleted: trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizatedMethodInterceptor.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizatedMethodInterceptor.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/auth/GroupAuthorizatedMethodInterceptor.java 2008-09-18 00:45:41 UTC (rev 872) @@ -1,89 +0,0 @@ -/* - * - * Copyright (C) 2007-2008 The kune development team (see CREDITS for details) - * This file is part of kune. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ -package org.ourproject.kune.platf.server.auth; - -import javax.persistence.NoResultException; - -import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; -import org.ourproject.kune.platf.client.errors.AccessViolationException; -import org.ourproject.kune.platf.server.UserSession; -import org.ourproject.kune.platf.server.access.AccessRights; -import org.ourproject.kune.platf.server.access.AccessRightsService; -import org.ourproject.kune.platf.server.access.AccessType; -import org.ourproject.kune.platf.server.domain.Group; -import org.ourproject.kune.platf.server.domain.User; -import org.ourproject.kune.platf.server.manager.GroupManager; - -import com.google.inject.Inject; -import com.google.inject.Provider; - -public class GroupAuthorizatedMethodInterceptor implements MethodInterceptor { - - @Inject - Provider<UserSession> userSessionProvider; - @Inject - Provider<GroupManager> groupManagerProvider; - @Inject - Provider<AccessRightsService> accessRightsServiceProvider; - - public Object invoke(final MethodInvocation invocation) throws Throwable { - final Object[] arguments = invocation.getArguments(); - final String groupShortName = (String) arguments[1]; - - final UserSession userSession = userSessionProvider.get(); - final GroupManager groupManager = groupManagerProvider.get(); - - final GroupAuthorizated authoAnnotation = invocation.getStaticPart().getAnnotation(GroupAuthorizated.class); - final AccessType accessType = authoAnnotation.accessTypeRequired(); - - final User user = userSession.getUser(); - - Group group = Group.NO_GROUP; - try { - group = groupManager.findByShortName(groupShortName); - } catch (final NoResultException e) { - throw new AccessViolationException(); - } - - if (!correctMember(user, group, accessType)) { - throw new AccessViolationException(); - } - - final Object result = invocation.proceed(); - return result; - } - - private boolean correctMember(final User user, final Group group, final AccessType memberType) - throws AccessViolationException { - final AccessRightsService accessRightsService = accessRightsServiceProvider.get(); - final AccessRights accessRights = accessRightsService.get(user, group.getSocialNetwork().getAccessLists()); - - switch (memberType) { - case ADMIN: - return accessRights.isAdministrable(); - case EDIT: - return accessRights.isEditable(); - default: - return accessRights.isVisible(); - } - } - -} Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/GroupManager.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/GroupManager.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/GroupManager.java 2008-09-18 00:45:41 UTC (rev 872) @@ -26,26 +26,27 @@ import org.ourproject.kune.platf.client.errors.EmailAddressInUseException; import org.ourproject.kune.platf.client.errors.GroupNameInUseException; import org.ourproject.kune.platf.client.errors.UserMustBeLoggedException; +import org.ourproject.kune.platf.server.domain.Content; import org.ourproject.kune.platf.server.domain.Group; import org.ourproject.kune.platf.server.domain.User; import org.ourproject.kune.platf.server.manager.impl.SearchResult; public interface GroupManager extends Manager<Group, Long> { - Group findByShortName(String groupName); + void changeWsTheme(User user, Group group, String theme) throws AccessViolationException; + Group createGroup(Group group, User user) throws GroupNameInUseException, UserMustBeLoggedException; + + Group createUserGroup(User user) throws GroupNameInUseException, EmailAddressInUseException; + List<Group> findAdminInGroups(Long groupId); + Group findByShortName(String groupName); + List<Group> findCollabInGroups(Long groupId); - Group createGroup(Group group, User user) throws GroupNameInUseException, UserMustBeLoggedException; - - Group createUserGroup(User user) throws GroupNameInUseException, EmailAddressInUseException; - Group getDefaultGroup(); - void changeWsTheme(User user, Group group, String theme) throws AccessViolationException; - /** * IMPORTANT: returns null if userId is null * @@ -54,10 +55,12 @@ */ Group getGroupOfUserWithId(Long userId); + void reIndex(); + SearchResult<Group> search(String search); SearchResult<Group> search(String search, Integer firstResult, Integer maxResults); - void reIndex(); + void setDefaultContent(String groupShortName, Content content); } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/GroupManagerDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/GroupManagerDefault.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/manager/impl/GroupManagerDefault.java 2008-09-18 00:45:41 UTC (rev 872) @@ -37,6 +37,7 @@ import org.ourproject.kune.platf.client.errors.UserMustBeLoggedException; import org.ourproject.kune.platf.server.domain.AccessLists; import org.ourproject.kune.platf.server.domain.AdmissionType; +import org.ourproject.kune.platf.server.domain.Content; import org.ourproject.kune.platf.server.domain.Group; import org.ourproject.kune.platf.server.domain.GroupListMode; import org.ourproject.kune.platf.server.domain.License; @@ -170,6 +171,11 @@ return super.search(query, firstResult, maxResults); } + public void setDefaultContent(final String groupShortName, final Content content) { + final Group group = findByShortName(groupShortName); + group.setDefaultContent(content); + } + private void initGroup(final User user, final Group group) throws GroupNameInUseException { try { persist(group); Modified: trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/rpc/ContentRPC.java 2008-09-18 00:45:41 UTC (rev 872) @@ -44,8 +44,9 @@ import org.ourproject.kune.platf.server.UserSession; import org.ourproject.kune.platf.server.access.Access; import org.ourproject.kune.platf.server.access.AccessRightsService; +import org.ourproject.kune.platf.server.access.AccessRol; import org.ourproject.kune.platf.server.access.AccessService; -import org.ourproject.kune.platf.server.access.AccessType; +import org.ourproject.kune.platf.server.auth.ActionLevel; import org.ourproject.kune.platf.server.auth.Authenticated; import org.ourproject.kune.platf.server.auth.Authorizated; import org.ourproject.kune.platf.server.content.CommentManager; @@ -109,75 +110,78 @@ } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public void addAuthor(final String userHash, final String groupShortName, final String documentId, - final String authorShortName) throws DefaultException { - final Long contentId = parseId(documentId); + public void addAuthor(final String userHash, final StateToken token, final String authorShortName) + throws DefaultException { + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.addAuthor(user, contentId, authorShortName); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.READ) + @Authorizated(accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_WRITE) - public CommentDTO addComment(final String userHash, final String groupShortName, final String documentId, - final Long parentCommentId, final String commentText) throws DefaultException { + public CommentDTO addComment(final String userHash, final StateToken token, final Long parentCommentId, + final String commentText) throws DefaultException { final UserSession userSession = getUserSession(); final User author = userSession.getUser(); - final Long contentId = parseId(documentId); + final Long contentId = parseId(token.getDocument()); final Comment comment = commentManager.addComment(author, contentId, commentText, parentCommentId); return mapper.map(comment, CommentDTO.class); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.READ) + @Authorizated(accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_WRITE) - public CommentDTO addComment(final String userHash, final String groupShortName, final String documentId, - final String commentText) throws DefaultException { + public CommentDTO addComment(final String userHash, final StateToken token, final String commentText) + throws DefaultException { final UserSession userSession = getUserSession(); final User author = userSession.getUser(); - final Long contentId = parseId(documentId); + final Long contentId = parseId(token.getDocument()); final Comment comment = commentManager.addComment(author, contentId, commentText); return mapper.map(comment, CommentDTO.class); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT) + @Authorizated(actionLevel = ActionLevel.container, accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public StateDTO addContent(final String userHash, final String groupShortName, final Long parentFolderId, - final String title) throws DefaultException { - final Group group = groupManager.findByShortName(groupShortName); + public StateDTO addContent(final String userHash, final StateToken parentToken, final String title) + throws DefaultException { + final Group group = groupManager.findByShortName(parentToken.getGroup()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); final boolean userIsLoggedIn = userSession.isUserLoggedIn(); - final Access access = accessService.getFolderAccess(group, parentFolderId, user, AccessType.EDIT); - access.setContentWidthFolderRights(creationService.createContent(title, "", user, access.getFolder())); + final Container container = accessService.accessToContainer(parseId(parentToken.getFolder()), user, + AccessRol.Editor); + final Content addedContent = creationService.createContent(title, "", user, container); + final Access access = accessService.getAccess(user, addedContent.getStateToken(), group, AccessRol.Editor); final State state = stateService.create(access); completeState(user, userIsLoggedIn, group, state); return mapState(state, user, group); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT) + @Authorizated(actionLevel = ActionLevel.container, accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public StateDTO addFolder(final String userHash, final String groupShortName, final Long parentFolderId, - final String title, final String contentTypeId) throws DefaultException { - final Group group = groupManager.findByShortName(groupShortName); + public StateDTO addFolder(final String userHash, final StateToken parentToken, final String title, + final String contentTypeId) throws DefaultException { + final Group group = groupManager.findByShortName(parentToken.getGroup()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); final boolean userIsLoggedIn = userSession.isUserLoggedIn(); - final State state = createFolder(groupShortName, parentFolderId, title, contentTypeId); + final State state = createFolder(parentToken.getGroup(), parseId(parentToken.getFolder()), title, contentTypeId); completeState(user, userIsLoggedIn, group, state); return mapState(state, user, group); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT) + @Authorizated(actionLevel = ActionLevel.container, accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public StateDTO addRoom(final String userHash, final String groupShortName, final Long parentFolderId, - final String roomName) throws DefaultException { + public StateDTO addRoom(final String userHash, final StateToken parentToken, final String roomName) + throws DefaultException { + final String groupShortName = parentToken.getGroup(); final Group group = groupManager.findByShortName(groupShortName); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); @@ -188,7 +192,8 @@ xmppManager.createRoom(connection, roomName, userShortName + userHash); xmppManager.disconnect(connection); try { - final State state = createFolder(groupShortName, parentFolderId, roomName, ChatServerTool.TYPE_ROOM); + final State state = createFolder(groupShortName, parseId(parentToken.getFolder()), roomName, + ChatServerTool.TYPE_ROOM); completeState(user, userIsLoggedIn, group, state); return mapState(state, user, group); } catch (final ContentNotFoundException e) { @@ -204,11 +209,10 @@ } @Authenticated - @Authorizated(accessTypeRequired = AccessType.ADMIN, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public void delContent(final String userHash, final String groupShortName, final String documentId) - throws DefaultException { - final Long contentId = parseId(documentId); + public void delContent(final String userHash, final StateToken token) throws DefaultException { + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.delContent(user, contentId); @@ -219,8 +223,7 @@ // contents for instance) @Authenticated(mandatory = false) @Transactional(type = TransactionType.READ_ONLY) - public StateDTO getContent(final String userHash, final String groupShortName, final StateToken token) - throws DefaultException { + public StateDTO getContent(final String userHash, final StateToken token) throws DefaultException { Group defaultGroup; final UserSession userSession = getUserSession(); final User user = userSession.getUser(); @@ -232,7 +235,7 @@ } Access access; try { - access = accessService.getAccess(user, token, defaultGroup, AccessType.READ); + access = accessService.getAccess(user, token, defaultGroup, AccessRol.Viewer); } catch (final NoResultException e) { throw new ContentNotFoundException(); } catch (final ToolNotFoundException e) { @@ -245,33 +248,32 @@ } @Authenticated(mandatory = false) - @Authorizated(accessTypeRequired = AccessType.READ) + @Authorizated(accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_ONLY) - public List<TagResultDTO> getSummaryTags(final String userHash, final String groupShortName) { - final Group group = groupManager.findByShortName(groupShortName); + public List<TagResultDTO> getSummaryTags(final String userHash, final StateToken groupToken) { + final Group group = groupManager.findByShortName(groupToken.getGroup()); return getSummaryTags(group); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.READ) + @Authorizated(accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_WRITE) - public CommentDTO markCommentAsAbuse(final String userHash, final String groupShortName, final String documentId, - final Long commentId) throws DefaultException { + public CommentDTO markCommentAsAbuse(final String userHash, final StateToken token, final Long commentId) + throws DefaultException { final UserSession userSession = getUserSession(); final User informer = userSession.getUser(); - final Long contentId = parseId(documentId); + final Long contentId = parseId(token.getDocument()); final Comment comment = commentManager.markAsAbuse(informer, contentId, commentId); return mapper.map(comment, CommentDTO.class); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.READ, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_WRITE) - public void rateContent(final String userHash, final String groupShortName, final String documentId, - final Double value) throws DefaultException { + public void rateContent(final String userHash, final StateToken token, final Double value) throws DefaultException { final UserSession userSession = getUserSession(); final User rater = userSession.getUser(); - final Long contentId = parseId(documentId); + final Long contentId = parseId(token.getDocument()); if (userSession.isUserLoggedIn()) { contentManager.rateContent(rater, contentId, value); @@ -281,100 +283,105 @@ } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public void removeAuthor(final String userHash, final String groupShortName, final String documentId, - final String authorShortName) throws DefaultException { - final Long contentId = parseId(documentId); + public void removeAuthor(final String userHash, final StateToken token, final String authorShortName) + throws DefaultException { + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.removeAuthor(user, contentId, authorShortName); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT) + @Authorizated(actionLevel = ActionLevel.container, accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public String rename(final String userHash, final String groupShortName, final String token, final String newName) + public String renameContainer(final String userHash, final StateToken token, final String newName) throws DefaultException { - String result; + return renameFolder(token.getGroup(), parseId(token.getFolder()), newName); + } + + @Authenticated + @Authorizated(accessRolRequired = AccessRol.Editor) + @Transactional(type = TransactionType.READ_WRITE) + public String renameContent(final String userHash, final StateToken token, final String newName) + throws DefaultException { final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final StateToken stateToken = new StateToken(token); - final Group group = groupManager.findByShortName(groupShortName); - if (stateToken.isComplete()) { - try { - final Content content = accessService.accessToContent(parseId(stateToken.getDocument()), user, - AccessType.EDIT); - if (!content.getContainer().getOwner().equals(group)) { - throw new AccessViolationException(); - } - } catch (final NoResultException e) { - throw new AccessViolationException(); - } - result = renameContent(stateToken.getDocument(), newName); - } else { - result = renameFolder(groupShortName, parseId(stateToken.getFolder()), newName); + try { + accessService.accessToContent(parseId(token.getDocument()), user, AccessRol.Editor); + } catch (final NoResultException e) { + throw new AccessViolationException(); } - return result; + return renameContent(token.getDocument(), newName); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public Integer save(final String userHash, final String groupShortName, final String documentId, - final String textContent) throws DefaultException { + public Integer save(final String userHash, final StateToken token, final String textContent) + throws DefaultException { - final Long contentId = parseId(documentId); + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Content content = accessService.accessToContent(contentId, user, AccessType.EDIT); + final Content content = accessService.accessToContent(contentId, user, AccessRol.Editor); final Content descriptor = creationService.saveContent(user, content, textContent); return descriptor.getVersion(); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public I18nLanguageDTO setLanguage(final String userHash, final String groupShortName, final String documentId, - final String languageCode) throws DefaultException { - final Long contentId = parseId(documentId); + public ContentDTO setAsDefaultContent(final String userHash, final StateToken token) { + final Content content = contentManager.find(parseId(token.getDocument())); + groupManager.setDefaultContent(token.getGroup(), content); + return mapper.map(content, ContentDTO.class); + } + + @Authenticated + @Authorizated(accessRolRequired = AccessRol.Editor) + @Transactional(type = TransactionType.READ_WRITE) + public I18nLanguageDTO setLanguage(final String userHash, final StateToken token, final String languageCode) + throws DefaultException { + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); return mapper.map(contentManager.setLanguage(user, contentId, languageCode), I18nLanguageDTO.class); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public void setPublishedOn(final String userHash, final String groupShortName, final String documentId, - final Date publishedOn) throws DefaultException { - final Long contentId = parseId(documentId); + public void setPublishedOn(final String userHash, final StateToken token, final Date publishedOn) + throws DefaultException { + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); contentManager.setPublishedOn(user, contentId, publishedOn); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.EDIT, checkContent = true) + @Authorizated(accessRolRequired = AccessRol.Editor) @Transactional(type = TransactionType.READ_WRITE) - public List<TagResultDTO> setTags(final String userHash, final String groupShortName, final String documentId, - final String tags) throws DefaultException { - final Long contentId = parseId(documentId); + public List<TagResultDTO> setTags(final String userHash, final StateToken token, final String tags) + throws DefaultException { + final Long contentId = parseId(token.getDocument()); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(token.getGroup()); contentManager.setTags(user, contentId, tags); return getSummaryTags(group); } @Authenticated - @Authorizated(accessTypeRequired = AccessType.READ) + @Authorizated(accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_WRITE) - public CommentDTO voteComment(final String userHash, final String groupShortName, final String documentId, - final Long commentId, final boolean votePositive) throws DefaultException { + public CommentDTO voteComment(final String userHash, final StateToken token, final Long commentId, + final boolean votePositive) throws DefaultException { final UserSession userSession = getUserSession(); final User voter = userSession.getUser(); - final Long contentId = parseId(documentId); + final Long contentId = parseId(token.getDocument()); final Comment comment = commentManager.vote(voter, contentId, commentId, votePositive); return mapper.map(comment, CommentDTO.class); } @@ -401,11 +408,11 @@ final User user = userSession.getUser(); final Group group = groupManager.findByShortName(groupShortName); - Access access = accessService.getFolderAccess(group, parentFolderId, user, AccessType.EDIT); + accessService.accessToContainer(parentFolderId, user, AccessRol.Editor); final Container container = creationService.createFolder(group, parentFolderId, title, user.getLanguage(), typeId); - access = accessService.getAccess(user, container.getStateToken(), group, AccessType.EDIT); + final Access access = accessService.getAccess(user, container.getStateToken(), group, AccessRol.Editor); final State state = stateService.create(access); return state; } @@ -436,9 +443,9 @@ return stateDTO; } - private Long parseId(final String documentId) throws ContentNotFoundException { + private Long parseId(final String id) throws ContentNotFoundException { try { - return new Long(documentId); + return new Long(id); } catch (final NumberFormatException e) { throw new ContentNotFoundException(); } @@ -457,7 +464,8 @@ final Group group = groupManager.findByShortName(groupShortName); final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Access folderAccess = accessService.getFolderAccess(group, folderId, user, AccessType.EDIT); - return containerManager.renameFolder(group, folderAccess.getFolder(), newName); + final Container container = accessService.accessToContainer(folderId, user, AccessRol.Editor); + return containerManager.renameFolder(group, container, newName); } + } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/rpc/GroupRPC.java 2008-09-18 00:45:41 UTC (rev 872) @@ -27,9 +27,10 @@ import org.ourproject.kune.platf.client.errors.DefaultException; import org.ourproject.kune.platf.client.rpc.GroupService; import org.ourproject.kune.platf.server.UserSession; -import org.ourproject.kune.platf.server.access.AccessType; +import org.ourproject.kune.platf.server.access.AccessRol; +import org.ourproject.kune.platf.server.auth.ActionLevel; import org.ourproject.kune.platf.server.auth.Authenticated; -import org.ourproject.kune.platf.server.auth.GroupAuthorizated; +import org.ourproject.kune.platf.server.auth.Authorizated; import org.ourproject.kune.platf.server.content.ContentManager; import org.ourproject.kune.platf.server.domain.Group; import org.ourproject.kune.platf.server.domain.User; @@ -60,13 +61,13 @@ } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE, rollbackOn = DefaultException.class) - public void changeGroupWsTheme(final String userHash, final String groupShortName, final String theme) + public void changeGroupWsTheme(final String userHash, final StateToken groupToken, final String theme) throws DefaultException { final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); groupManager.changeWsTheme(user, group, theme); } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/rpc/SocialNetworkRPC.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/rpc/SocialNetworkRPC.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/rpc/SocialNetworkRPC.java 2008-09-18 00:45:41 UTC (rev 872) @@ -23,12 +23,14 @@ import org.ourproject.kune.platf.client.dto.SocialNetworkDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkRequestResult; import org.ourproject.kune.platf.client.dto.SocialNetworkResultDTO; +import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.errors.DefaultException; import org.ourproject.kune.platf.client.rpc.SocialNetworkService; import org.ourproject.kune.platf.server.UserSession; -import org.ourproject.kune.platf.server.access.AccessType; +import org.ourproject.kune.platf.server.access.AccessRol; +import org.ourproject.kune.platf.server.auth.ActionLevel; import org.ourproject.kune.platf.server.auth.Authenticated; -import org.ourproject.kune.platf.server.auth.GroupAuthorizated; +import org.ourproject.kune.platf.server.auth.Authorizated; import org.ourproject.kune.platf.server.domain.Group; import org.ourproject.kune.platf.server.domain.User; import org.ourproject.kune.platf.server.manager.GroupManager; @@ -59,78 +61,78 @@ } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO AcceptJoinGroup(final String hash, final String groupShortName, + public SocialNetworkResultDTO AcceptJoinGroup(final String hash, final StateToken groupToken, final String groupToAcceptShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToAccept = groupManager.findByShortName(groupToAcceptShortName); socialNetworkManager.acceptJoinGroup(userLogged, groupToAccept, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO addAdminMember(final String hash, final String groupShortName, + public SocialNetworkResultDTO addAdminMember(final String hash, final StateToken groupToken, final String groupToAddShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToAdd = groupManager.findByShortName(groupToAddShortName); socialNetworkManager.addGroupToAdmins(userLogged, groupToAdd, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO addCollabMember(final String hash, final String groupShortName, + public SocialNetworkResultDTO addCollabMember(final String hash, final StateToken groupToken, final String groupToAddShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToAdd = groupManager.findByShortName(groupToAddShortName); socialNetworkManager.addGroupToCollabs(userLogged, groupToAdd, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO addViewerMember(final String hash, final String groupShortName, + public SocialNetworkResultDTO addViewerMember(final String hash, final StateToken groupToken, final String groupToAddShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToAdd = groupManager.findByShortName(groupToAddShortName); socialNetworkManager.addGroupToViewers(userLogged, groupToAdd, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO deleteMember(final String hash, final String groupShortName, + public SocialNetworkResultDTO deleteMember(final String hash, final StateToken groupToken, final String groupToDeleleShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToDelete = groupManager.findByShortName(groupToDeleleShortName); socialNetworkManager.deleteMember(userLogged, groupToDelete, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO denyJoinGroup(final String hash, final String groupShortName, + public SocialNetworkResultDTO denyJoinGroup(final String hash, final StateToken groupToken, final String groupToDenyShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToDenyJoin = groupManager.findByShortName(groupToDenyShortName); socialNetworkManager.denyJoinGroup(userLogged, groupToDenyJoin, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); @@ -138,58 +140,58 @@ @Authenticated(mandatory = false) // At least you can access as Viewer to the Group - @GroupAuthorizated(accessTypeRequired = AccessType.READ) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_ONLY) - public SocialNetworkDTO getGroupMembers(final String hash, final String groupShortName) throws DefaultException { + public SocialNetworkDTO getGroupMembers(final String hash, final StateToken groupToken) throws DefaultException { final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); return getGroupMembers(user, group); } @Authenticated(mandatory = false) // At least you can access as Viewer to the Group - @GroupAuthorizated(accessTypeRequired = AccessType.READ) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Viewer) @Transactional(type = TransactionType.READ_ONLY) - public ParticipationDataDTO getParticipation(final String hash, final String groupShortName) + public ParticipationDataDTO getParticipation(final String hash, final StateToken groupToken) throws DefaultException { final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); return getParticipation(user, group); } @Authenticated @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkRequestResult requestJoinGroup(final String hash, final String groupShortName) + public SocialNetworkRequestResult requestJoinGroup(final String hash, final StateToken groupToken) throws DefaultException { final UserSession userSession = getUserSession(); final User user = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); return socialNetworkManager.requestToJoin(user, group); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO setAdminAsCollab(final String hash, final String groupShortName, + public SocialNetworkResultDTO setAdminAsCollab(final String hash, final StateToken groupToken, final String groupToSetCollabShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToSetCollab = groupManager.findByShortName(groupToSetCollabShortName); socialNetworkManager.setAdminAsCollab(userLogged, groupToSetCollab, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } @Authenticated - @GroupAuthorizated(accessTypeRequired = AccessType.ADMIN) + @Authorizated(actionLevel = ActionLevel.group, accessRolRequired = AccessRol.Administrator) @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO setCollabAsAdmin(final String hash, final String groupShortName, + public SocialNetworkResultDTO setCollabAsAdmin(final String hash, final StateToken groupToken, final String groupToSetAdminShortName) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); final Group groupToSetAdmin = groupManager.findByShortName(groupToSetAdminShortName); socialNetworkManager.setCollabAsAdmin(userLogged, groupToSetAdmin, group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); @@ -197,10 +199,10 @@ @Authenticated @Transactional(type = TransactionType.READ_WRITE) - public SocialNetworkResultDTO unJoinGroup(final String hash, final String groupShortName) throws DefaultException { + public SocialNetworkResultDTO unJoinGroup(final String hash, final StateToken groupToken) throws DefaultException { final UserSession userSession = getUserSession(); final User userLogged = userSession.getUser(); - final Group group = groupManager.findByShortName(groupShortName); + final Group group = groupManager.findByShortName(groupToken.getGroup()); socialNetworkManager.unJoinGroup(userLogged.getUserGroup(), group); return new SocialNetworkResultDTO(getGroupMembers(userLogged, group), getParticipation(userLogged, group)); } Modified: trunk/src/main/java/org/ourproject/kune/platf/server/state/StateServiceDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/server/state/StateServiceDefault.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/platf/server/state/StateServiceDefault.java 2008-09-18 00:45:41 UTC (rev 872) @@ -33,7 +33,7 @@ public State create(final Access access) { final Content content = access.getContent(); - final Container container = content.getContainer(); + final Container container = access.getContainer(); final State state = new State(); final Long documentId = content.getId(); @@ -72,7 +72,7 @@ state.setContainer(container); state.setAccessLists(access.getContentAccessLists()); state.setContentRights(access.getContentRights()); - state.setContainerRights(access.getFolderRights()); + state.setContainerRights(access.getContainerRights()); state.setGroupRights(access.getGroupRights()); License contentLicense = content.getLicense(); if (contentLicense == null) { Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigator.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigator.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigator.java 2008-09-18 00:45:41 UTC (rev 872) @@ -33,6 +33,8 @@ View getView(); + boolean isSelected(StateToken stateToken); + void registerContentTypeIcon(String contentTypeId, String iconUrl); void registerDraggableType(String typeId); @@ -43,6 +45,8 @@ void selectItem(StateToken stateToken); + void setEditOnNextStateChange(boolean edit); + void setItemText(StateToken stateToken, String name); void setState(StateDTO state); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPanel.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPanel.java 2008-09-18 00:45:41 UTC (rev 872) @@ -20,36 +20,26 @@ package org.ourproject.kune.workspace.client.ctxnav; -import java.util.ArrayList; import java.util.HashMap; -import org.ourproject.kune.platf.client.actions.ActionButtonDescriptor; -import org.ourproject.kune.platf.client.actions.ActionButtonSeparator; import org.ourproject.kune.platf.client.actions.ActionCollection; import org.ourproject.kune.platf.client.actions.ActionDescriptor; -import org.ourproject.kune.platf.client.actions.ActionMenuDescriptor; -import org.ourproject.kune.platf.client.actions.ActionPosition; import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.services.I18nTranslationService; -import org.ourproject.kune.workspace.client.skel.Toolbar; +import org.ourproject.kune.workspace.client.site.Site; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DeferredCommand; -import com.google.gwt.user.client.ui.Widget; +import com.google.gwt.user.client.ui.ScrollPanel; import com.gwtext.client.core.EventObject; import com.gwtext.client.data.Node; -import com.gwtext.client.widgets.Button; -import com.gwtext.client.widgets.Panel; -import com.gwtext.client.widgets.ToolbarButton; -import com.gwtext.client.widgets.event.ButtonListenerAdapter; +import com.gwtext.client.data.Tree; import com.gwtext.client.widgets.form.TextField; -import com.gwtext.client.widgets.layout.FitLayout; import com.gwtext.client.widgets.menu.BaseItem; import com.gwtext.client.widgets.menu.Item; import com.gwtext.client.widgets.menu.Menu; -import com.gwtext.client.widgets.menu.MenuItem; import com.gwtext.client.widgets.menu.event.BaseItemListenerAdapter; import com.gwtext.client.widgets.tree.TreeEditor; import com.gwtext.client.widgets.tree.TreeNode; @@ -62,11 +52,9 @@ private TreePanel treePanel; private TreeEditor treeEditor; private final HashMap<String, Menu> contextMenus; - private final HashMap<String, Menu> toolbarMenus; private final WorkspaceSkeleton ws; + private boolean fireOnTextChange; private final ContextNavigatorPresenter presenter; - private final ArrayList<Widget> removableToolbarItems; - private final HashMap<String, Item> menuItems; public ContextNavigatorPanel(final ContextNavigatorPresenter presenter, final I18nTranslationService i18n, final WorkspaceSkeleton ws) { @@ -74,38 +62,9 @@ this.ws = ws; contextMenus = new HashMap<String, Menu>(); - toolbarMenus = new HashMap<String, Menu>(); - removableToolbarItems = new ArrayList<Widget>(); - menuItems = new HashMap<String, Item>(); + fireOnTextChange = true; } - public void addButtonAction(final ActionButtonDescriptor<StateToken> action) { - final ActionPosition pos = action.getActionPosition(); - final ToolbarButton button = new ToolbarButton(); - final String text = action.getText(); - if (text != null) { - button.setText(text); - } - button.addListener(new ButtonListenerAdapter() { - @Override - public void onClick(final Button button, final EventObject e) { - doAction(action, presenter.getCurrentStateToken()); - } - }); - button.setIcon(action.getIconUrl()); - button.setTooltip(action.getToolTip()); - - final Toolbar toolbar = getToolbar(pos); - if (action.hasLeftSeparator()) { - removableToolbarItems.add(add(toolbar, action.getLeftSeparator())); - } - toolbar.add(button); - if (action.hasRightSeparator()) { - removableToolbarItems.add(add(toolbar, action.getRightSeparator())); - } - removableToolbarItems.add(button); - } - public void addItem(final ContextNavigatorItem item) { final String nodeId = item.getId(); if (treePanel.getNodeById(nodeId) == null) { @@ -138,7 +97,9 @@ child.addListener(new TreeNodeListenerAdapter() { @Override public void onTextChange(final Node node, final String text, final String oldText) { - presenter.onItemRename(getToken(node), text, oldText); + if (fireOnTextChange) { + presenter.onItemRename(getToken(node), text, oldText); + } } }); if (!item.getStateToken().hasAll()) { @@ -164,57 +125,26 @@ } - public void addMenuAction(final ActionMenuDescriptor<StateToken> action, final boolean enable) { - final String menuTitle = action.getParentMenuTitle(); - final String menuSubTitle = action.getParentSubMenuTitle(); - final ActionPosition pos = action.getActionPosition(); - final String itemKey = genMenuKey(pos, menuTitle, menuSubTitle, action.getText()); - Item item = menuItems.get(itemKey); - if (item == null) { - item = createToolbarMenu(pos, menuTitle, menuSubTitle, action); - menuItems.put(itemKey, item); - } else { - } - if (enable) { // && action.getEnableCondition().mustBeEnabled(param)) - // ) { - item.enable(); - } else { - item.disable(); - } - doLayoutIfNeeded(pos); - } - public void clear() { if (treePanel != null) { treePanel.clear(); + treePanel = null; } - ws.getEntityWorkspace().getContextTopBar().removeAll(); - ws.getEntityWorkspace().getContextBottomBar().removeAll(); contextMenus.clear(); - toolbarMenus.clear(); - menuItems.clear(); - removableToolbarItems.clear(); } - public void clearRemovableActions() { - for (final Widget widget : removableToolbarItems) { - widget.removeFromParent(); - } - removableToolbarItems.clear(); - doLayoutIfNeeded(); + public void editItem(final String id) { + treeEditor.startEdit(getNode(id)); } - public void disableAllMenuItems() { - for (final Item item : menuItems.values()) { - item.disable(); + public boolean isSelected(final String id) { + final TreeNode item = getNode(id); + if (item != null) { + return item.isSelected(); } - doLayoutIfNeeded(); + return false; } - public void editItem(final String id) { - treeEditor.startEdit(getNode(id)); - } - public void selectItem(final String id) { final TreeNode item = getNode(id); if (item != null) { @@ -230,6 +160,10 @@ } } + public void setFireOnTextChange(final boolean fireOnTextChange) { + this.fireOnTextChange = fireOnTextChange; + } + public void setItemText(final String genId, final String text) { final TreeNode node = getNode(genId); node.setText(text); @@ -242,22 +176,6 @@ } } - private void add(final ActionPosition toolbar, final Widget widget) { - getToolbar(toolbar).add(widget); - } - - private Widget add(final Toolbar toolbar, final ActionButtonSeparator separator) { - switch (separator) { - case fill: - return toolbar.addFill(); - case separator: - return toolbar.addSeparator(); - case spacer: - default: - return toolbar.addSpacer(); - } - } - private void createItemMenu(final String nodeId, final ActionCollection<StateToken> actionCollection, final StateToken stateToken) { DeferredCommand.addCommand(new Command() { @@ -286,61 +204,6 @@ }); } - private Item createToolbarMenu(final ActionPosition toolBarPos, final String menuTitle, final String menuSubTitle, - final ActionMenuDescriptor<StateToken> action) { - final Item item = new Item(action.getText(), new BaseItemListenerAdapter() { - @Override - public void onClick(BaseItem item, EventObject e) { - doAction(action, presenter.getCurrentStateToken()); - } - }); - item.setIcon(action.getIconUrl()); - - final String menuKey = genMenuKey(toolBarPos, menuTitle, null, null); - final String subMenuKey = genMenuKey(toolBarPos, menuTitle, menuSubTitle, null); - Menu menu = toolbarMenus.get(menuKey); - Menu subMenu = toolbarMenus.get(subMenuKey); - if (menuSubTitle != null) { - if (subMenu == null) { - subMenu = new Menu(); - final MenuItem subMenuItem = new MenuItem(menuSubTitle, subMenu); - if (menu == null) { - menu = createToolbarMenu(toolBarPos, action.getParentMenuIconUrl(), menuTitle, menuKey); - } - menu.addItem(subMenuItem); - toolbarMenus.put(subMenuKey, subMenu); - } - subMenu.addItem(item); - - } else { - // Menu action without submenu - if (menu == null) { - menu = createToolbarMenu(toolBarPos, action.getParentMenuIconUrl(), menuTitle, menuKey); - } - menu.addItem(item); - } - doLayoutIfNeeded(toolBarPos); - return item; - } - - private Menu createToolbarMenu(final ActionPosition barPosition, final String iconUrl, final String menuTitle, - final String menuKey) { - final Menu menu = new Menu(); - final ToolbarButton toolbarMenu = new ToolbarButton(menuTitle); - if (iconUrl != null) { - toolbarMenu.setIcon(iconUrl); - } - toolbarMenu.addListener(new ButtonListenerAdapter() { - @Override - public void onClick(final Button button, final EventObject e) { - menu.showAt(e.getXY()); - } - }); - toolbarMenus.put(menuKey, menu); - add(barPosition, toolbarMenu); - return menu; - } - private void createTreePanel(final String rootId, final String text, final StateToken stateToken, final ActionCollection<StateToken> actions) { if (treePanel != null) { @@ -351,6 +214,7 @@ treePanel.setBorder(false); treePanel.setRootVisible(true); treePanel.setUseArrows(true); + // treePanel.setSelectionModel(new MultiSelectionModel()); final TreeNode root = new TreeNode(); root.setAllowDrag(false); root.setExpanded(true); @@ -362,48 +226,48 @@ treePanel.addListener(new TreePanelListenerAdapter() { public void onContextMenu(final TreeNode node, final EventObject e) { final Menu menu = contextMenus.get(node.getId()); - if (menu != null && menu.getItems().length != 0) { + if (menu != null && menu.getItems().length > 0) { menu.showAt(e.getXY()); } else { Log.info("Empty item menu"); } } + + @Override + public void onMoveNode(final Tree treePanel, final TreeNode node, final TreeNode oldParent, + final TreeNode newParent, final int index) { + newParent.removeChild(node); + oldParent.appendChild(node); + Site.info("Drag & drop of contents in development"); + } }); treePanel.setLines(false); treePanel.setEnableDD(true); treePanel.setRootNode(root); + // treePanel.setAutoScroll(true); + treePanel.setContainerScroll(true); + treePanel.setAutoWidth(true); + final TextField field = new TextField(); treeEditor = new TreeEditor(treePanel, field); - final Panel panel = new Panel(); - panel.setLayout(new FitLayout()); - panel.setBorder(false); - panel.setAutoScroll(true); + + final ScrollPanel panel = new ScrollPanel(); + // final Panel panel = new Panel(); + // panel.setLayout(new FitLayout()); + // panel.setBorder(false); + // panel.setAutoScroll(true); + // new ScrollPanel + panel.setWidth("100%"); + panel.setHeight("100%"); panel.add(treePanel); - ws.getEntityWorkspace().setContext(treePanel); + ws.getEntityWorkspace().setContext(panel); } private void doAction(final ActionDescriptor<StateToken> action, final StateToken stateToken) { presenter.doAction(action, stateToken); } - private void doLayoutIfNeeded() { - doLayoutIfNeeded(ActionPosition.topbar); - doLayoutIfNeeded(ActionPosition.bottombar); - } - - private void doLayoutIfNeeded(final ActionPosition pos) { - getToolbar(pos).doLayoutIfNeeded(); - } - - private String genMenuKey(final ActionPosition pos, final String menuTitle, final String menuSubTitle, - final String actionText) { - final String basePart = "km-" + pos.toString() + "-" + menuTitle; - final String subMenuPart = menuSubTitle != null ? "-subm-" + menuSubTitle : ""; - final String itemPart = actionText != null ? "-item-" + actionText : ""; - return basePart + subMenuPart + itemPart; - } - private TreeNode getNode(final String id) { final TreeNode node = treePanel.getNodeById(id); if (node == null) { @@ -416,15 +280,4 @@ return node.getAttribute("href").substring(1); } - private Toolbar getToolbar(final ActionPosition pos) { - switch (pos) { - case bootombarAndItemMenu: - case bottombar: - return ws.getEntityWorkspace().getContextBottomBar(); - case topbar: - case topbarAndItemMenu: - default: - return ws.getEntityWorkspace().getContextTopBar(); - } - } } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorPresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -28,6 +28,7 @@ import org.ourproject.kune.platf.client.actions.ActionCollection; import org.ourproject.kune.platf.client.actions.ActionCollectionSet; import org.ourproject.kune.platf.client.actions.ActionDescriptor; +import org.ourproject.kune.platf.client.actions.ActionEnableCondition; import org.ourproject.kune.platf.client.actions.ActionManager; import org.ourproject.kune.platf.client.actions.ActionMenuDescriptor; import org.ourproject.kune.platf.client.dto.AccessRightsDTO; @@ -48,7 +49,6 @@ import com.calclab.suco.client.provider.Provider; import com.calclab.suco.client.signal.Slot; import com.calclab.suco.client.signal.Slot0; -import com.calclab.suco.client.signal.Slot2; import com.google.gwt.user.client.rpc.AsyncCallback; public class ContextNavigatorPresenter implements ContextNavigator { @@ -65,21 +65,26 @@ private final HashMap<String, String> contentTypesIcons; private final EntityTitle entityTitle; private final Provider<ActionManager> actionManagerProvider; + private boolean editOnNextStateChange; + private final ContextNavigatorToolbar toolbar; public ContextNavigatorPresenter(final StateManager stateManager, final Session session, final Provider<ContentServiceAsync> contentServiceProvider, final I18nUITranslationService i18n, - final EntityTitle entityTitle, final Provider<ActionManager> actionManagerProvider) { + final EntityTitle entityTitle, final Provider<ActionManager> actionManagerProvider, + final ContextNavigatorToolbar contextNavigatorToolbar) { this.stateManager = stateManager; this.session = session; this.contentServiceProvider = contentServiceProvider; this.i18n = i18n; this.entityTitle = entityTitle; this.actionManagerProvider = actionManagerProvider; + this.toolbar = contextNavigatorToolbar; actions = new HashMap<String, ActionCollection<StateToken>>(); actionsByItem = new HashMap<StateToken, ActionCollection<StateToken>>(); draggables = new ArrayList<String>(); droppables = new ArrayList<String>(); contentTypesIcons = new HashMap<String, String>(); + editOnNextStateChange = false; } public void addAction(final String contentTypeId, final ActionDescriptor<StateToken> action) { @@ -113,20 +118,6 @@ public void init(final ContextNavigatorView view) { this.view = view; - stateManager.onGroupChanged(new Slot2<String, String>() { - public void onEvent(final String oldGroup, final String newGroup) { - if (oldGroup != null) { - clear(); - } - } - }); - stateManager.onToolChanged(new Slot2<String, String>() { - public void onEvent(final String oldTool, final String newTool) { - if (oldTool != null) { - clear(); - } - } - }); session.onUserSignIn(new Slot<UserInfoDTO>() { public void onEvent(final UserInfoDTO parameter) { clear(); @@ -139,26 +130,40 @@ }); } + public boolean isSelected(final StateToken stateToken) { + return view.isSelected(genId(stateToken)); + } + + public boolean mustEditOnNextStateChange() { + return editOnNextStateChange; + } + public void onItemRename(final String token, final String newName, final String oldName) { if (!newName.equals(oldName)) { Site.showProgress(i18n.t("Renaming")); - final StateDTO currentState = session.getCurrentState(); - contentServiceProvider.get().rename(session.getUserHash(), currentState.getGroup().getShortName(), token, - newName, new AsyncCallback<String>() { - public void onFailure(final Throwable caught) { - setItemText(new StateToken(token), oldName); - Site.error(i18n.t("Error renaming")); - Site.hideProgress(); - } + final StateToken stateToken = new StateToken(token); + final AsyncCallback<String> asyncCallback = new AsyncCallback<String>() { + public void onFailure(final Throwable caught) { + view.setFireOnTextChange(false); + setItemText(stateToken, oldName); + view.setFireOnTextChange(true); + Site.error(i18n.t("Error renaming")); + Site.hideProgress(); + } - public void onSuccess(final String result) { - Site.hideProgress(); - if (session.getCurrentState().getStateToken().getEncoded().equals(token)) { - // I have to update EntityTitle - entityTitle.setContentTitle(newName); - } - } - }); + public void onSuccess(final String result) { + Site.hideProgress(); + if (session.getCurrentState().getStateToken().getEncoded().equals(token)) { + // I have to update EntityTitle + entityTitle.setContentTitle(newName); + } + } + }; + if (stateToken.isComplete()) { + contentServiceProvider.get().renameContent(session.getUserHash(), stateToken, newName, asyncCallback); + } else { + contentServiceProvider.get().renameContainer(session.getUserHash(), stateToken, newName, asyncCallback); + } } } @@ -180,11 +185,15 @@ public void selectItem(final StateToken stateToken) { view.selectItem(genId(stateToken)); - view.clearRemovableActions(); - view.disableAllMenuItems(); + toolbar.clearRemovableActions(); + toolbar.disableAllMenuItems(); setActions(actionsByItem.get(stateToken), true); } + public void setEditOnNextStateChange(final boolean edit) { + editOnNextStateChange = edit; + } + public void setItemText(final StateToken stateToken, final String name) { view.setItemText(genId(stateToken), name); } @@ -224,7 +233,13 @@ createChildItems(container, containerRights); // Finaly - selectItem(stateToken); + if (mustEditOnNextStateChange()) { + selectItem(stateToken); + editItem(stateToken); + setEditOnNextStateChange(false); + } else { + selectItem(stateToken); + } } private void addItem(final String title, final String contentTypeId, final ContentStatusDTO status, @@ -241,9 +256,17 @@ actionsByItem.put(stateToken, set.getToolbarActions()); } + private boolean checkEnabling(final boolean isNodeSelected, final ActionDescriptor<StateToken> action) { + final ActionEnableCondition<StateToken> enableCondition = action.getEnableCondition(); + final boolean mustBeEnabled = enableCondition != null ? enableCondition.mustBeEnabled(getCurrentStateToken()) + : true; + return isNodeSelected && mustBeEnabled; + } + private void clear() { view.clear(); actionsByItem.clear(); + toolbar.clear(); } private void createChildItems(final ContainerDTO container, final AccessRightsDTO containerRights) { @@ -332,10 +355,10 @@ private void setActions(final ActionCollection<StateToken> actions, final boolean isNodeSelected) { for (final ActionDescriptor<StateToken> action : actions) { if (action instanceof ActionMenuDescriptor) { - view.addMenuAction((ActionMenuDescriptor<StateToken>) action, isNodeSelected); + toolbar.addMenuAction((ActionMenuDescriptor<StateToken>) action, checkEnabling(isNodeSelected, action)); } else { - if (isNodeSelected) { - view.addButtonAction((ActionButtonDescriptor<StateToken>) action); + if (checkEnabling(isNodeSelected, action)) { + toolbar.addButtonAction((ActionButtonDescriptor<StateToken>) action); } } } Added: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorToolbar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorToolbar.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorToolbar.java 2008-09-18 00:45:41 UTC (rev 872) @@ -0,0 +1,14 @@ +package org.ourproject.kune.workspace.client.ctxnav; + +import org.ourproject.kune.platf.client.actions.ActionManager; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; + +import com.calclab.suco.client.provider.Provider; + +public class ContextNavigatorToolbar extends EntityToolbar { + public ContextNavigatorToolbar(final Session session, final Provider<ActionManager> actionManagerProvider, + final WorkspaceSkeleton ws) { + super(ToolbarPosition.context, session, actionManagerProvider, ws); + } +} Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorView.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/ContextNavigatorView.java 2008-09-18 00:45:41 UTC (rev 872) @@ -21,29 +21,23 @@ package org.ourproject.kune.workspace.client.ctxnav; import org.ourproject.kune.platf.client.View; -import org.ourproject.kune.platf.client.actions.ActionButtonDescriptor; import org.ourproject.kune.platf.client.actions.ActionCollection; -import org.ourproject.kune.platf.client.actions.ActionMenuDescriptor; import org.ourproject.kune.platf.client.dto.StateToken; public interface ContextNavigatorView extends View { - void addButtonAction(ActionButtonDescriptor<StateToken> action); - void addItem(ContextNavigatorItem contextNavigatorItem); - void addMenuAction(ActionMenuDescriptor<StateToken> action, boolean enable); - void clear(); - void disableAllMenuItems(); - void editItem(String id); - void clearRemovableActions(); + boolean isSelected(String id); void selectItem(String id); + void setFireOnTextChange(boolean fire); + void setItemText(String id, String text); void setRootItem(String id, String text, StateToken stateToken, ActionCollection<StateToken> actions); Added: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbar.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbar.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbar.java 2008-09-18 00:45:41 UTC (rev 872) @@ -0,0 +1,233 @@ +package org.ourproject.kune.workspace.client.ctxnav; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.ourproject.kune.platf.client.actions.ActionButtonDescriptor; +import org.ourproject.kune.platf.client.actions.ActionButtonSeparator; +import org.ourproject.kune.platf.client.actions.ActionManager; +import org.ourproject.kune.platf.client.actions.ActionMenuDescriptor; +import org.ourproject.kune.platf.client.actions.ActionPosition; +import org.ourproject.kune.platf.client.dto.StateToken; +import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.workspace.client.skel.Toolbar; +import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; + +import com.calclab.suco.client.provider.Provider; +import com.google.gwt.user.client.ui.Widget; +import com.gwtext.client.core.EventObject; +import com.gwtext.client.widgets.Button; +import com.gwtext.client.widgets.ToolbarButton; +import com.gwtext.client.widgets.event.ButtonListenerAdapter; +import com.gwtext.client.widgets.menu.BaseItem; +import com.gwtext.client.widgets.menu.Item; +import com.gwtext.client.widgets.menu.Menu; +import com.gwtext.client.widgets.menu.MenuItem; +import com.gwtext.client.widgets.menu.event.BaseItemListenerAdapter; + +public class EntityToolbar implements EntityToolbarView { + + protected enum ToolbarPosition { + content, context + } + + private final HashMap<String, Menu> toolbarMenus; + private final ArrayList<Widget> removableToolbarItems; + private final HashMap<String, Item> menuItems; + private final WorkspaceSkeleton ws; + private final Session session; + private final Provider<ActionManager> actionManagerProvider; + private final ToolbarPosition position; + + public EntityToolbar(final ToolbarPosition position, final Session session, + final Provider<ActionManager> actionManagerProvider, final WorkspaceSkeleton ws) { + this.position = position; + this.session = session; + this.actionManagerProvider = actionManagerProvider; + this.ws = ws; + toolbarMenus = new HashMap<String, Menu>(); + removableToolbarItems = new ArrayList<Widget>(); + menuItems = new HashMap<String, Item>(); + + } + + public void addButtonAction(final ActionButtonDescriptor<StateToken> action) { + final ActionPosition pos = action.getActionPosition(); + final ToolbarButton button = new ToolbarButton(); + final String text = action.getText(); + if (text != null) { + button.setText(text); + } + button.addListener(new ButtonListenerAdapter() { + @Override + public void onClick(final Button button, final EventObject e) { + actionManagerProvider.get().doAction(action, session.getCurrentState().getStateToken()); + } + }); + button.setIcon(action.getIconUrl()); + button.setTooltip(action.getToolTip()); + + final Toolbar toolbar = getToolbar(pos); + if (action.hasLeftSeparator()) { + removableToolbarItems.add(add(toolbar, action.getLeftSeparator())); + } + toolbar.add(button); + if (action.hasRightSeparator()) { + removableToolbarItems.add(add(toolbar, action.getRightSeparator())); + } + removableToolbarItems.add(button); + } + + public void addMenuAction(final ActionMenuDescriptor<StateToken> action, final boolean enable) { + final String menuTitle = action.getParentMenuTitle(); + final String menuSubTitle = action.getParentSubMenuTitle(); + final ActionPosition pos = action.getActionPosition(); + final String itemKey = genMenuKey(pos, menuTitle, menuSubTitle, action.getText()); + Item item = menuItems.get(itemKey); + if (item == null) { + item = createToolbarMenu(pos, menuTitle, menuSubTitle, action); + menuItems.put(itemKey, item); + } + if (enable) { + item.enable(); + } else { + item.disable(); + } + doLayoutIfNeeded(pos); + } + + public void clear() { + toolbarMenus.clear(); + menuItems.clear(); + removableToolbarItems.clear(); + getToolbar(ActionPosition.topbar).removeAll(); + getToolbar(ActionPosition.bottombar).removeAll(); + } + + public void clearRemovableActions() { + for (final Widget widget : removableToolbarItems) { + widget.removeFromParent(); + } + removableToolbarItems.clear(); + doLayoutIfNeeded(); + } + + public void disableAllMenuItems() { + for (final Item item : menuItems.values()) { + item.disable(); + } + doLayoutIfNeeded(); + } + + private void add(final ActionPosition toolbar, final Widget widget) { + getToolbar(toolbar).add(widget); + } + + private Widget add(final Toolbar toolbar, final ActionButtonSeparator separator) { + switch (separator) { + case fill: + return toolbar.addFill(); + case separator: + return toolbar.addSeparator(); + case spacer: + default: + return toolbar.addSpacer(); + } + } + + private Item createToolbarMenu(final ActionPosition toolBarPos, final String menuTitle, final String menuSubTitle, + final ActionMenuDescriptor<StateToken> action) { + final Item item = new Item(action.getText(), new BaseItemListenerAdapter() { + @Override + public void onClick(BaseItem item, EventObject e) { + actionManagerProvider.get().doAction(action, session.getCurrentState().getStateToken()); + } + }); + item.setIcon(action.getIconUrl()); + + final String menuKey = genMenuKey(toolBarPos, menuTitle, null, null); + final String subMenuKey = genMenuKey(toolBarPos, menuTitle, menuSubTitle, null); + Menu menu = toolbarMenus.get(menuKey); + Menu subMenu = toolbarMenus.get(subMenuKey); + if (menuSubTitle != null) { + if (subMenu == null) { + subMenu = new Menu(); + final MenuItem subMenuItem = new MenuItem(menuSubTitle, subMenu); + if (menu == null) { + menu = createToolbarMenu(toolBarPos, action.getParentMenuIconUrl(), menuTitle, menuKey); + } + menu.addItem(subMenuItem); + toolbarMenus.put(subMenuKey, subMenu); + } + subMenu.addItem(item); + + } else { + // Menu action without submenu + if (menu == null) { + menu = createToolbarMenu(toolBarPos, action.getParentMenuIconUrl(), menuTitle, menuKey); + } + menu.addItem(item); + } + doLayoutIfNeeded(toolBarPos); + return item; + } + + private Menu createToolbarMenu(final ActionPosition barPosition, final String iconUrl, final String menuTitle, + final String menuKey) { + final Menu menu = new Menu(); + final ToolbarButton toolbarMenu = new ToolbarButton(menuTitle); + if (iconUrl != null) { + toolbarMenu.setIcon(iconUrl); + } + toolbarMenu.addListener(new ButtonListenerAdapter() { + @Override + public void onClick(final Button button, final EventObject e) { + menu.showAt(e.getXY()); + } + }); + toolbarMenus.put(menuKey, menu); + add(barPosition, toolbarMenu); + return menu; + } + + private void doLayoutIfNeeded() { + doLayoutIfNeeded(ActionPosition.topbar); + doLayoutIfNeeded(ActionPosition.bottombar); + } + + private void doLayoutIfNeeded(final ActionPosition pos) { + getToolbar(pos).doLayoutIfNeeded(); + } + + private String genMenuKey(final ActionPosition pos, final String menuTitle, final String menuSubTitle, + final String actionText) { + final String basePart = "km-" + pos.toString() + "-" + menuTitle; + final String subMenuPart = menuSubTitle != null ? "-subm-" + menuSubTitle : ""; + final String itemPart = actionText != null ? "-item-" + actionText : ""; + return basePart + subMenuPart + itemPart; + } + + private Toolbar getToolbar(final ActionPosition pos) { + switch (pos) { + case bootombarAndItemMenu: + case bottombar: + switch (position) { + case content: + return ws.getEntityWorkspace().getContentBottomBar(); + case context: + default: + return ws.getEntityWorkspace().getContextBottomBar(); + } + case topbar: + case topbarAndItemMenu: + default: + switch (position) { + case content: + return ws.getEntityWorkspace().getContentTopBar(); + case context: + default: + return ws.getEntityWorkspace().getContextTopBar(); + } + } + } +} Added: trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbarView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbarView.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/ctxnav/EntityToolbarView.java 2008-09-18 00:45:41 UTC (rev 872) @@ -0,0 +1,19 @@ +package org.ourproject.kune.workspace.client.ctxnav; + +import org.ourproject.kune.platf.client.actions.ActionButtonDescriptor; +import org.ourproject.kune.platf.client.actions.ActionMenuDescriptor; +import org.ourproject.kune.platf.client.dto.StateToken; + +public interface EntityToolbarView { + + void addButtonAction(ActionButtonDescriptor<StateToken> action); + + void addMenuAction(ActionMenuDescriptor<StateToken> action, boolean enable); + + void clear(); + + void clearRemovableActions(); + + void disableAllMenuItems(); + +} Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/GroupMembersSummaryPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/GroupMembersSummaryPresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/GroupMembersSummaryPresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -88,9 +88,8 @@ public void addCollab(final String groupShortName) { Site.showProgressProcessing(); - snServiceProvider.get().addCollabMember(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), groupShortName, - new AsyncCallbackSimple<SocialNetworkResultDTO>() { + snServiceProvider.get().addCollabMember(session.getUserHash(), session.getCurrentState().getStateToken(), + groupShortName, new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); Site.info(i18n.t("Member added as collaborator")); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/SocialNetworkPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/SocialNetworkPresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/socialnet/SocialNetworkPresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -5,6 +5,7 @@ import org.ourproject.kune.platf.client.dto.GroupType; import org.ourproject.kune.platf.client.dto.SocialNetworkRequestResult; import org.ourproject.kune.platf.client.dto.SocialNetworkResultDTO; +import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.rpc.AsyncCallbackSimple; import org.ourproject.kune.platf.client.rpc.SocialNetworkServiceAsync; import org.ourproject.kune.platf.client.services.ImageDescriptor; @@ -104,7 +105,7 @@ public void onEvent(final String parameter) { Site.showProgressProcessing(); snServiceProvider.get().requestJoinGroup(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), new AsyncCallbackSimple<Object>() { + session.getCurrentState().getStateToken(), new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { Site.hideProgress(); final SocialNetworkRequestResult resultType = (SocialNetworkRequestResult) result; @@ -183,7 +184,7 @@ public void onEvent(final GroupDTO group) { Site.showProgressProcessing(); snServiceProvider.get().setAdminAsCollab(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), group.getShortName(), + session.getCurrentState().getStateToken(), group.getShortName(), new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); @@ -198,7 +199,7 @@ public void onEvent(final GroupDTO group) { Site.showProgressProcessing(); snServiceProvider.get().deleteMember(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), group.getShortName(), + session.getCurrentState().getStateToken(), group.getShortName(), new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); @@ -217,7 +218,7 @@ public void onEvent(final GroupDTO group) { Site.showProgressProcessing(); snServiceProvider.get().setCollabAsAdmin(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), group.getShortName(), + session.getCurrentState().getStateToken(), group.getShortName(), new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); @@ -232,7 +233,7 @@ public void onEvent(final GroupDTO group) { Site.showProgressProcessing(); snServiceProvider.get().AcceptJoinGroup(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), group.getShortName(), + session.getCurrentState().getStateToken(), group.getShortName(), new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); @@ -247,7 +248,7 @@ public void onEvent(final GroupDTO group) { Site.showProgressProcessing(); snServiceProvider.get().denyJoinGroup(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), group.getShortName(), + session.getCurrentState().getStateToken(), group.getShortName(), new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); @@ -265,7 +266,7 @@ private void removeMemberAction(final GroupDTO groupDTO) { Site.showProgressProcessing(); - snServiceProvider.get().unJoinGroup(session.getUserHash(), groupDTO.getShortName(), + snServiceProvider.get().unJoinGroup(session.getUserHash(), new StateToken(groupDTO.getShortName()), new AsyncCallbackSimple<SocialNetworkResultDTO>() { public void onSuccess(final SocialNetworkResultDTO result) { Site.hideProgress(); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/themes/WsThemePresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -49,9 +49,8 @@ protected void onChangeGroupWsTheme(final WsTheme newTheme) { Site.showProgressProcessing(); - groupServiceProvider.get().changeGroupWsTheme(session.getUserHash(), - session.getCurrentState().getGroup().getShortName(), newTheme.getName(), - new AsyncCallbackSimple<Object>() { + groupServiceProvider.get().changeGroupWsTheme(session.getUserHash(), session.getCurrentState().getStateToken(), + newTheme.getName(), new AsyncCallbackSimple<Object>() { public void onSuccess(final Object result) { setTheme(newTheme); Site.hideProgress(); Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/title/EntityTitlePresenter.java 2008-09-18 00:45:41 UTC (rev 872) @@ -90,21 +90,24 @@ protected void onTitleRename(final String newName) { Site.showProgressSaving(); - final StateDTO currentState = session.getCurrentState(); - final StateToken stateToken = currentState.getStateToken(); - contentServiceProvider.get().rename(session.getUserHash(), currentState.getGroup().getShortName(), - stateToken.getEncoded(), newName, new AsyncCallback<String>() { - public void onFailure(final Throwable caught) { - view.restoreOldTitle(); - errorHandler.process(caught); - } + final StateToken stateToken = session.getCurrentState().getStateToken(); + final AsyncCallback<String> asyncCallback = new AsyncCallback<String>() { + public void onFailure(final Throwable caught) { + view.restoreOldTitle(); + errorHandler.process(caught); + } - public void onSuccess(final String result) { - Site.hideProgress(); - view.setContentTitle(result); - contextNavigatorProvider.get().setItemText(stateToken, newName); - } - }); + public void onSuccess(final String result) { + Site.hideProgress(); + view.setContentTitle(result); + contextNavigatorProvider.get().setItemText(stateToken, newName); + } + }; + if (stateToken.isComplete()) { + contentServiceProvider.get().renameContent(session.getUserHash(), stateToken, newName, asyncCallback); + } else { + contentServiceProvider.get().renameContainer(session.getUserHash(), stateToken, newName, asyncCallback); + } Site.hideProgress(); } Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentCommentServiceTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentCommentServiceTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentCommentServiceTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -17,27 +17,27 @@ @Test public void commentDefaultContent() throws Exception { - doLogin(); - String commentText = "Some comment"; - CommentDTO commentDTO = contentService.addComment(session.getHash(), groupName, defaultContent.getDocumentId(), - commentText); - assertEquals(commentDTO.getText(), commentText); - assertEquals(commentDTO.getPositiveVotersCount(), 0); - assertEquals(commentDTO.getNegativeVotersCount(), 0); - assertEquals(commentDTO.getAbuseInformersCount(), 0); + doLogin(); + final String commentText = "Some comment"; + final CommentDTO commentDTO = contentService.addComment(session.getHash(), defaultContent.getStateToken(), + commentText); + assertEquals(commentDTO.getText(), commentText); + assertEquals(commentDTO.getPositiveVotersCount(), 0); + assertEquals(commentDTO.getNegativeVotersCount(), 0); + assertEquals(commentDTO.getAbuseInformersCount(), 0); } @Test(expected = UserMustBeLoggedException.class) public void commentWithoutLoginMustFail() throws DefaultException { - String commentText = "Some comment"; - contentService.addComment(session.getHash(), groupName, defaultContent.getDocumentId(), commentText); + final String commentText = "Some comment"; + contentService.addComment(session.getHash(), defaultContent.getStateToken(), commentText); } @Before public void init() throws Exception { - new IntegrationTestHelper(this); - groupName = getDefSiteGroupName(); - defaultContent = getDefaultContent(); + new IntegrationTestHelper(this); + groupName = getDefSiteGroupName(); + defaultContent = getDefaultContent(); } } Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceAddTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceAddTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceAddTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -32,8 +32,7 @@ @Test(expected = UserMustBeLoggedException.class) public void noLoggedInShouldThrowIllegalAccess() throws ContentNotFoundException, Exception { defaultContent = getDefaultContent(); - final Long folderId = defaultContent.getContainer().getId(); - contentService.addContent(session.getHash(), groupName, folderId, "a name"); + contentService.addContent(session.getHash(), defaultContent.getContainer().getStateToken(), "a name"); } @Test @@ -46,8 +45,8 @@ final AccessRightsDTO groupRights = defaultContent.getGroupRights(); final String title = "New Content Title"; - final StateDTO added = contentService.addContent(session.getHash(), groupName, defaultContent.getContainer() - .getId(), title); + final StateDTO added = contentService.addContent(session.getHash(), defaultContent.getContainer() + .getStateToken(), title); assertNotNull(added); final List<ContentDTO> contents = added.getContainer().getContents(); assertEquals(title, added.getTitle()); @@ -60,7 +59,7 @@ assertNotNull(added.getAccessLists()); final StateToken newState = added.getStateToken(); - final StateDTO sameAgain = contentService.getContent(session.getHash(), groupName, newState); + final StateDTO sameAgain = contentService.getContent(session.getHash(), newState); assertNotNull(sameAgain); assertEquals(2, sameAgain.getContainer().getContents().size()); @@ -72,7 +71,7 @@ defaultContent = getDefaultContent(); final ContainerDTO parent = defaultContent.getContainer(); final String title = "folder name"; - final StateDTO newState = contentService.addFolder(session.getHash(), groupName, parent.getId(), title, + final StateDTO newState = contentService.addFolder(session.getHash(), parent.getStateToken(), title, DocumentClientTool.TYPE_FOLDER); assertNotNull(newState); assertNotNull(newState.getGroupMembers()); @@ -81,7 +80,6 @@ assertNotNull(newState.getContainerRights()); assertNotNull(newState.getGroupRights()); assertNotNull(newState.getRootContainer().getContents().get(0).getRights()); - assertNotNull(newState.getContainer().getContents().get(0).getRights()); final ContainerDTO parentAgain = getDefaultContent().getContainer(); final ContainerSimpleDTO child = parentAgain.getChilds().get(0); @@ -97,7 +95,7 @@ defaultContent = getDefaultContent(); final ContainerDTO parent = defaultContent.getContainer(); final String roomName = "testroom"; - final StateDTO newState = contentService.addRoom(session.getHash(), groupName, parent.getId(), roomName); + final StateDTO newState = contentService.addRoom(session.getHash(), parent.getStateToken(), roomName); assertNotNull(newState); } @@ -107,11 +105,11 @@ defaultContent = getDefaultContent(); final ContainerDTO parent = defaultContent.getContainer(); final String title = "folder name"; - final StateDTO newState = contentService.addFolder(session.getHash(), groupName, parent.getId(), title, + final StateDTO newState = contentService.addFolder(session.getHash(), parent.getStateToken(), title, DocumentClientTool.TYPE_FOLDER); assertNotNull(newState); - final StateDTO newState2 = contentService.addFolder(session.getHash(), groupName, parent.getId(), title, + final StateDTO newState2 = contentService.addFolder(session.getHash(), parent.getStateToken(), title, DocumentClientTool.TYPE_FOLDER); assertNotNull(newState2); Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceGetTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceGetTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceGetTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -13,12 +13,10 @@ public class ContentServiceGetTest extends ContentServiceIntegrationTest { - private String groupName; - @Test public void contentWithLoggedUserIsEditable() throws Exception { final String userHash = doLogin(); - final StateDTO response = contentService.getContent(userHash, groupName, new StateToken()); + final StateDTO response = contentService.getContent(userHash, new StateToken()); assertNotNull(response.getContentRights()); assertTrue(response.getContentRights().isEditable()); // assertTrue(response.getAccessLists().getAdmin().size() == 1); @@ -27,12 +25,11 @@ @Before public void create() { new IntegrationTestHelper(this); - groupName = getDefSiteGroupName(); } @Test public void defaultCountentShouldExist() throws Exception { - final StateDTO content = contentService.getContent(null, groupName, new StateToken()); + final StateDTO content = contentService.getContent(null, new StateToken()); assertNotNull(content); assertNotNull(content.getGroup()); assertNotNull(content.getContainer()); @@ -45,39 +42,39 @@ @Test public void noContentNotLogged() throws Exception { - final StateDTO response = contentService.getContent(null, null, new StateToken()); + final StateDTO response = contentService.getContent(null, new StateToken()); assertNotNull(response); } @Test(expected = ContentNotFoundException.class) public void nonExistentContent() throws Exception { - contentService.getContent(null, groupName, new StateToken("foo foo foo")); + contentService.getContent(null, new StateToken("foo foo foo")); } @Test(expected = ContentNotFoundException.class) public void nonExistentContent2() throws Exception { - contentService.getContent(null, groupName, new StateToken("site.foofoo")); + contentService.getContent(null, new StateToken("site.foofoo")); } @Test(expected = ContentNotFoundException.class) public void nonExistentContent3() throws Exception { - contentService.getContent(null, groupName, new StateToken("site.docs.foofoo")); + contentService.getContent(null, new StateToken("site.docs.foofoo")); } @Test(expected = ContentNotFoundException.class) public void nonExistentContent4() throws Exception { final StateDTO stateDTO = getDefaultContent(); - contentService.getContent(null, groupName, stateDTO.getStateToken().clone().setDocument("dadaas")); + contentService.getContent(null, stateDTO.getStateToken().clone().setDocument("dadaas")); } @Test(expected = ContentNotFoundException.class) public void nonExistentContent5() throws Exception { - contentService.getContent(null, groupName, new StateToken("comm3.docs.19")); + contentService.getContent(null, new StateToken("comm3.docs.19")); } @Test public void notLoggedUserShouldNotEditDefaultDoc() throws Exception { - final StateDTO content = contentService.getContent(null, groupName, new StateToken()); + final StateDTO content = contentService.getContent(null, new StateToken()); assertFalse(content.getContentRights().isAdministrable()); assertFalse(content.getContentRights().isEditable()); assertTrue(content.getContentRights().isVisible()); @@ -88,7 +85,7 @@ @Test public void unknownContent() throws Exception { - final StateDTO content = contentService.getContent(null, groupName, new StateToken("site.docs")); + final StateDTO content = contentService.getContent(null, new StateToken("site.docs")); assertNotNull(content); assertNotNull(content.getGroup()); assertNotNull(content.getContainer()); Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceIntegrationTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceIntegrationTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceIntegrationTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -13,7 +13,7 @@ protected StateDTO getDefaultContent() throws Exception { final StateToken stateToken = new StateToken(getDefSiteGroupName()); - final StateDTO content = contentService.getContent(session.getHash(), getDefSiteGroupName(), stateToken); + final StateDTO content = contentService.getContent(session.getHash(), stateToken); return content; } Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceSaveTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceSaveTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceSaveTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -10,7 +10,6 @@ public class ContentServiceSaveTest extends ContentServiceIntegrationTest { - private String groupName; private StateDTO defaultContent; @Before @@ -18,7 +17,6 @@ new IntegrationTestHelper(this); defaultContent = getDefaultContent(); - groupName = defaultContent.getGroup().getShortName(); doLogin(); } @@ -26,9 +24,9 @@ public void testSaveAndRetrieve() throws Exception { final String text = "Lorem ipsum dolor sit amet"; final int version = defaultContent.getVersion(); - final int currentVersion = contentService.save(getHash(), groupName, defaultContent.getDocumentId(), text); + final int currentVersion = contentService.save(getHash(), defaultContent.getStateToken(), text); assertEquals(version + 2, currentVersion); - final StateDTO again = contentService.getContent(getHash(), groupName, defaultContent.getStateToken()); + final StateDTO again = contentService.getContent(getHash(), defaultContent.getStateToken()); assertEquals(text, again.getContent()); assertEquals(0, (int) again.getRateByUsers()); assertEquals(new Double(0), again.getRate()); @@ -39,9 +37,9 @@ final String text = TestDomainHelper.createBigText(); ; final int version = defaultContent.getVersion(); - final int currentVersion = contentService.save(getHash(), groupName, defaultContent.getDocumentId(), text); + final int currentVersion = contentService.save(getHash(), defaultContent.getStateToken(), text); assertEquals(version + 2, currentVersion); - final StateDTO again = contentService.getContent(getHash(), groupName, defaultContent.getStateToken()); + final StateDTO again = contentService.getContent(getHash(), defaultContent.getStateToken()); assertEquals(text, again.getContent()); } Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceVariousTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceVariousTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/content/ContentServiceVariousTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -1,6 +1,8 @@ package org.ourproject.kune.platf.integration.content; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.util.List; @@ -8,6 +10,7 @@ import org.junit.Test; import org.ourproject.kune.docs.client.DocumentClientTool; import org.ourproject.kune.platf.client.dto.ContainerDTO; +import org.ourproject.kune.platf.client.dto.ContentDTO; import org.ourproject.kune.platf.client.dto.StateDTO; import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.dto.TagResultDTO; @@ -19,7 +22,6 @@ private StateDTO defaultContent; private String groupShortName; - private String defDocument; @Test public void addRemoveAuthor() throws Exception { @@ -27,21 +29,21 @@ assertEquals(1, authors.size()); final UserSimpleDTO author = authors.get(0); final String authorShortName = author.getShortName(); - contentService.removeAuthor(getHash(), groupShortName, defDocument, authorShortName); + contentService.removeAuthor(getHash(), defaultContent.getStateToken(), authorShortName); final List<UserSimpleDTO> authors2 = getDefaultContent().getAuthors(); assertEquals(0, authors2.size()); - contentService.addAuthor(getHash(), groupShortName, defDocument, authorShortName); + contentService.addAuthor(getHash(), defaultContent.getStateToken(), authorShortName); final List<UserSimpleDTO> authors3 = getDefaultContent().getAuthors(); assertEquals(1, authors3.size()); - contentService.addAuthor(getHash(), groupShortName, defDocument, authorShortName); + contentService.addAuthor(getHash(), defaultContent.getStateToken(), authorShortName); final List<UserSimpleDTO> authors4 = getDefaultContent().getAuthors(); assertEquals(1, authors4.size()); } @Test public void contentRateAndRetrieve() throws Exception { - contentService.rateContent(getHash(), groupShortName, defDocument, 4.5); - final StateDTO again = contentService.getContent(getHash(), groupShortName, defaultContent.getStateToken()); + contentService.rateContent(getHash(), defaultContent.getStateToken(), 4.5); + final StateDTO again = contentService.getContent(getHash(), defaultContent.getStateToken()); assertEquals(true, again.isRateable()); assertEquals(new Double(4.5), again.getCurrentUserRate()); assertEquals(new Double(4.5), again.getRate()); @@ -50,9 +52,8 @@ @Test public void contentSetLanguage() throws Exception { - contentService.setLanguage(getHash(), groupShortName, defDocument, "es"); - final StateDTO contentRetrieved = contentService.getContent(getHash(), groupShortName, defaultContent - .getStateToken()); + contentService.setLanguage(getHash(), defaultContent.getStateToken(), "es"); + final StateDTO contentRetrieved = contentService.getContent(getHash(), defaultContent.getStateToken()); assertEquals("es", contentRetrieved.getLanguage().getCode()); } @@ -60,11 +61,10 @@ public void folderRename() throws Exception { doLogin(); defaultContent = getDefaultContent(); - final ContainerDTO folder = defaultContent.getContainer(); final String oldTitle = "some title"; String newTitle = "folder new name"; - final StateDTO newState = contentService.addFolder(session.getHash(), groupShortName, folder.getId(), oldTitle, + final StateDTO newState = contentService.addFolder(session.getHash(), defaultContent.getStateToken(), oldTitle, DocumentClientTool.TYPE_FOLDER); final ContainerDTO newFolder = newState.getContainer(); @@ -73,24 +73,23 @@ final StateToken folderToken = new StateToken(groupShortName, defaultContent.getStateToken().getTool(), newFolder.getId().toString(), null); - String result = contentService.rename(getHash(), groupShortName, folderToken.getEncoded(), newTitle); + String result = contentService.renameContainer(getHash(), folderToken, newTitle); assertEquals(newTitle, result); final StateToken newFolderToken = new StateToken(groupShortName, defaultContent.getStateToken().getTool(), newFolder.getId().toString(), null); - StateDTO folderAgain = contentService.getContent(getHash(), groupShortName, newFolderToken); + StateDTO folderAgain = contentService.getContent(getHash(), newFolderToken); assertEquals(newTitle, folderAgain.getContainer().getName()); newTitle = "folder last name"; - result = contentService.rename(getHash(), groupShortName, newFolderToken.getEncoded(), newTitle); + result = contentService.renameContainer(getHash(), newFolderToken, newTitle); - folderAgain = contentService.getContent(getHash(), groupShortName, newFolderToken); + folderAgain = contentService.getContent(getHash(), newFolderToken); assertEquals(newTitle, folderAgain.getContainer().getName()); - } @Test(expected = AccessViolationException.class) @@ -98,11 +97,11 @@ doLogin(); defaultContent = getDefaultContent(); final ContainerDTO folder = defaultContent.getContainer(); - final StateToken folderToken = new StateToken(groupShortName, defaultContent.getStateToken().getTool(), folder + final StateToken folderToken = new StateToken("otherGroup", defaultContent.getStateToken().getTool(), folder .getId().toString(), null); final String newTitle = "folder new name"; - contentService.rename(getHash(), super.getSiteAdminShortName(), folderToken.getEncoded(), newTitle); + contentService.renameContainer(getHash(), folderToken, newTitle); } @Test(expected = RuntimeException.class) @@ -114,7 +113,7 @@ final String newTitle = "folder new name"; final StateToken folderToken = new StateToken(groupShortName, defaultContent.getStateToken().getTool(), folder .getId().toString(), null); - final String result = contentService.rename(getHash(), groupShortName, folderToken.getEncoded(), newTitle); + final String result = contentService.renameContainer(getHash(), folderToken, newTitle); assertEquals(newTitle, result); @@ -129,13 +128,12 @@ doLogin(); defaultContent = getDefaultContent(); groupShortName = defaultContent.getStateToken().getGroup(); - defDocument = defaultContent.getStateToken().getDocument(); } @Test public void setTagsAndResults() throws Exception { - contentService.setTags(getHash(), groupShortName, defDocument, "bfoo cfoa afoo2"); - final List<TagResultDTO> summaryTags = contentService.getSummaryTags(getHash(), groupShortName); + contentService.setTags(getHash(), defaultContent.getStateToken(), "bfoo cfoa afoo2"); + final List<TagResultDTO> summaryTags = contentService.getSummaryTags(getHash(), defaultContent.getStateToken()); assertEquals(3, summaryTags.size()); TagResultDTO tagResultDTO = summaryTags.get(0); @@ -153,12 +151,27 @@ @Test public void setTagsAndRetrieve() throws Exception { - contentService.setTags(getHash(), groupShortName, defDocument, "foo foa foo"); + contentService.setTags(getHash(), defaultContent.getStateToken(), "foo foa foo"); final String tagsRetrieved = getDefaultContent().getTags(); assertEquals("foo foa", tagsRetrieved); } @Test + public void testSetAsDefContent() throws Exception { + doLogin(); + defaultContent = getDefaultContent(); + + final StateDTO added = contentService.addContent(session.getHash(), defaultContent.getStateToken(), + "New Content Title"); + assertNotNull(added); + + final ContentDTO newDefContent = contentService.setAsDefaultContent(session.getHash(), added.getStateToken()); + + assertTrue(!defaultContent.getStateToken().equals(newDefContent.getStateToken())); + assertTrue(added.getStateToken().equals(newDefContent.getStateToken())); + } + + @Test public void tokenRename() throws Exception { doLogin(); defaultContent = getDefaultContent(); @@ -166,23 +179,20 @@ final String oldTitle = "some title"; String newTitle = "folder new name"; - final StateDTO newState = contentService.addFolder(session.getHash(), groupShortName, folder.getId(), oldTitle, + final StateDTO newState = contentService.addFolder(session.getHash(), folder.getStateToken(), oldTitle, DocumentClientTool.TYPE_FOLDER); final ContainerDTO newFolder = newState.getContainer(); assertEquals(oldTitle, newFolder.getName()); - final StateToken newFolderToken = new StateToken(groupShortName, defaultContent.getStateToken().getTool(), - newFolder.getId().toString(), null); - newTitle = "folder last name"; - final String result = contentService.rename(getHash(), groupShortName, newFolderToken.getEncoded(), newTitle); + final String result = contentService.renameContainer(getHash(), newState.getStateToken(), newTitle); assertEquals(newTitle, result); - final StateDTO folderAgain = contentService.getContent(getHash(), groupShortName, newFolderToken); + final StateDTO folderAgain = contentService.getContent(getHash(), newState.getStateToken()); assertEquals(newTitle, folderAgain.getContainer().getName()); } Modified: trunk/src/test/java/org/ourproject/kune/platf/integration/socialnet/SocialNetworkServiceTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/integration/socialnet/SocialNetworkServiceTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/integration/socialnet/SocialNetworkServiceTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -6,6 +6,7 @@ import org.junit.Test; import org.ourproject.kune.platf.client.dto.ParticipationDataDTO; import org.ourproject.kune.platf.client.dto.SocialNetworkDTO; +import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.errors.AlreadyUserMemberException; import org.ourproject.kune.platf.client.errors.UserMustBeLoggedException; import org.ourproject.kune.platf.client.rpc.SocialNetworkService; @@ -21,35 +22,35 @@ @Inject SocialNetworkService socialNetworkService; - private String groupShortName; + private StateToken groupToken; @Before public void init() { new IntegrationTestHelper(this); - groupShortName = getDefSiteGroupName(); + groupToken = new StateToken(getDefSiteGroupName()); } @Test public void testGetGroupMembersNotLogged() throws Exception { - final SocialNetworkDTO groupMembers = socialNetworkService.getGroupMembers(null, groupShortName); + final SocialNetworkDTO groupMembers = socialNetworkService.getGroupMembers(null, groupToken); assertNotNull(groupMembers); } @Test public void testGetParticipationNotLogged() throws Exception { - final ParticipationDataDTO participation = socialNetworkService.getParticipation(null, groupShortName); + final ParticipationDataDTO participation = socialNetworkService.getParticipation(null, groupToken); assertNotNull(participation); } @Test(expected = UserMustBeLoggedException.class) public void testRequestJoinNoLogged() throws Exception { - socialNetworkService.requestJoinGroup(session.getHash(), groupShortName); + socialNetworkService.requestJoinGroup(session.getHash(), groupToken); } @Test(expected = AlreadyUserMemberException.class) public void testRequestJoinPersonalGroup() throws Exception { doLogin(); - socialNetworkService.requestJoinGroup(session.getHash(), groupShortName); + socialNetworkService.requestJoinGroup(session.getHash(), groupToken); } } Modified: trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthenticatedMethodInterceptorTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthenticatedMethodInterceptorTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthenticatedMethodInterceptorTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -32,24 +32,24 @@ @Test(expected = UserMustBeLoggedException.class) public void hashNullAndMandatoryMustDoNothing() throws Throwable { Mockito.stub(authAnnotation.mandatory()).toReturn(true); - final Object[] result = { null }; - Mockito.stub(invocation.getArguments()).toReturn(result); + final Object[] arguments = { null }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); auth.invoke(invocation); } @Test public void hashNullAndNotMandatoryMustDoNothing() throws Throwable { Mockito.stub(authAnnotation.mandatory()).toReturn(false); - final Object[] result = { null }; - Mockito.stub(invocation.getArguments()).toReturn(result); + final Object[] arguments = { null }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); auth.invoke(invocation); } @Test public void hashNullAsStringAndNotMandatoryMustDoNothing() throws Throwable { Mockito.stub(authAnnotation.mandatory()).toReturn(false); - final Object[] result = { "null" }; - Mockito.stub(invocation.getArguments()).toReturn(result); + final Object[] arguments = { "null" }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); auth.invoke(invocation); } @@ -57,8 +57,8 @@ public void otherHashAndMandatoryAndLoggedMustSessionExp() throws Throwable { doLogin(); Mockito.stub(authAnnotation.mandatory()).toReturn(true); - final Object[] result = { "other-hash" }; - Mockito.stub(invocation.getArguments()).toReturn(result); + final Object[] arguments = { "other-hash" }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); auth.invoke(invocation); } @@ -66,16 +66,16 @@ public void sameHashAndMandatoryAndLoggedMustSessionExp() throws Throwable { doLogin(); Mockito.stub(authAnnotation.mandatory()).toReturn(true); - final Object[] result = { getHash() }; - Mockito.stub(invocation.getArguments()).toReturn(result); + final Object[] arguments = { getHash() }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); auth.invoke(invocation); } @Test(expected = SessionExpiredException.class) public void someHashAndMandatoryAndNotLoggedMustSessionExp() throws Throwable { Mockito.stub(authAnnotation.mandatory()).toReturn(true); - final Object[] result = { "some-hash" }; - Mockito.stub(invocation.getArguments()).toReturn(result); + final Object[] arguments = { "some-hash" }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); auth.invoke(invocation); } } Modified: trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptorTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptorTest.java 2008-09-15 04:12:48 UTC (rev 871) +++ trunk/src/test/java/org/ourproject/kune/platf/server/auth/AuthorizatedMethodInterceptorTest.java 2008-09-18 00:45:41 UTC (rev 872) @@ -4,9 +4,14 @@ import org.aopalliance.intercept.MethodInvocation; import org.junit.Before; +import org.junit.Test; import org.mockito.Mockito; +import org.ourproject.kune.platf.client.dto.StateToken; +import org.ourproject.kune.platf.client.errors.AccessViolationException; +import org.ourproject.kune.platf.client.errors.ContentNotFoundException; import org.ourproject.kune.platf.integration.IntegrationTest; import org.ourproject.kune.platf.integration.IntegrationTestHelper; +import org.ourproject.kune.platf.server.access.AccessRol; public class AuthorizatedMethodInterceptorTest extends IntegrationTest { @@ -24,8 +29,34 @@ Mockito.stub(invocation.getStaticPart()).toReturn(accessibleObject); authAnnotation = Mockito.mock(Authorizated.class); Mockito.stub(accessibleObject.getAnnotation(Authorizated.class)).toReturn(authAnnotation); - // AccessType accessType = authoAnnotation.accessTypeRequired(); - // boolean checkContent = authoAnnotation.checkContent(); + } + @Test(expected = ContentNotFoundException.class) + public void tesHashNullContainer() throws Throwable { + // Mockito.stub(authAnnotation.accessRolRequired()).toReturn(AccessRol.Administrator); + Mockito.stub(authAnnotation.actionLevel()).toReturn(ActionLevel.content); + final Object[] arguments = { getHash(), new StateToken("group.docs") }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); + auth.invoke(invocation); + } + + @Test(expected = ContentNotFoundException.class) + public void testHashNullContent() throws Throwable { + Mockito.stub(authAnnotation.actionLevel()).toReturn(ActionLevel.content); + final Object[] arguments = { getHash(), new StateToken("group.docs.1") }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); + auth.invoke(invocation); + } + + @Test(expected = AccessViolationException.class) + public void wrongGroupNameThrowsExcep() throws Throwable { + doLogin(); + Mockito.stub(authAnnotation.accessRolRequired()).toReturn(AccessRol.Administrator); + Mockito.stub(authAnnotation.actionLevel()).toReturn(ActionLevel.content); + final Object[] arguments = { getHash(), new StateToken("groupWRONG.docs.1.1") }; + Mockito.stub(invocation.getArguments()).toReturn(arguments); + auth.invoke(invocation); + } + }