r1514 - in trunk/src: main/java/cc/kune/common/client/tooltip main/java/cc/kune/common/client/ui/dialogs/tabbed main/java/cc/kune/core/client main/java/cc/kune/core/server main/java/cc/kune/core/server/access main/java/cc/kune/core/server/auth main/java/cc/kune/core/server/rpc main/java/cc/kune/gspace/client/i18n main/java/cc/kune/lists/client/actions test/java/cc/kune/core/server/auth
Author: vjrj_ Date: 2011-09-11 14:02:36 +0200 (Sun, 11 Sep 2011) New Revision: 1514 Added: trunk/src/main/java/cc/kune/core/server/access/AccessRightsUtils.java trunk/src/main/java/cc/kune/core/server/auth/SuperAdmin.java trunk/src/main/java/cc/kune/core/server/auth/SuperAdminMethodInterceptor.java trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml trunk/src/test/java/cc/kune/core/server/auth/SuperAdminMethodInterceptorTest.java Removed: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml Modified: trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java trunk/src/main/java/cc/kune/common/client/ui/dialogs/tabbed/AbstractTabbedDialogPanel.java trunk/src/main/java/cc/kune/core/client/CoreGinModule.java trunk/src/main/java/cc/kune/core/server/PlatformServerModule.java trunk/src/main/java/cc/kune/core/server/auth/AuthorizatedMethodInterceptor.java trunk/src/main/java/cc/kune/core/server/rpc/I18nRPC.java trunk/src/main/java/cc/kune/gspace/client/i18n/I18nCellList.ui.xml trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorPresenter.java trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTraslatorSaver.java trunk/src/main/java/cc/kune/gspace/client/i18n/SiteOptionsI18nTranslatorAction.java trunk/src/main/java/cc/kune/lists/client/actions/NewListAction.java trunk/src/main/java/cc/kune/lists/client/actions/NewListPostAction.java Log: NEW - # 79: I18n refactorization http://kune.ourproject.org/issues/ticket/79 Modified: trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java =================================================================== --- trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/common/client/tooltip/Tooltip.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -57,22 +57,19 @@ private static final int WIDTH_NOT_DEFINED = -1; public static Tooltip to(final Widget widget, final String text) { - if (TextUtils.notEmpty(text)) { - final Tooltip tip = new Tooltip(); - tip.to(widget); - tip.setText(text); - widget.addAttachHandler(new Handler() { - @Override - public void onAttachOrDetach(final AttachEvent event) { - if (!event.isAttached()) { - tip.hide(); - } + final Tooltip tip = new Tooltip(); + tip.to(widget); + tip.setText(text); + widget.addAttachHandler(new Handler() { + @Override + public void onAttachOrDetach(final AttachEvent event) { + if (!event.isAttached()) { + tip.hide(); } + } - }); - return tip; - } - return null; + }); + return tip; } public static Tooltip to(final Widget widget, final Widget withContent) { @@ -85,16 +82,20 @@ HTMLPanel arrow; @UiField HTMLPanel arrowBorder; + private boolean containsText; @UiField FlowPanel content; @UiField FlowPanel flow; private Widget ofWidget; + private final Label textLabel; private final TooltipTimers timers; @UiField InlineLabel title; + @UiField HTMLPanel tooltip; + private int width = WIDTH_NOT_DEFINED; public Tooltip() { @@ -120,6 +121,7 @@ outTimer.configure(hideExecuter); securityTimer.configure(hideExecuter); timers = new TooltipTimers(overTimer, outTimer, securityTimer); + textLabel = new Label(); } protected int getHeight() { @@ -145,11 +147,14 @@ private void setContent(final Widget widget) { content.clear(); content.add(widget); + containsText = false; } public void setText(final String text) { content.clear(); - content.add(new Label(text)); + content.add(textLabel); + textLabel.setText(text); + containsText = true; } public void setWidth(final int width) { @@ -158,7 +163,8 @@ @Override public void show() { - if (!Tooltip.this.isShowing() && ofWidget.isAttached() && ofWidget.isVisible()) { + if (!Tooltip.this.isShowing() && ofWidget.isAttached() && ofWidget.isVisible() + && (!containsText || TextUtils.notEmpty(textLabel.getText()))) { Tooltip.super.show(); if (Tooltip.current != null) { Tooltip.current.hide(); Modified: trunk/src/main/java/cc/kune/common/client/ui/dialogs/tabbed/AbstractTabbedDialogPanel.java =================================================================== --- trunk/src/main/java/cc/kune/common/client/ui/dialogs/tabbed/AbstractTabbedDialogPanel.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/common/client/ui/dialogs/tabbed/AbstractTabbedDialogPanel.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -144,12 +144,11 @@ } messageErrorBar = new MessageToolbar(images, errorLabelId); tabPanel = new TabLayoutPanel(25, Unit.PX); - tabPanel.addStyleName("oc-noselec"); + tabPanel.addStyleName("oc-noselect"); + dialog.getInnerPanel().add(tabPanel); tabPanel.addSelectionHandler(new SelectionHandler<Integer>() { @Override public void onSelection(final SelectionEvent<Integer> event) { - // dialog.recalculateSize(); - dialog.showCentered(); Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { @@ -165,7 +164,6 @@ if (height != NO_SIZE) { tabPanel.setHeight(String.valueOf(height) + "px"); } - dialog.getInnerPanel().add(tabPanel); tabPanel.addStyleName("k-tabpanel-aditionalpadding"); tabPanel.addStyleName("k-tabs"); dialog.getFirstBtn().addClickHandler(new ClickHandler() { Modified: trunk/src/main/java/cc/kune/core/client/CoreGinModule.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/CoreGinModule.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/core/client/CoreGinModule.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -75,8 +75,8 @@ import cc.kune.core.client.sitebar.SitebarSignOutLink.BeforeSignOut; import cc.kune.core.client.sitebar.logo.SiteLogoPresenter; import cc.kune.core.client.sitebar.logo.SiteLogoViewImpl; +import cc.kune.core.client.sitebar.spaces.SpaceSelectorPanel; import cc.kune.core.client.sitebar.spaces.SpaceSelectorPresenter; -import cc.kune.core.client.sitebar.spaces.SpaceSelectorPanel; import cc.kune.core.client.sn.GroupSNPanel; import cc.kune.core.client.sn.GroupSNPresenter; import cc.kune.core.client.sn.UserSNPanel; Modified: trunk/src/main/java/cc/kune/core/server/PlatformServerModule.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/PlatformServerModule.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/core/server/PlatformServerModule.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -30,6 +30,7 @@ import cc.kune.core.client.rpcservices.UserService; import cc.kune.core.server.access.AccessRightsService; import cc.kune.core.server.access.AccessRightsServiceDefault; +import cc.kune.core.server.access.AccessRightsUtils; import cc.kune.core.server.access.AccessService; import cc.kune.core.server.access.AccessServiceDefault; import cc.kune.core.server.access.FinderService; @@ -40,6 +41,8 @@ import cc.kune.core.server.auth.AuthorizatedMethodInterceptor; import cc.kune.core.server.auth.SessionService; import cc.kune.core.server.auth.SessionServiceDefault; +import cc.kune.core.server.auth.SuperAdmin; +import cc.kune.core.server.auth.SuperAdminMethodInterceptor; import cc.kune.core.server.content.ContainerManager; import cc.kune.core.server.content.ContainerManagerDefault; import cc.kune.core.server.content.ContentManager; @@ -176,11 +179,13 @@ bind(EntityLogoUploadManager.class); bind(EntityLogoDownloadManager.class); bind(ParticipantUtils.class); - + requestStaticInjection(AccessRightsUtils.class); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Authenticated.class), outermostCall(new AuthenticatedMethodInterceptor())); bindInterceptor(Matchers.any(), Matchers.annotatedWith(Authorizated.class), outermostCall(new AuthorizatedMethodInterceptor())); + bindInterceptor(Matchers.any(), Matchers.annotatedWith(SuperAdmin.class), + outermostCall(new SuperAdminMethodInterceptor())); } } Added: trunk/src/main/java/cc/kune/core/server/access/AccessRightsUtils.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/access/AccessRightsUtils.java (rev 0) +++ trunk/src/main/java/cc/kune/core/server/access/AccessRightsUtils.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -0,0 +1,30 @@ +package cc.kune.core.server.access; + +import cc.kune.core.shared.domain.AccessRol; +import cc.kune.core.shared.domain.utils.AccessRights; +import cc.kune.domain.Group; +import cc.kune.domain.User; + +import com.google.inject.Inject; +import com.google.inject.Singleton; + +@Singleton +public class AccessRightsUtils { + + @Inject + private static AccessRightsService rightsService; + + public static boolean correctMember(final User user, final Group group, final AccessRol memberType) { + + final AccessRights accessRights = rightsService.get(user, group.getSocialNetwork().getAccessLists()); + + switch (memberType) { + case Administrator: + return accessRights.isAdministrable(); + case Editor: + return accessRights.isEditable(); + default: + return accessRights.isVisible(); + } + } +} Modified: trunk/src/main/java/cc/kune/core/server/auth/AuthorizatedMethodInterceptor.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/auth/AuthorizatedMethodInterceptor.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/core/server/auth/AuthorizatedMethodInterceptor.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -26,12 +26,11 @@ import cc.kune.core.client.errors.AccessViolationException; import cc.kune.core.server.UserSession; -import cc.kune.core.server.access.AccessRightsService; +import cc.kune.core.server.access.AccessRightsUtils; import cc.kune.core.server.access.AccessService; import cc.kune.core.server.content.ContentUtils; import cc.kune.core.server.manager.GroupManager; import cc.kune.core.shared.domain.AccessRol; -import cc.kune.core.shared.domain.utils.AccessRights; import cc.kune.core.shared.domain.utils.StateToken; import cc.kune.domain.Container; import cc.kune.domain.Content; @@ -45,84 +44,67 @@ @Singleton public class AuthorizatedMethodInterceptor implements MethodInterceptor { - @Inject - private Provider<UserSession> userSessionProvider; - @Inject - private Provider<GroupManager> groupManagerProvider; - @Inject - private Provider<AccessRightsService> accessRightsServiceProvider; - @Inject - private Provider<AccessService> accessServiceProvider; + @Inject + private Provider<AccessService> accessServiceProvider; + @Inject + private Provider<GroupManager> groupManagerProvider; + @Inject + private Provider<UserSession> userSessionProvider; - public Object invoke(final MethodInvocation invocation) throws Throwable { - final Object[] arguments = invocation.getArguments(); - final StateToken token = (StateToken) arguments[1]; + @Override + public Object invoke(final MethodInvocation invocation) throws Throwable { + final Object[] arguments = invocation.getArguments(); + final StateToken token = (StateToken) arguments[1]; - final UserSession userSession = userSessionProvider.get(); - final GroupManager groupManager = groupManagerProvider.get(); - final AccessService accessService = accessServiceProvider.get(); + final UserSession userSession = userSessionProvider.get(); + final GroupManager groupManager = groupManagerProvider.get(); + final AccessService accessService = accessServiceProvider.get(); - final Authorizated authoAnnotation = invocation.getStaticPart().getAnnotation(Authorizated.class); - final AccessRol accessRol = authoAnnotation.accessRolRequired(); - final ActionLevel actionLevel = authoAnnotation.actionLevel(); - final boolean mustBeMember = authoAnnotation.mustCheckMembership(); + final Authorizated authoAnnotation = invocation.getStaticPart().getAnnotation(Authorizated.class); + final AccessRol accessRol = authoAnnotation.accessRolRequired(); + final ActionLevel actionLevel = authoAnnotation.actionLevel(); + final boolean mustBeMember = authoAnnotation.mustCheckMembership(); - final User user = userSession.getUser(); - Group group = Group.NO_GROUP; - try { - group = groupManager.findByShortName(token.getGroup()); - } catch (final 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 + } - switch (actionLevel) { - case content: - default: - final Content content = accessService.accessToContent(ContentUtils.parseId(token.getDocument()), user, - accessRol); - if (!content.getContainer().getOwner().equals(group)) { - throw new AccessViolationException(); - } - if (!content.getContainer().getId().equals(ContentUtils.parseId(token.getFolder()))) { - throw new AccessViolationException(); - } - if (!content.getContainer().getToolName().equals(token.getTool())) { - throw new AccessViolationException(); - } - case container: - final Container container = accessService.accessToContainer(ContentUtils.parseId(token.getFolder()), user, - accessRol); - if (!container.getOwner().equals(group)) { - throw new AccessViolationException(); - } - case tool: - case group: - break; - } - - if (mustBeMember) { - if (!correctMember(user, group, accessRol)) { - throw new AccessViolationException(); - } - } - - return invocation.proceed(); + switch (actionLevel) { + case content: + default: + final Content content = accessService.accessToContent(ContentUtils.parseId(token.getDocument()), + user, accessRol); + if (!content.getContainer().getOwner().equals(group)) { + throw new AccessViolationException(); + } + if (!content.getContainer().getId().equals(ContentUtils.parseId(token.getFolder()))) { + throw new AccessViolationException(); + } + if (!content.getContainer().getToolName().equals(token.getTool())) { + throw new AccessViolationException(); + } + case container: + final Container container = accessService.accessToContainer( + ContentUtils.parseId(token.getFolder()), user, accessRol); + if (!container.getOwner().equals(group)) { + throw new AccessViolationException(); + } + case tool: + case group: + break; } - private boolean correctMember(final User user, final Group group, final AccessRol memberType) - throws AccessViolationException { - - final AccessRights accessRights = accessRightsServiceProvider.get().get(user, - group.getSocialNetwork().getAccessLists()); - - switch (memberType) { - case Administrator: - return accessRights.isAdministrable(); - case Editor: - return accessRights.isEditable(); - default: - return accessRights.isVisible(); - } + if (mustBeMember) { + if (!AccessRightsUtils.correctMember(user, group, accessRol)) { + throw new AccessViolationException(); + } } + return invocation.proceed(); + } + } Added: trunk/src/main/java/cc/kune/core/server/auth/SuperAdmin.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/auth/SuperAdmin.java (rev 0) +++ trunk/src/main/java/cc/kune/core/server/auth/SuperAdmin.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -0,0 +1,40 @@ +/* + * + * Copyright (C) 2007-2011 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 cc.kune.core.server.auth; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import cc.kune.core.shared.domain.AccessRol; + +import com.google.inject.BindingAnnotation; + +/** + * Use in *RPC methods to check if user is superadmin + * + * The first param in the method must be the userHash + */ +@BindingAnnotation +@Retention(RetentionPolicy.RUNTIME) +public @interface SuperAdmin { + + AccessRol rol() default AccessRol.Administrator; + +} Added: trunk/src/main/java/cc/kune/core/server/auth/SuperAdminMethodInterceptor.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/auth/SuperAdminMethodInterceptor.java (rev 0) +++ trunk/src/main/java/cc/kune/core/server/auth/SuperAdminMethodInterceptor.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -0,0 +1,93 @@ +/* + * + * Copyright (C) 2007-2011 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 cc.kune.core.server.auth; + +import javax.servlet.http.HttpServletRequest; + +import org.aopalliance.intercept.MethodInterceptor; +import org.aopalliance.intercept.MethodInvocation; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import cc.kune.core.client.errors.AccessViolationException; +import cc.kune.core.client.errors.SessionExpiredException; +import cc.kune.core.client.errors.UserMustBeLoggedException; +import cc.kune.core.server.UserSession; +import cc.kune.core.server.access.AccessRightsUtils; +import cc.kune.core.server.properties.KuneProperties; +import cc.kune.core.shared.domain.AccessRol; +import cc.kune.domain.Group; +import cc.kune.domain.User; +import cc.kune.domain.finders.GroupFinder; + +import com.google.inject.Inject; +import com.google.inject.Provider; + +public class SuperAdminMethodInterceptor implements MethodInterceptor { + + public static final Log LOG = LogFactory.getLog(SuperAdminMethodInterceptor.class); + + @Inject + Provider<GroupFinder> groupFinder; + @Inject + Provider<KuneProperties> kuneProperties; + @Inject + Provider<HttpServletRequest> requestProvider; + @Inject + Provider<SessionService> sessionServiceProvider; + private Group siteGroup; + @Inject + Provider<UserSession> userSessionProvider; + + @Override + public Object invoke(final MethodInvocation invocation) throws Throwable { + final Object[] arguments = invocation.getArguments(); + // Some browsers getCookie returns "null" as String instead of null + final String userHash = arguments[0] == null || arguments[0].equals("null") ? null + : (String) arguments[0]; + + LOG.info("Method: " + invocation.getMethod().getName()); + LOG.info("Userhash received: " + userHash); + LOG.info("--------------------------------------------------------------------------------"); + final UserSession userSession = userSessionProvider.get(); + + final SuperAdmin authAnnotation = invocation.getStaticPart().getAnnotation(SuperAdmin.class); + final AccessRol rol = authAnnotation.rol(); + + if (siteGroup == null) { + siteGroup = groupFinder.get().findByShortName( + kuneProperties.get().get(KuneProperties.DEFAULT_SITE_SHORT_NAME)); + } + + if (userHash == null) { + throw new UserMustBeLoggedException(); + } else if (userSession.isUserNotLoggedIn()) { + LOG.info("Session expired (not logged in server and mandatory)"); + throw new SessionExpiredException(); + } else { + User user = userSession.getUser(); + if (!AccessRightsUtils.correctMember(user, siteGroup, rol)) { + throw new AccessViolationException(); + } + } + final Object result = invocation.proceed(); + return result; + } +} Modified: trunk/src/main/java/cc/kune/core/server/rpc/I18nRPC.java =================================================================== --- trunk/src/main/java/cc/kune/core/server/rpc/I18nRPC.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/core/server/rpc/I18nRPC.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -30,9 +30,11 @@ import cc.kune.core.client.rpcservices.I18nService; import cc.kune.core.server.UserSession; import cc.kune.core.server.auth.Authenticated; +import cc.kune.core.server.auth.SuperAdmin; import cc.kune.core.server.manager.I18nLanguageManager; import cc.kune.core.server.manager.I18nTranslationManager; import cc.kune.core.server.mapper.Mapper; +import cc.kune.core.shared.domain.AccessRol; import cc.kune.core.shared.dto.I18nLanguageDTO; import cc.kune.core.shared.dto.I18nTranslationDTO; import cc.kune.domain.I18nLanguage; @@ -139,6 +141,7 @@ @Override @Authenticated @Transactional + @SuperAdmin(rol = AccessRol.Editor) public String setTranslation(final String userHash, final Long id, final String translation) throws DefaultException { return i18nTranslationManager.setTranslation(id, translation); Modified: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nCellList.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nCellList.ui.xml 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nCellList.ui.xml 2011-09-11 12:02:36 UTC (rev 1514) @@ -32,7 +32,8 @@ <s:RangeLabelPager ui:field='rangeLabelPager'/> </td> <td class='{style.formCell}' valign='top' align='center'> - <s:I18nTranslatorForm ui:field='translatorForm'/> + <s:I18nTranslatorForm + ui:field='translatorForm'/> <br/> </td> </tr> Deleted: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -1,186 +0,0 @@ -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package cc.kune.gspace.client.i18n; - -import cc.kune.common.client.tooltip.Tooltip; -import cc.kune.core.shared.dto.I18nLanguageSimpleDTO; -import cc.kune.core.shared.dto.I18nTranslationDTO; -import cc.kune.core.shared.i18n.I18nTranslationService; - -import com.google.gwt.core.client.GWT; -import com.google.gwt.event.dom.client.BlurEvent; -import com.google.gwt.event.dom.client.ChangeEvent; -import com.google.gwt.event.dom.client.ClickEvent; -import com.google.gwt.event.dom.client.KeyPressEvent; -import com.google.gwt.uibinder.client.UiBinder; -import com.google.gwt.uibinder.client.UiField; -import com.google.gwt.uibinder.client.UiHandler; -import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.ui.Composite; -import com.google.gwt.user.client.ui.Label; -import com.google.gwt.user.client.ui.PushButton; -import com.google.gwt.user.client.ui.TextArea; -import com.google.gwt.user.client.ui.Widget; - -/** - * A form used for editing contacts. - */ -public class I18nTranslatorForm extends Composite { - - interface Binder extends UiBinder<Widget, I18nTranslatorForm> { - } - - private static Binder uiBinder = GWT.create(Binder.class); - @UiField - PushButton copyIcon; - private I18nTranslationDataProvider dataProvider; - private I18nTranslationService i18n; - private I18nTranslationDTO item; - @UiField - Label keyboardRecomendation; - @UiField - Label keyboardRecomendationTitle; - private final Timer keyboardTimer; - @UiField - Label noteForTranslators; - @UiField - Label noteForTranslatorsTittle; - private I18nTraslatorSaver saver; - @UiField - Label toLanguageTitle; - @UiField - Label toTranslate; - @UiField - Label toTranslateTitle; - @UiField - TextArea translation; - - public I18nTranslatorForm() { - initWidget(uiBinder.createAndBindUi(this)); - keyboardTimer = new Timer() { - @Override - public void run() { - update(); - } - }; - } - - private void copyTranslation() { - translation.setText(toTranslate.getText()); - } - - public void focusToTranslate() { - translation.setFocus(true); - } - - @UiHandler("translation") - void handleBlur(final BlurEvent event) { - update(); - } - - @UiHandler("copyIcon") - void handleClickOnCopyIcon(final ClickEvent e) { - copyTranslation(); - translation.setFocus(true); - updateWithTimer(); - } - - @UiHandler("translation") - void handleKeyPress(final ChangeEvent event) { - updateWithTimer(); - } - - @UiHandler("translation") - void handleKeyPress(final KeyPressEvent event) { - if (event.isAltKeyDown() - && event.getNativeEvent().getKeyCode() == com.google.gwt.event.dom.client.KeyCodes.KEY_PAGEUP) { - saveIfNeeded(); - dataProvider.selectPrevious(); - } else if (event.isAltKeyDown() - && event.getNativeEvent().getKeyCode() == com.google.gwt.event.dom.client.KeyCodes.KEY_PAGEDOWN) { - saveIfNeeded(); - dataProvider.selectNext(); - } else if (event.isAltKeyDown() && event.getCharCode() == 'v') { - copyTranslation(); - event.stopPropagation(); - updateWithTimer(); - } - } - - public void init(final I18nTranslationDataProvider dataProvider, final I18nTranslationService i18n, - final I18nTraslatorSaver saver) { - this.dataProvider = dataProvider; - this.i18n = i18n; - this.saver = saver; - Tooltip.to(copyIcon, i18n.t("Copy the text to translate")); - toTranslateTitle.setText(i18n.t("translate this:")); - noteForTranslatorsTittle.setText(i18n.t("Notes:")); - keyboardRecomendationTitle.setText(i18n.t("Tip:")); - keyboardRecomendation.setText(i18n.t("Pulse Alt+PageUp or Alt+PageDown to move up/down in the list while translating, and Alt-V to copy the original text. The translations are autosaved")); - } - - private void saveIfNeeded() { - keyboardTimer.cancel(); - final String newTranslation = translation.getText(); - if (item != null && !item.getText().equals(newTranslation)) { - saver.save(new I18nTranslationDTO(item.getId(), item.getTrKey(), newTranslation)); - } - } - - public void setInfo(final I18nTranslationDTO item) { - saveIfNeeded(); - this.item = item; - final String[] splitted = splitNT(item.getTrKey()); - toTranslate.setText(splitted[0]); - final boolean hasNT = splitted.length > 1; - noteForTranslators.setVisible(hasNT); - noteForTranslatorsTittle.setVisible(hasNT); - if (hasNT) { - noteForTranslators.setText(splitted[1]); - } - translation.setText(item.getText()); - } - - public void setToLanguage(final I18nLanguageSimpleDTO language) { - toLanguageTitle.setText(i18n.tWithNT("to [%s]:", "For example, 'to Spanish':", - language.getEnglishName())); - } - - private String[] splitNT(final String textWithNT) { - String[] nt; - final String[] splitted = textWithNT.split(" \\[%NT "); - if (splitted.length > 1) { - nt = splitted[1].split("\\]$"); - splitted[1] = nt[0]; - } - return splitted; - } - - private void update() { - keyboardTimer.cancel(); - if (item != null) { - item.setText(translation.getText()); - item.setDirty(true); - dataProvider.refreshDisplays(); - saveIfNeeded(); - } - } - - private void updateWithTimer() { - keyboardTimer.cancel(); - keyboardTimer.schedule(3000); - } -} Added: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java (rev 0) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -0,0 +1,180 @@ +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package cc.kune.gspace.client.i18n; + +import cc.kune.common.client.tooltip.Tooltip; +import cc.kune.common.client.utils.TextUtils; +import cc.kune.core.shared.dto.I18nLanguageSimpleDTO; +import cc.kune.core.shared.dto.I18nTranslationDTO; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.event.dom.client.BlurEvent; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.KeyPressEvent; +import com.google.gwt.uibinder.client.UiBinder; +import com.google.gwt.uibinder.client.UiField; +import com.google.gwt.uibinder.client.UiHandler; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.PushButton; +import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.Widget; + +/** + * A form used for editing contacts. + */ +public class I18nTranslatorForm extends Composite { + + interface Binder extends UiBinder<Widget, I18nTranslatorForm> { + } + + private static Binder uiBinder = GWT.create(Binder.class); + @UiField + PushButton copyIcon; + private I18nTranslationDataProvider dataProvider; + private I18nTranslationService i18n; + private I18nTranslationDTO item; + @UiField + Label keyboardRecomendation; + @UiField + Label keyboardRecomendationTitle; + private final Timer keyboardTimer; + @UiField + Label noteForTranslators; + @UiField + Label noteForTranslatorsTittle; + private I18nTraslatorSaver saver; + @UiField + Label toLanguageTitle; + @UiField + Label toTranslate; + @UiField + Label toTranslateTitle; + @UiField + TextArea translation; + + public I18nTranslatorForm() { + initWidget(uiBinder.createAndBindUi(this)); + keyboardTimer = new Timer() { + @Override + public void run() { + saveIfNeeded(); + } + }; + } + + private void copyTranslation() { + translation.setText(toTranslate.getText()); + } + + public void focusToTranslate() { + translation.setFocus(true); + } + + @UiHandler("translation") + void handleBlur(final BlurEvent event) { + saveIfNeeded(); + } + + @UiHandler("copyIcon") + void handleClickOnCopyIcon(final ClickEvent e) { + copyTranslation(); + translation.setFocus(true); + updateWithTimer(); + } + + @UiHandler("translation") + void handleKeyPress(final ChangeEvent event) { + updateWithTimer(); + } + + @UiHandler("translation") + void handleKeyPress(final KeyPressEvent event) { + if (event.isAltKeyDown() + && event.getNativeEvent().getKeyCode() == com.google.gwt.event.dom.client.KeyCodes.KEY_PAGEUP) { + saveIfNeeded(); + dataProvider.selectPrevious(); + } else if (event.isAltKeyDown() + && event.getNativeEvent().getKeyCode() == com.google.gwt.event.dom.client.KeyCodes.KEY_PAGEDOWN) { + saveIfNeeded(); + dataProvider.selectNext(); + } else if (event.isAltKeyDown() && event.getCharCode() == 'v') { + copyTranslation(); + event.stopPropagation(); + updateWithTimer(); + } + } + + public void init(final I18nTranslationDataProvider dataProvider, final I18nTranslationService i18n, + final I18nTraslatorSaver saver) { + this.dataProvider = dataProvider; + this.i18n = i18n; + this.saver = saver; + Tooltip.to(copyIcon, i18n.t("Copy the text to translate")); + toTranslateTitle.setText(i18n.t("translate this:")); + noteForTranslatorsTittle.setText(i18n.t("Notes:")); + keyboardRecomendationTitle.setText(i18n.t("Tip:")); + keyboardRecomendation.setText(i18n.t("Pulse Alt+PageUp or Alt+PageDown to move up/down in the list while translating, and Alt-V to copy the original text. The translations are autosaved")); + } + + private void saveIfNeeded() { + keyboardTimer.cancel(); + final String newTranslation = translation.getText(); + if (item != null && TextUtils.notEmpty(newTranslation) && !newTranslation.equals(item.getText())) { + item.setText(translation.getText()); + item.setDirty(true); + dataProvider.refreshDisplays(); + saver.save(new I18nTranslationDTO(item.getId(), item.getTrKey(), newTranslation)); + } + } + + public void setInfo(final I18nTranslationDTO item) { + saveIfNeeded(); + this.item = item; + final String[] splitted = splitNT(item.getTrKey()); + toTranslate.setText(splitted[0]); + final boolean hasNT = splitted.length > 1; + noteForTranslators.setVisible(hasNT); + noteForTranslatorsTittle.setVisible(hasNT); + if (hasNT) { + noteForTranslators.setText(splitted[1]); + } + translation.setText(item.getText()); + } + + public void setToLanguage(final I18nLanguageSimpleDTO language) { + toLanguageTitle.setText(i18n.tWithNT("to [%s]:", "For example, 'to Spanish':", + language.getEnglishName())); + } + + private String[] splitNT(final String textWithNT) { + String[] nt; + final String[] splitted = textWithNT.split(" \\[%NT "); + if (splitted.length > 1) { + nt = splitted[1].split("\\]$"); + splitted[1] = nt[0]; + } + return splitted; + } + + private void updateWithTimer() { + keyboardTimer.cancel(); + keyboardTimer.schedule(3000); + } +} Deleted: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml 2011-09-11 12:02:36 UTC (rev 1514) @@ -1,102 +0,0 @@ -<!DOCTYPE ui:UiBinder SYSTEM 'http://dl.google.com/gwt/DTD/xhtml.ent'> -<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' - xmlns:g='urn:import:com.google.gwt.user.client.ui' xmlns:d='urn:import:com.google.gwt.user.datepicker.client' - ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat' - ui:generateLocales='default'> - - <ui:with field='res' type='cc.kune.core.client.resources.CoreResources'/> - - <ui:style> - .titles { - font-size: bold; - text-align: right; - padding-right: 10px; - vertical-align: top; - } - - .table { - display: table; - } - - .copyicon { - vertical-align: top; - height: 10px !important; - -webkit-border-bottom-right-radius: 5px; - -moz-border-radius-bottomright: 5px; - border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; - -moz-border-radius-bottomleft: 5px; - border-bottom-left-radius: 5px; - } - - .row { - display: table-row; - margin: 5px 5px 15px 5px; - } - - .cell { - display: table-cell; - padding: 5px; - } - - .tip { - width: 180px; - padding: 5px; - font-size: 9px; - vertical-align: top; - } - - .toTranslate { - width: 180px; - height: 95px; - border: 1px dashed #BBBBBB; - } - - div.toTranslate { - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - padding: 3px; - } - - .toTranlateLabel { - height: 95px !important; - overflow-y: scroll; - } - </ui:style> - <g:FlowPanel addStyleNames="{style.table}"> - <g:FlowPanel addStyleNames="{style.row}"> - <g:Label ui:field="toTranslateTitle" addStyleNames="{style.titles} {style.cell}"/> - <g:FlowPanel addStyleNames="{style.cell}" styleName="{style.toTranslate}"> - <g:Label ui:field="toTranslate" styleName="{style.toTranlateLabel}"/> - </g:FlowPanel> - <g:Label addStyleNames="{style.row}"/> - </g:FlowPanel> - <g:FlowPanel addStyleNames="{style.row}"> - <g:Label ui:field="toLanguageTitle" addStyleNames="{style.titles} {style.cell}"/> - <g:TextArea ui:field='translation' addStyleNames="{style.cell}" - visibleLines="5"/> - <g:FlowPanel styleName="k-button" - addStyleNames="{style.cell} {style.copyicon} k-button k-btn k-5corners"> - <g:PushButton ui:field='copyIcon' enabled='true'> - <g:upFace image='{res.arrowUndo}'/> - <g:upHoveringFace/> - <g:downFace/> - <g:downHoveringFace/> - </g:PushButton> - </g:FlowPanel> - </g:FlowPanel> - <g:FlowPanel addStyleNames="{style.row}"> - <g:Label ui:field="noteForTranslatorsTittle" visible="false" - addStyleNames="{style.titles} {style.cell}"/> - <g:Label ui:field="noteForTranslators" addStyleNames="{style.cell}"/> - <g:Label addStyleNames="{style.row}"/> - </g:FlowPanel> - <g:FlowPanel addStyleNames="{style.row}"> - <g:Label ui:field="keyboardRecomendationTitle" - addStyleNames="{style.titles} {style.cell}"/> - <g:Label ui:field="keyboardRecomendation" addStyleNames="{style.cell} {style.tip}"/> - <g:Label addStyleNames="{style.row}"/> - </g:FlowPanel> - </g:FlowPanel> -</ui:UiBinder> Added: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml (rev 0) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorForm.ui.xml 2011-09-11 12:02:36 UTC (rev 1514) @@ -0,0 +1,102 @@ +<!DOCTYPE ui:UiBinder SYSTEM 'http://dl.google.com/gwt/DTD/xhtml.ent'> +<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' + xmlns:g='urn:import:com.google.gwt.user.client.ui' xmlns:d='urn:import:com.google.gwt.user.datepicker.client' + ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat' + ui:generateLocales='default'> + + <ui:with field='res' type='cc.kune.core.client.resources.CoreResources'/> + + <ui:style> + .titles { + font-size: bold; + text-align: right; + padding-right: 10px; + vertical-align: top; + } + + .table { + display: table; + } + + .copyicon { + vertical-align: top; + height: 10px !important; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-left-radius: 5px; + } + + .row { + display: table-row; + margin: 5px 5px 15px 5px; + } + + .cell { + display: table-cell; + padding: 5px; + } + + .tip { + width: 180px; + padding: 5px; + font-size: 9px; + vertical-align: top; + } + + .toTranslate { + width: 180px; + height: 95px; + border: 1px dashed #BBBBBB; + } + + div.toTranslate { + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + padding: 3px; + } + + .toTranlateLabel { + height: 95px !important; + overflow-y: scroll; + } + </ui:style> + <g:FlowPanel addStyleNames="{style.table}"> + <g:FlowPanel addStyleNames="{style.row}"> + <g:Label ui:field="toTranslateTitle" addStyleNames="{style.titles} {style.cell}"/> + <g:FlowPanel addStyleNames="{style.cell}" styleName="{style.toTranslate}"> + <g:Label ui:field="toTranslate" styleName="{style.toTranlateLabel}"/> + </g:FlowPanel> + <g:Label addStyleNames="{style.row}"/> + </g:FlowPanel> + <g:FlowPanel addStyleNames="{style.row}"> + <g:Label ui:field="toLanguageTitle" addStyleNames="{style.titles} {style.cell}"/> + <g:TextArea ui:field='translation' addStyleNames="{style.cell}" + visibleLines="5"/> + <g:FlowPanel styleName="k-button" + addStyleNames="{style.cell} {style.copyicon} k-button k-btn k-5corners"> + <g:PushButton ui:field='copyIcon' enabled='true'> + <g:upFace image='{res.arrowUndo}'/> + <g:upHoveringFace/> + <g:downFace/> + <g:downHoveringFace/> + </g:PushButton> + </g:FlowPanel> + </g:FlowPanel> + <g:FlowPanel addStyleNames="{style.row}"> + <g:Label ui:field="noteForTranslatorsTittle" visible="false" + addStyleNames="{style.titles} {style.cell}"/> + <g:Label ui:field="noteForTranslators" addStyleNames="{style.cell}"/> + <g:Label addStyleNames="{style.row}"/> + </g:FlowPanel> + <g:FlowPanel addStyleNames="{style.row}"> + <g:Label ui:field="keyboardRecomendationTitle" + addStyleNames="{style.titles} {style.cell}"/> + <g:Label ui:field="keyboardRecomendation" addStyleNames="{style.cell} {style.tip}"/> + <g:Label addStyleNames="{style.row}"/> + </g:FlowPanel> + </g:FlowPanel> +</ui:UiBinder> Modified: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorPresenter.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorPresenter.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTranslatorPresenter.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -1,6 +1,5 @@ package cc.kune.gspace.client.i18n; -import cc.kune.common.client.notify.NotifyUser; import cc.kune.common.client.ui.dialogs.tabbed.AbstractTabbedDialog; import cc.kune.common.client.ui.dialogs.tabbed.AbstractTabbedDialogPresenter; import cc.kune.core.client.i18n.I18nUITranslationService; @@ -31,7 +30,6 @@ } - private final I18nUITranslationService i18n; private final Session session; @Inject @@ -39,7 +37,6 @@ final Session session, final I18nUITranslationService i18n, final I18nTranslatorView view) { super(eventBus, view, proxy); this.session = session; - this.i18n = i18n; } public void doClose() { @@ -64,14 +61,8 @@ @Override public void show() { - NotifyUser.showProgressLoading(); - if (session.isLogged()) { - final I18nLanguageDTO userLang = session.getCurrentLanguage(); - getView().setLanguage(new I18nLanguageSimpleDTO(userLang.getCode(), userLang.getEnglishName())); - getView().show(); - } else { - NotifyUser.info(i18n.t("Sign in or register to help with the translation")); - } - NotifyUser.hideProgress(); + final I18nLanguageDTO userLang = session.getCurrentLanguage(); + getView().setLanguage(new I18nLanguageSimpleDTO(userLang.getCode(), userLang.getEnglishName())); + getView().show(); } } Modified: trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTraslatorSaver.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTraslatorSaver.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/I18nTraslatorSaver.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -1,6 +1,7 @@ package cc.kune.gspace.client.i18n; import cc.kune.common.client.notify.NotifyUser; +import cc.kune.core.client.errors.AccessViolationException; import cc.kune.core.client.i18n.I18nUITranslationService; import cc.kune.core.client.rpcservices.I18nServiceAsync; import cc.kune.core.client.state.Session; @@ -32,7 +33,13 @@ @Override public void onFailure(final Throwable caught) { NotifyUser.hideProgress(); - NotifyUser.error(i18n.t("Server error saving the translation")); + if (caught instanceof AccessViolationException) { + NotifyUser.error( + i18n.t("Only to authorized translators"), + i18n.t("To help with the translation of this software please contact before with this site administrators")); + } else { + NotifyUser.error(i18n.t("Server error saving the translation")); + } } @Override Modified: trunk/src/main/java/cc/kune/gspace/client/i18n/SiteOptionsI18nTranslatorAction.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/i18n/SiteOptionsI18nTranslatorAction.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/gspace/client/i18n/SiteOptionsI18nTranslatorAction.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -19,12 +19,17 @@ */ package cc.kune.gspace.client.i18n; -import cc.kune.common.client.actions.AbstractExtendedAction; import cc.kune.common.client.actions.Action; import cc.kune.common.client.actions.ActionEvent; import cc.kune.common.client.actions.ui.descrip.MenuItemDescriptor; +import cc.kune.common.client.notify.NotifyUser; +import cc.kune.core.client.actions.RolActionAutoUpdated; import cc.kune.core.client.resources.CoreResources; import cc.kune.core.client.sitebar.SitebarActionsPresenter; +import cc.kune.core.client.state.AccessRightsClientManager; +import cc.kune.core.client.state.Session; +import cc.kune.core.client.state.StateManager; +import cc.kune.core.shared.dto.AccessRolDTO; import cc.kune.core.shared.i18n.I18nTranslationService; import com.google.inject.Inject; @@ -32,14 +37,18 @@ import com.google.inject.Singleton; @Singleton -public class SiteOptionsI18nTranslatorAction extends AbstractExtendedAction { +public class SiteOptionsI18nTranslatorAction extends RolActionAutoUpdated { + private final I18nTranslationService i18n; private I18nTranslator translator; private final Provider<I18nTranslator> translatorProv; @Inject - public SiteOptionsI18nTranslatorAction(final I18nTranslationService i18n, final CoreResources img, - final Provider<I18nTranslator> translatorProv, final SitebarActionsPresenter siteOptions) { - super(); + public SiteOptionsI18nTranslatorAction(final StateManager stateManager, final Session session, + final AccessRightsClientManager rightsManager, final I18nTranslationService i18n, + final CoreResources img, final Provider<I18nTranslator> translatorProv, + final SitebarActionsPresenter siteOptions) { + super(stateManager, session, rightsManager, AccessRolDTO.Viewer, true, true, true); + this.i18n = i18n; this.translatorProv = translatorProv; putValue(Action.NAME, i18n.t("Help with the translation")); putValue(Action.SMALL_ICON, img.language()); @@ -48,10 +57,15 @@ @Override public void actionPerformed(final ActionEvent event) { - if (translator == null) { - translator = translatorProv.get(); + NotifyUser.showProgressLoading(); + if (session.isLogged()) { + if (translator == null) { + translator = translatorProv.get(); + } + translator.show(); + } else { + NotifyUser.info(i18n.t("Sign in or register to help with the translation")); } - translator.show(); - // item.setPosition(1); + NotifyUser.hideProgress(); } } Modified: trunk/src/main/java/cc/kune/lists/client/actions/NewListAction.java =================================================================== --- trunk/src/main/java/cc/kune/lists/client/actions/NewListAction.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/lists/client/actions/NewListAction.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -67,21 +67,23 @@ diag.getFirstBtn().addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { - NotifyUser.showProgressProcessing(); - diag.hide(); - listsService.get().createList(session.getUserHash(), session.getCurrentStateToken(), - diag.getTextFieldValue(), ListsConstants.TYPE_LIST, true, - new AsyncCallbackSimple<StateContainerDTO>() { - @Override - public void onSuccess(final StateContainerDTO state) { - stateManager.setRetrievedStateAndGo(state); - NotifyUser.hideProgress(); + if (diag.isValid()) { + NotifyUser.showProgressProcessing(); + diag.hide(); + listsService.get().createList(session.getUserHash(), session.getCurrentStateToken(), + diag.getTextFieldValue(), ListsConstants.TYPE_LIST, true, + new AsyncCallbackSimple<StateContainerDTO>() { + @Override + public void onSuccess(final StateContainerDTO state) { + stateManager.setRetrievedStateAndGo(state); + NotifyUser.hideProgress(); - NotifyUser.info(i18n.t("List created")); - folderViewer.highlightTitle(); - } - }); - cache.removeContent(session.getCurrentStateToken()); + NotifyUser.info(i18n.t("List created")); + folderViewer.highlightTitle(); + } + }); + cache.removeContent(session.getCurrentStateToken()); + } } }); Modified: trunk/src/main/java/cc/kune/lists/client/actions/NewListPostAction.java =================================================================== --- trunk/src/main/java/cc/kune/lists/client/actions/NewListPostAction.java 2011-09-07 21:37:23 UTC (rev 1513) +++ trunk/src/main/java/cc/kune/lists/client/actions/NewListPostAction.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -73,20 +73,22 @@ diag.getFirstBtn().addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { - NotifyUser.showProgressProcessing(); - diag.hide(); - listsService.get().newPost(session.getUserHash(), - session.getCurrentStateToken().copy().clearDocument(), diag.getTextFieldValue(), - new AsyncCallbackSimple<StateContentDTO>() { - @Override - public void onSuccess(final StateContentDTO state) { - stateManager.setRetrievedStateAndGo(state); - NotifyUser.hideProgress(); - NotifyUser.info(i18n.t("Post created. Edit it")); - folderViewer.highlightTitle(); - } - }); - cache.removeContent(session.getCurrentStateToken()); + if (diag.isValid()) { + NotifyUser.showProgressProcessing(); + diag.hide(); + listsService.get().newPost(session.getUserHash(), + session.getCurrentStateToken().copy().clearDocument(), diag.getTextFieldValue(), + new AsyncCallbackSimple<StateContentDTO>() { + @Override + public void onSuccess(final StateContentDTO state) { + stateManager.setRetrievedStateAndGo(state); + NotifyUser.hideProgress(); + NotifyUser.info(i18n.t("Post created. Edit it")); + folderViewer.highlightTitle(); + } + }); + cache.removeContent(session.getCurrentStateToken()); + } } }); } else { Added: trunk/src/test/java/cc/kune/core/server/auth/SuperAdminMethodInterceptorTest.java =================================================================== --- trunk/src/test/java/cc/kune/core/server/auth/SuperAdminMethodInterceptorTest.java (rev 0) +++ trunk/src/test/java/cc/kune/core/server/auth/SuperAdminMethodInterceptorTest.java 2011-09-11 12:02:36 UTC (rev 1514) @@ -0,0 +1,54 @@ +package cc.kune.core.server.auth; + +import java.lang.reflect.AccessibleObject; + +import org.aopalliance.intercept.MethodInvocation; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import cc.kune.core.client.errors.AccessViolationException; +import cc.kune.core.server.integration.IntegrationTest; +import cc.kune.core.server.integration.IntegrationTestHelper; +import cc.kune.core.shared.domain.AccessRol; + +import com.google.inject.persist.Transactional; + +public class SuperAdminMethodInterceptorTest extends IntegrationTest { + + private MethodInvocation invocation; + private SuperAdmin superAdminAnnotation; + private SuperAdminMethodInterceptor superAdminInterceptor; + + @Transactional + @Before + public void before() { + superAdminInterceptor = new SuperAdminMethodInterceptor(); + new IntegrationTestHelper(this, superAdminInterceptor); + invocation = Mockito.mock(MethodInvocation.class); + final AccessibleObject accessibleObject = Mockito.mock(AccessibleObject.class); + Mockito.when(invocation.getMethod()).thenReturn(this.getClass().getMethods()[0]); + Mockito.when(invocation.getStaticPart()).thenReturn(accessibleObject); + superAdminAnnotation = Mockito.mock(SuperAdmin.class); + Mockito.when(accessibleObject.getAnnotation(SuperAdmin.class)).thenReturn(superAdminAnnotation); + } + + private void invoke() throws Throwable { + Mockito.when(superAdminAnnotation.rol()).thenReturn(AccessRol.Administrator); + final Object[] arguments = { getHash() }; + Mockito.when(invocation.getArguments()).thenReturn(arguments); + superAdminInterceptor.invoke(invocation); + } + + @Test(expected = AccessViolationException.class) + public void notMemberThrowsExcep() throws Throwable { + doLoginWithDummyUser(); + invoke(); + } + + @Test + public void superAdminDoTheJob() throws Throwable { + doLogin(); + invoke(); + } +}
participants (1)
-
Vicente J. Ruiz Jurado