Author: vjrj_ Date: 2011-12-12 22:47:20 +0100 (Mon, 12 Dec 2011) New Revision: 1638 Added: trunk/src/main/java/cc/kune/wave/client/KuneParticipantController.java Modified: trunk/.classpath trunk/pom.xml trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java trunk/src/main/java/cc/kune/core/client/sitebar/search/EntitySearchPanel.java trunk/src/main/java/cc/kune/core/client/sitebar/search/MultivalueSuggestBox.java trunk/src/main/java/cc/kune/core/client/sitebar/search/SearchBoxFactory.java trunk/src/main/java/cc/kune/core/client/sitebar/search/SitebarSearchPanel.java trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java trunk/src/main/java/cc/kune/wave/client/KuneStagesProvider.java trunk/src/main/java/cc/kune/wave/client/WebClient.java trunk/src/main/java/cc/kune/wave/server/WaveMain.java trunk/src/main/resources/wave-server.properties trunk/src/test/java/cc/kune/core/server/TestHelper.java trunk/src/test/java/cc/kune/core/server/integration/IntegrationTestHelper.java trunk/src/test/java/cc/kune/wave/server/KuneWaveServiceDefaultTest.java Log: Wave code updated (several bug fixed). Wave participants patched (now the creator cannot be deleted). Better Wave-Kune integration. Modified: trunk/.classpath =================================================================== --- trunk/.classpath 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/.classpath 2011-12-12 21:47:20 UTC (rev 1638) @@ -13,19 +13,19 @@ <classpathentry kind="var" path="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar" sourcepath="M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/avalon-framework/avalon-framework/4.1.3/avalon-framework-4.1.3.jar"/> <classpathentry kind="var" path="M2_REPO/backport-util-concurrent/backport-util-concurrent/3.1/backport-util-concurrent-3.1.jar" sourcepath="M2_REPO/backport-util-concurrent/backport-util-concurrent/3.1/backport-util-concurrent-3.1-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box/0.3.7/box-0.3.7.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box-src/0.3.7/box-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/box-src/0.3.7/box-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box/0.3.8/box-0.3.8.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/box-src/0.3.8/box-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/box-src/0.3.8/box-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/beanshell/bsh/2.0b4/bsh-2.0b4.jar"/> <classpathentry kind="var" path="M2_REPO/c3p0/c3p0/0.9.1/c3p0-0.9.1.jar" sourcepath="M2_REPO/c3p0/c3p0/0.9.1/c3p0-0.9.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3.jar" sourcepath="M2_REPO/cglib/cglib-nodep/2.1_3/cglib-nodep-2.1_3-sources.jar"/> <classpathentry kind="var" path="M2_REPO/classworlds/classworlds/1.1-alpha-2/classworlds-1.1-alpha-2.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client/0.3.7/client-0.3.7.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common/0.3.7/client-common-0.3.7.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common-src/0.3.7/client-common-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/client-common-src/0.3.7/client-common-src-0.3.7-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-scheduler-src/0.3.7/client-scheduler-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/client-scheduler-src/0.3.7/client-scheduler-src-0.3.7-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-src/0.3.7/client-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/client-src/0.3.7/client-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client/0.3.8/client-0.3.8.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common/0.3.8/client-common-0.3.8.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-common-src/0.3.8/client-common-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/client-common-src/0.3.8/client-common-src-0.3.8-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-scheduler-src/0.3.8/client-scheduler-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/client-scheduler-src/0.3.8/client-scheduler-src-0.3.8-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/client-src/0.3.8/client-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/client-src/0.3.8/client-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/cobogw/gwt/cobogw/1.3.1/cobogw-1.3.1.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/common-src/0.3.7/common-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/common-src/0.3.7/common-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/common-src/0.3.8/common-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/common-src/0.3.8/common-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0.jar" sourcepath="M2_REPO/commons-beanutils/commons-beanutils/1.7.0/commons-beanutils-1.7.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-cli/commons-cli/1.2/commons-cli-1.2.jar" sourcepath="M2_REPO/commons-cli/commons-cli/1.2/commons-cli-1.2-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4.jar" sourcepath="M2_REPO/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar"/> @@ -34,8 +34,8 @@ <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1.jar" sourcepath="M2_REPO/commons-io/commons-io/1.3.1/commons-io-1.3.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5.jar" sourcepath="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5-sources.jar"/> <classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1.jar" sourcepath="M2_REPO/commons-logging/commons-logging/1.1/commons-logging-1.1-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/communication-src/0.3.7/communication-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/communication-src/0.3.7/communication-src-0.3.7-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/concurrencycontrol-src/0.3.7/concurrencycontrol-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/concurrencycontrol-src/0.3.7/concurrencycontrol-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/communication-src/0.3.8/communication-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/communication-src/0.3.8/communication-src-0.3.8-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/concurrencycontrol-src/0.3.8/concurrencycontrol-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/concurrencycontrol-src/0.3.8/concurrencycontrol-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/net/sourceforge/cssparser/cssparser/0.9.5/cssparser-0.9.5.jar" sourcepath="M2_REPO/net/sourceforge/cssparser/cssparser/0.9.5/cssparser-0.9.5-sources.jar"/> <classpathentry kind="var" path="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar" sourcepath="M2_REPO/dom4j/dom4j/1.6.1/dom4j-1.6.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/net/sf/dozer/dozer/4.0/dozer-4.0.jar" sourcepath="M2_REPO/net/sf/dozer/dozer/4.0/dozer-4.0-sources.jar"/> @@ -57,7 +57,7 @@ <classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/log/gwt-log/gwt-log/3.0.1/gwt-log-3.0.1.jar"/> <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-servlet/2.1.1/gwt-servlet-2.1.1.jar" sourcepath="M2_REPO/com/google/gwt/gwt-servlet/2.1.1/gwt-servlet-2.1.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/com/google/gwt/gwt-user/2.1.1/gwt-user-2.1.1.jar" sourcepath="M2_REPO/com/google/gwt/gwt-user/2.1.1/gwt-user-2.1.1-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/gwt-util-src/0.3.7/gwt-util-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/gwt-util-src/0.3.7/gwt-util-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/gwt-util-src/0.3.8/gwt-util-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/gwt-util-src/0.3.8/gwt-util-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/com/allen_sauer/gwt/voices/gwt-voices/gwt-voices/2.0.0/gwt-voices-2.0.0.jar"/> <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-all/0.5/gwtp-all-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-all/0.5/gwtp-all-0.5-sources.jar"/> <classpathentry kind="var" path="M2_REPO/com/gwtplatform/gwtp-clients-common/0.5/gwtp-clients-common-0.5.jar" sourcepath="M2_REPO/com/gwtplatform/gwtp-clients-common/0.5/gwtp-clients-common-0.5-sources.jar"/> @@ -114,16 +114,16 @@ <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-profile/2.0/maven-profile-2.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-project/2.0/maven-project-2.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0.jar" sourcepath="M2_REPO/org/apache/maven/maven-repository-metadata/2.0/maven-repository-metadata-2.0-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/media-src/0.3.7/media-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/media-src/0.3.7/media-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/media-src/0.3.8/media-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/media-src/0.3.8/media-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/mockito/mockito-core/1.8.5/mockito-core-1.8.5.jar" sourcepath="M2_REPO/org/mockito/mockito-core/1.8.5/mockito-core-1.8.5-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/model-src/0.3.7/model-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/model-src/0.3.7/model-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/model-src/0.3.8/model-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/model-src/0.3.8/model-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16.jar" sourcepath="M2_REPO/org/mvel/mvel2/2.0.16/mvel2-2.0.16-sources.jar"/> <classpathentry kind="var" path="M2_REPO/mysql/mysql-connector-java/5.1.13/mysql-connector-java-5.1.13.jar"/> <classpathentry kind="var" path="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.15/nekohtml-1.9.15.jar" sourcepath="M2_REPO/net/sourceforge/nekohtml/nekohtml/1.9.15/nekohtml-1.9.15-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0.jar" sourcepath="M2_REPO/org/objenesis/objenesis/1.0/objenesis-1.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-container-default/1.0-alpha-8/plexus-container-default-1.0-alpha-8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4.jar" sourcepath="M2_REPO/org/codehaus/plexus/plexus-utils/1.0.4/plexus-utils-1.0.4-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/proto-msg/0.3.7/proto-msg-0.3.7.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/proto-msg/0.3.8/proto-msg-0.3.8.jar"/> <classpathentry kind="var" path="M2_REPO/org/w3c/css/sac/1.3/sac-1.3.jar" sourcepath="M2_REPO/org/w3c/css/sac/1.3/sac-1.3-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-android-driver/2.12.0/selenium-android-driver-2.12.0.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-android-driver/2.12.0/selenium-android-driver-2.12.0-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/seleniumhq/selenium/selenium-api/2.12.0/selenium-api-2.12.0.jar" sourcepath="M2_REPO/org/seleniumhq/selenium/selenium-api/2.12.0/selenium-api-2.12.0-sources.jar"/> @@ -147,9 +147,9 @@ <classpathentry kind="var" path="M2_REPO/stax/stax-api/1.0.1/stax-api-1.0.1.jar"/> <classpathentry kind="var" path="M2_REPO/org/testng/testng/6.2.1/testng-6.2.1.jar" sourcepath="M2_REPO/org/testng/testng/6.2.1/testng-6.2.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/tigase/tigase-xmltools/3.3.5/tigase-xmltools-3.3.5.jar" sourcepath="M2_REPO/tigase/tigase-xmltools/3.3.5/tigase-xmltools-3.3.5-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/util-src/0.3.7/util-src-0.3.7.jar" sourcepath="M2_REPO/org/waveprotocol/util-src/0.3.7/util-src-0.3.7-sources.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/util-src/0.3.8/util-src-0.3.8.jar" sourcepath="M2_REPO/org/waveprotocol/util-src/0.3.8/util-src-0.3.8-sources.jar"/> <classpathentry kind="var" path="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5.jar" sourcepath="M2_REPO/org/apache/maven/wagon/wagon-provider-api/1.0-alpha-5/wagon-provider-api-1.0-alpha-5-sources.jar"/> - <classpathentry kind="var" path="M2_REPO/org/waveprotocol/waveinabox-server-0.3/0.3.7/waveinabox-server-0.3-0.3.7.jar"/> + <classpathentry kind="var" path="M2_REPO/org/waveprotocol/waveinabox-server-0.3/0.3.8/waveinabox-server-0.3-0.3.8.jar"/> <classpathentry kind="var" path="M2_REPO/xalan/xalan/2.7.1/xalan-2.7.1.jar" sourcepath="M2_REPO/xalan/xalan/2.7.1/xalan-2.7.1-sources.jar"/> <classpathentry kind="var" path="M2_REPO/xerces/xercesImpl/2.9.1/xercesImpl-2.9.1.jar"/> <classpathentry kind="var" path="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2.jar" sourcepath="M2_REPO/xml-apis/xml-apis/1.0.b2/xml-apis-1.0.b2-sources.jar"/> Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/pom.xml 2011-12-12 21:47:20 UTC (rev 1638) @@ -19,7 +19,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <slf4j.version>1.6.1</slf4j.version> <openjpa.version>2.0.1</openjpa.version> - <wiab.version>0.3.7</wiab.version> + <wiab.version>0.3.8</wiab.version> <skipTests>true</skipTests> </properties> <repositories> Modified: trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/core/client/errors/ErrorHandler.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -84,7 +84,7 @@ final String msg = caught.getMessage(); eventBus.fireEvent(new UserNotifyEvent(NotifyLevel.error, i18n.t("You do not have rights to perform that action") - + (!TextUtils.empty(msg) && msg.length() > 1 ? ". " + i18n.t(msg) : ""))); + + (!TextUtils.empty(msg) && msg.length() > 2 ? ". " + i18n.t(msg) : ""))); goHome(); } else if (caught instanceof SessionExpiredException) { logException(caught); Modified: trunk/src/main/java/cc/kune/core/client/sitebar/search/EntitySearchPanel.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sitebar/search/EntitySearchPanel.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/core/client/sitebar/search/EntitySearchPanel.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -71,7 +71,7 @@ dialog.getTitleText().setText( i18n.t(searchOnlyUsers ? "Type the name of the user and select him/her:" : "Type the name of the user or group and select it:"), i18n.getDirection()); - final MultivalueSuggestBox multivalueSBox = SearchBoxFactory.create(i18n, searchOnlyUsers, id, + final MultivalueSuggestBox multivalueSBox = SearchBoxFactory.create(i18n, searchOnlyUsers, true, id, callback); suggestBox = multivalueSBox.getSuggestBox(); searchTextBox = suggestBox.getTextBox(); Modified: trunk/src/main/java/cc/kune/core/client/sitebar/search/MultivalueSuggestBox.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sitebar/search/MultivalueSuggestBox.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/core/client/sitebar/search/MultivalueSuggestBox.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -311,9 +311,11 @@ if (totSize < 1) { // if there were no suggestions, then it's an invalid value updateFormFeedback(FormFeedback.ERROR, "Invalid: " + m_query); - final OptionSuggestion sugg = new OptionSuggestion(i18n.t("No results"), "#", - m_request.getQuery(), m_query); - suggs.add(sugg); + if (showNoResult) { + final OptionSuggestion sugg = new OptionSuggestion(i18n.t("No results"), "#", + m_request.getQuery(), m_query); + suggs.add(sugg); + } } else if (false && totSize == 1) { // Patch to show always the suggestions // it's an exact match, so do not bother with showing suggestions, @@ -497,6 +499,8 @@ private final Map<String, String> mvalueMap; + private final boolean showNoResult; + // private final OnExactMatch onExactMatch; /** @@ -510,10 +514,14 @@ * @param isMultivalued * - true for allowing multiple values * @param onExactMatch + * @param showNoResult + * if we have to show noResult message when the search is empty or + * not */ - public MultivalueSuggestBox(final I18nUITranslationService i18n, final String restEndpointUrl, - final boolean isMultivalued, final OnExactMatch onExactMatch) { + public MultivalueSuggestBox(final I18nUITranslationService i18n, final boolean showNoResult, + final String restEndpointUrl, final boolean isMultivalued, final OnExactMatch onExactMatch) { this.i18n = i18n; + this.showNoResult = showNoResult; mrestEndpointUrl = restEndpointUrl; misMultivalued = isMultivalued; // this.onExactMatch = onExactMatch; Modified: trunk/src/main/java/cc/kune/core/client/sitebar/search/SearchBoxFactory.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sitebar/search/SearchBoxFactory.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/core/client/sitebar/search/SearchBoxFactory.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -31,9 +31,11 @@ public class SearchBoxFactory { public static MultivalueSuggestBox create(final I18nUITranslationService i18n, - final boolean searchOnlyUsers, final String id, final OnEntitySelectedInSearch callback) { + final boolean searchOnlyUsers, final boolean showNoResult, final String id, + final OnEntitySelectedInSearch callback) { final MultivalueSuggestBox multivalueSBox = new MultivalueSuggestBox( i18n, + showNoResult, searchOnlyUsers ? SearcherConstants.USER_DATA_PROXY_URL : SearcherConstants.GROUP_DATA_PROXY_URL, false, new OnExactMatch() { Modified: trunk/src/main/java/cc/kune/core/client/sitebar/search/SitebarSearchPanel.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/sitebar/search/SitebarSearchPanel.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/core/client/sitebar/search/SitebarSearchPanel.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -53,7 +53,7 @@ final StateManager stateManager, final I18nUITranslationService i18n) { searchButton = new PushButton(new Image(img.kuneSearchIco()), new Image(img.kuneSearchIcoPush())); searchButton.ensureDebugId(SITE_SEARCH_BUTTON); - final MultivalueSuggestBox multivalueSBox = SearchBoxFactory.create(i18n, false, + final MultivalueSuggestBox multivalueSBox = SearchBoxFactory.create(i18n, false, true, SITE_SEARCH_TEXTBOX, new OnEntitySelectedInSearch() { @Override public void onSeleted(final String shortName) { Modified: trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java =================================================================== --- trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/core/client/state/StateManagerDefault.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -21,8 +21,8 @@ package cc.kune.core.client.state; import org.waveprotocol.box.webclient.client.ClientEvents; -import org.waveprotocol.box.webclient.client.HistorySupport; import org.waveprotocol.box.webclient.client.events.WaveSelectionEvent; +import org.waveprotocol.wave.model.waveref.InvalidWaveRefException; import org.waveprotocol.wave.util.escapers.GwtWaverefEncoder; import cc.kune.common.client.actions.BeforeActionCollection; @@ -290,8 +290,12 @@ if (session.isLogged()) { SpaceConfEvent.fire(eventBus, Space.userSpace, newHistoryToken); SpaceSelectEvent.fire(eventBus, Space.userSpace); - ClientEvents.get().fireEvent( - new WaveSelectionEvent(HistorySupport.waveRefFromHistoryToken(newHistoryToken))); + try { + ClientEvents.get().fireEvent( + new WaveSelectionEvent(GwtWaverefEncoder.decodeWaveRefFromPath(newHistoryToken))); + } catch (final InvalidWaveRefException e) { + Log.error(nToken, e); + } } else { // Wave, but don't logged history.newItem(TokenUtils.addRedirect(SiteTokens.SIGNIN, newHistoryToken)); Modified: trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java =================================================================== --- trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/gspace/client/viewers/ContentViewerPanel.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -78,6 +78,7 @@ @UiField DeckPanel deck; private final GSpaceArmor gsArmor; + private final I18nTranslationService i18n; private IdGenerator idGenerator; private Element loading; @UiField @@ -85,6 +86,7 @@ private ProfileManager profiles; /** The wave panel, if a wave is open. */ private KuneStagesProvider wave; + private final WaveClientProvider waveClientProv; private ImplPanel waveHolder; @@ -103,6 +105,7 @@ this.gsArmor = wsArmor; this.waveClientProv = waveClient; this.capabilitiesRegistry = capabilitiesRegistry; + this.i18n = i18n; widget = uiBinder.createAndBindUi(this); contentTitle = new ContentTitleWidget(i18n, gsArmor, capabilitiesRegistry.getIconsRegistry()); eventBus.addHandler(WaveClientClearEvent.getType(), @@ -219,7 +222,7 @@ final Element holder = waveHolder.getElement().appendChild(Document.get().createDivElement()); final KuneStagesProvider wave = new KuneStagesProvider(holder, waveHolder, waveRef, channel, idGenerator, profiles, waveStore, isNewWave, - org.waveprotocol.box.webclient.client.Session.get().getDomain(), true); + org.waveprotocol.box.webclient.client.Session.get().getDomain(), true, i18n); this.wave = wave; wave.load(new Command() { @Override Added: trunk/src/main/java/cc/kune/wave/client/KuneParticipantController.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/KuneParticipantController.java (rev 0) +++ trunk/src/main/java/cc/kune/wave/client/KuneParticipantController.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -0,0 +1,156 @@ +/** + * 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.wave.client; + +import org.waveprotocol.wave.client.account.Profile; +import org.waveprotocol.wave.client.account.ProfileManager; +import org.waveprotocol.wave.client.common.safehtml.EscapeUtils; +import org.waveprotocol.wave.client.wavepanel.WavePanel; +import org.waveprotocol.wave.client.wavepanel.event.EventHandlerRegistry; +import org.waveprotocol.wave.client.wavepanel.event.WaveClickHandler; +import org.waveprotocol.wave.client.wavepanel.view.ParticipantView; +import org.waveprotocol.wave.client.wavepanel.view.ParticipantsView; +import org.waveprotocol.wave.client.wavepanel.view.View.Type; +import org.waveprotocol.wave.client.wavepanel.view.dom.DomAsViewProvider; +import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider; +import org.waveprotocol.wave.client.wavepanel.view.dom.full.TypeCodes; +import org.waveprotocol.wave.client.widget.profile.ProfilePopupPresenter; +import org.waveprotocol.wave.client.widget.profile.ProfilePopupView; +import org.waveprotocol.wave.model.conversation.Conversation; +import org.waveprotocol.wave.model.util.Pair; +import org.waveprotocol.wave.model.wave.InvalidParticipantAddress; +import org.waveprotocol.wave.model.wave.ParticipantId; + +import cc.kune.common.client.notify.NotifyUser; +import cc.kune.core.shared.i18n.I18nTranslationService; + +import com.google.gwt.dom.client.Element; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.Window; + +/** + * Installs the add/remove participant controls. + * + */ +public final class KuneParticipantController { + private static I18nTranslationService i18n; + + /** + * Builds and installs the participant control feature. + */ + public static void install(final WavePanel panel, final ModelAsViewProvider models, + final ProfileManager profiles, final String localDomain, final I18nTranslationService i18n) { + KuneParticipantController.i18n = i18n; + final KuneParticipantController controller = new KuneParticipantController(panel.getViewProvider(), + models, profiles, localDomain); + controller.install(panel.getHandlers()); + } + private final String localDomain; + private final ModelAsViewProvider models; + private final ProfileManager profiles; + + private final DomAsViewProvider views; + + /** + * @param localDomain + * nullable. if provided, automatic suffixing will occur. + */ + KuneParticipantController(final DomAsViewProvider views, final ModelAsViewProvider models, + final ProfileManager profiles, final String localDomain) { + this.views = views; + this.models = models; + this.profiles = profiles; + this.localDomain = localDomain; + } + + /** + * Shows an add-participant popup. + */ + private void handleAddButtonClicked(final Element context) { + + ParticipantId p; + String address = Window.prompt("Add a participant: ", ""); + if (address == null) { + return; + } + address = address.trim(); + if (localDomain != null) { + if (!address.isEmpty() && address.indexOf("@") == -1) { + // If no domain was specified, assume that the participant is from the + // local domain. + address = address + "@" + localDomain; + } else if (address.equals("@")) { + // "@" is a shortcut for the shared domain participant. + address = address + localDomain; + } + } + + try { + p = ParticipantId.of(address); + } catch (final InvalidParticipantAddress e) { + NotifyUser.error(i18n.t("Invalid address: [%s]", address)); + return; + } + + final ParticipantsView participantsUi = views.fromAddButton(context); + final Conversation conversation = models.getParticipants(participantsUi); + conversation.addParticipant(p); + } + + /** + * Shows a participation popup for the clicked participant. + */ + private void handleParticipantClicked(final Element context) { + final ParticipantView participantView = views.asParticipant(context); + final Pair<Conversation, ParticipantId> participation = models.getParticipant(participantView); + final Profile profile = profiles.getProfile(participation.second); + + // Summon a popup view from a participant, and attach profile-popup logic to + // it. + final ProfilePopupView profileView = participantView.showParticipation(); + final ProfilePopupPresenter profileUi = ProfilePopupPresenter.create(profile, profileView, profiles); + if (!participation.first.getParticipantIds().iterator().next().equals(participation.getSecond())) { + profileUi.addControl(EscapeUtils.fromSafeConstant("Remove"), new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + participation.first.removeParticipant(participation.second); + // The presenter is configured to destroy itself on view hide. + profileView.hide(); + } + }); + } + profileUi.show(); + } + + private void install(final EventHandlerRegistry handlers) { + handlers.registerClickHandler(TypeCodes.kind(Type.ADD_PARTICIPANT), new WaveClickHandler() { + @Override + public boolean onClick(final ClickEvent event, final Element context) { + handleAddButtonClicked(context); + return true; + } + }); + handlers.registerClickHandler(TypeCodes.kind(Type.PARTICIPANT), new WaveClickHandler() { + @Override + public boolean onClick(final ClickEvent event, final Element context) { + handleParticipantClicked(context); + return true; + } + }); + } +} Modified: trunk/src/main/java/cc/kune/wave/client/KuneStagesProvider.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/KuneStagesProvider.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/wave/client/KuneStagesProvider.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -32,14 +32,30 @@ import org.waveprotocol.wave.client.common.util.AsyncHolder; import org.waveprotocol.wave.client.common.util.AsyncHolder.Accessor; import org.waveprotocol.wave.client.common.util.LogicalPanel; +import org.waveprotocol.wave.client.editor.EditorStaticDeps; +import org.waveprotocol.wave.client.wavepanel.impl.WavePanelImpl; +import org.waveprotocol.wave.client.wavepanel.impl.edit.Actions; +import org.waveprotocol.wave.client.wavepanel.impl.edit.EditController; +import org.waveprotocol.wave.client.wavepanel.impl.edit.EditSession; +import org.waveprotocol.wave.client.wavepanel.impl.edit.KeepFocusInView; +import org.waveprotocol.wave.client.wavepanel.impl.focus.FocusFramePresenter; +import org.waveprotocol.wave.client.wavepanel.impl.indicator.ReplyIndicatorController; +import org.waveprotocol.wave.client.wavepanel.impl.menu.MenuController; +import org.waveprotocol.wave.client.wavepanel.impl.title.WaveTitleHandler; +import org.waveprotocol.wave.client.wavepanel.impl.toolbar.ToolbarSwitcher; import org.waveprotocol.wave.client.wavepanel.view.BlipView; import org.waveprotocol.wave.client.wavepanel.view.dom.ModelAsViewProvider; import org.waveprotocol.wave.client.wavepanel.view.dom.full.BlipQueueRenderer; import org.waveprotocol.wave.client.wavepanel.view.dom.full.DomRenderer; +import org.waveprotocol.wave.client.widget.popup.PopupChromeFactory; +import org.waveprotocol.wave.client.widget.popup.PopupFactory; import org.waveprotocol.wave.model.conversation.ConversationView; import org.waveprotocol.wave.model.id.IdGenerator; +import org.waveprotocol.wave.model.wave.ParticipantId; import org.waveprotocol.wave.model.waveref.WaveRef; +import cc.kune.core.shared.i18n.I18nTranslationService; + import com.google.gwt.dom.client.Element; /** @@ -51,28 +67,30 @@ private final static AsyncHolder<Object> HALT = new AsyncHolder<Object>() { @Override - public void call(Accessor<Object> accessor) { + public void call(final Accessor<Object> accessor) { // Never ready, so never notify the accessor. } }; - private final Element wavePanelElement; - private final LogicalPanel rootPanel; - private final WaveRef waveRef; private final RemoteViewServiceMultiplexer channel; + private boolean closed; + private final I18nTranslationService i18n; private final IdGenerator idGenerator; - private final ProfileManager profiles; - private final WaveStore waveStore; private final boolean isNewWave; private final String localDomain; + private StageOne one; + private final ProfileManager profiles; + private final LogicalPanel rootPanel; - private boolean closed; - private StageOne one; + private final boolean showParticipantsPanel; + private StageThree three; private StageTwo two; - private StageThree three; private WaveContext wave; - private boolean showParticipantsPanel; + private final Element wavePanelElement; + private final WaveRef waveRef; + private final WaveStore waveStore; + /** * @param wavePanelElement The dom element to become the wave panel * @param rootPanel A panel that this an ancestor of wavePanelElement. This is @@ -83,9 +101,9 @@ * @param isNewWave true if the wave is a new client-created wave * @param idGenerator */ - public KuneStagesProvider(Element wavePanelElement, LogicalPanel rootPanel, WaveRef waveRef, - RemoteViewServiceMultiplexer channel, IdGenerator idGenerator, ProfileManager profiles, - WaveStore store, boolean isNewWave, String localDomain, boolean showParticipantsPanel) { + public KuneStagesProvider(final Element wavePanelElement, final LogicalPanel rootPanel, final WaveRef waveRef, + final RemoteViewServiceMultiplexer channel, final IdGenerator idGenerator, final ProfileManager profiles, + final WaveStore store, final boolean isNewWave, final String localDomain, final boolean showParticipantsPanel, final I18nTranslationService i18n) { this.wavePanelElement = wavePanelElement; this.rootPanel = rootPanel; this.waveRef = waveRef; @@ -96,46 +114,21 @@ this.isNewWave = isNewWave; this.localDomain = localDomain; this.showParticipantsPanel = showParticipantsPanel; + this.i18n = i18n; } @Override - protected AsyncHolder<StageZero> createStageZeroLoader() { - return haltIfClosed(super.createStageZeroLoader()); - } - - @Override - protected AsyncHolder<StageOne> createStageOneLoader(StageZero zero) { + protected AsyncHolder<StageOne> createStageOneLoader(final StageZero zero) { return haltIfClosed(new StageOne.DefaultProvider(zero) { @Override - protected Element createWaveHolder() { - return wavePanelElement; - } - - @Override protected LogicalPanel createWaveContainer() { return rootPanel; } - }); - } - @Override - protected AsyncHolder<StageTwo> createStageTwoLoader(StageOne one) { - return haltIfClosed(new StageTwoProvider( - this.one = one, waveRef, channel, isNewWave, idGenerator, profiles) { - // Kune patch @Override - protected DomRenderer createRenderer() { - return KuneFullDomWaveRendererImpl.create(getConversations(), getProfileManager(), - getBlipDetailer(), getViewIdMapper(), getBlipQueue(), getThreadReadStateMonitor(), - createViewFactories(), showParticipantsPanel); + protected Element createWaveHolder() { + return wavePanelElement; } - - // Warning: this run into issue #73 - // @Override - // protected void installFeatures() { - // WavePanelResourceLoader.loadCss(); - // // KuneWavePanelResourceLoader.loadCss(); - // } }); } @@ -147,7 +140,7 @@ // Prepend an init wave flow onto the stage continuation. super.create(new Accessor<StageThree>() { @Override - public void use(StageThree x) { + public void use(final StageThree x) { onStageThreeLoaded(x, whenReady); } }); @@ -157,41 +150,57 @@ protected String getLocalDomain() { return localDomain; } + @Override + protected void install() { + EditorStaticDeps.setPopupProvider(PopupFactory.getProvider()); + EditorStaticDeps.setPopupChromeProvider(PopupChromeFactory.getProvider()); + + // Eagerly install some features. + final WavePanelImpl panel = stageTwo.getStageOne().getWavePanel(); + final FocusFramePresenter focus = stageTwo.getStageOne().getFocusFrame(); + final ParticipantId user = stageTwo.getSignedInUser(); + final ModelAsViewProvider models = stageTwo.getModelAsViewProvider(); + final ProfileManager profiles = stageTwo.getProfileManager(); + + final Actions actions = getEditActions(); + final EditSession edit = getEditSession(); + MenuController.install(actions, panel); + ToolbarSwitcher.install(stageTwo.getStageOne().getWavePanel(), getEditSession(), + getViewToolbar(), getEditToolbar()); + WaveTitleHandler.install(edit, models); + ReplyIndicatorController.install(actions, edit, panel); + EditController.install(focus, actions, panel); + KuneParticipantController.install(panel, models, profiles, getLocalDomain(), i18n); + KeepFocusInView.install(edit, panel); + stageTwo.getDiffController().upgrade(edit); + } }); } - private void onStageThreeLoaded(StageThree x, Accessor<StageThree> whenReady) { - if (closed) { - // Stop the loading process. - return; - } - three = x; - if (isNewWave) { - initNewWave(x); - } else { - handleExistingWave(x); - } - wave = new WaveContext( - two.getWave(), two.getConversations(), two.getSupplement(), two.getReadMonitor()); - waveStore.add(wave); - whenReady.use(x); - } + @Override + protected AsyncHolder<StageTwo> createStageTwoLoader(final StageOne one) { + return haltIfClosed(new StageTwoProvider( + this.one = one, waveRef, channel, isNewWave, idGenerator, profiles) { + // Kune patch + @Override + protected DomRenderer createRenderer() { + return KuneFullDomWaveRendererImpl.create(getConversations(), getProfileManager(), + getBlipDetailer(), getViewIdMapper(), getBlipQueue(), getThreadReadStateMonitor(), + createViewFactories(), showParticipantsPanel); + } - private void initNewWave(StageThree three) { - // Do the new-wave flow. - ModelAsViewProvider views = two.getModelAsViewProvider(); - BlipQueueRenderer blipQueue = two.getBlipQueue(); - ConversationView wave = two.getConversations(); - - // Force rendering to finish. - blipQueue.flush(); - BlipView blipUi = views.getBlipView(wave.getRoot().getRootThread().getFirstBlip()); - three.getEditActions().startEditing(blipUi); + // Warning: this run into issue #73 + // @Override + // protected void installFeatures() { + // WavePanelResourceLoader.loadCss(); + // // KuneWavePanelResourceLoader.loadCss(); + // } + }); } - private void handleExistingWave(StageThree three) { - BlipQueueRenderer blipQueue = two.getBlipQueue(); - blipQueue.flush(); + @Override + protected AsyncHolder<StageZero> createStageZeroLoader() { + return haltIfClosed(super.createStageZeroLoader()); } public void destroy() { @@ -219,7 +228,41 @@ * given provider. */ @SuppressWarnings("unchecked") // HALT is safe as a holder for any type - private <T> AsyncHolder<T> haltIfClosed(AsyncHolder<T> provider) { + private <T> AsyncHolder<T> haltIfClosed(final AsyncHolder<T> provider) { return closed ? (AsyncHolder<T>) HALT : provider; } + + private void handleExistingWave(final StageThree three) { + final BlipQueueRenderer blipQueue = two.getBlipQueue(); + blipQueue.flush(); + } + + private void initNewWave(final StageThree three) { + // Do the new-wave flow. + final ModelAsViewProvider views = two.getModelAsViewProvider(); + final BlipQueueRenderer blipQueue = two.getBlipQueue(); + final ConversationView wave = two.getConversations(); + + // Force rendering to finish. + blipQueue.flush(); + final BlipView blipUi = views.getBlipView(wave.getRoot().getRootThread().getFirstBlip()); + three.getEditActions().startEditing(blipUi); + } + + private void onStageThreeLoaded(final StageThree x, final Accessor<StageThree> whenReady) { + if (closed) { + // Stop the loading process. + return; + } + three = x; + if (isNewWave) { + initNewWave(x); + } else { + handleExistingWave(x); + } + wave = new WaveContext( + two.getWave(), two.getConversations(), two.getSupplement(), two.getReadMonitor()); + waveStore.add(wave); + whenReady.use(x); + } } Modified: trunk/src/main/java/cc/kune/wave/client/WebClient.java =================================================================== --- trunk/src/main/java/cc/kune/wave/client/WebClient.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/wave/client/WebClient.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -64,7 +64,9 @@ import org.waveprotocol.wave.model.id.IdGenerator; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.wave.ParticipantId; +import org.waveprotocol.wave.model.waveref.InvalidWaveRefException; import org.waveprotocol.wave.model.waveref.WaveRef; +import org.waveprotocol.wave.util.escapers.GwtWaverefEncoder; import cc.kune.common.client.notify.NotifyUser; import cc.kune.core.client.errors.DefaultException; @@ -72,6 +74,7 @@ import cc.kune.core.client.sitebar.spaces.SpaceConfEvent; import cc.kune.core.client.state.SiteTokens; import cc.kune.core.client.state.TokenMatcher; +import cc.kune.core.shared.i18n.I18nTranslationService; import cc.kune.wave.client.inboxcount.InboxCountPresenter; import com.google.gwt.core.client.GWT; @@ -225,13 +228,15 @@ private final EventBus eventBus; + private final I18nTranslationService i18n; + private IdGenerator idGenerator; private final InboxCountPresenter inboxCount; private final Element loading = new LoadingIndicator().getElement(); + private ParticipantId loggedInUser; - private ParticipantId loggedInUser; @UiField DebugMessagePanel logPanel; @@ -257,7 +262,6 @@ ImplPanel waveHolder; private final WaveStore waveStore = new SimpleWaveStore(); - /** * Create a remote websocket to talk to the server-side FedOne service. */ @@ -267,11 +271,12 @@ * This is the entry point method. */ @Inject - public WebClient(final EventBus eventBus, final KuneWaveProfileManager profiles, final InboxCountPresenter inboxCount, final TokenMatcher tokenMatcher, final cc.kune.core.client.state.Session session) { + public WebClient(final EventBus eventBus, final KuneWaveProfileManager profiles, final InboxCountPresenter inboxCount, final TokenMatcher tokenMatcher, final cc.kune.core.client.state.Session session, final I18nTranslationService i18n) { // Window.alert("webclient! " + new Date()); this.eventBus = eventBus; this.profiles = profiles; this.inboxCount = inboxCount; + this.i18n = i18n; searchPanel = new SearchPanelWidget(new SearchPanelRenderer(profiles)); ErrorHandler.install(); @@ -427,7 +432,7 @@ waveHolder.getElement().appendChild(loading); final Element holder = waveHolder.getElement().appendChild(Document.get().createDivElement()); final KuneStagesProvider wave = new KuneStagesProvider( - holder, waveHolder, waveRef, channel, idGenerator, profiles, waveStore, isNewWave, Session.get().getDomain(), true); + holder, waveHolder, waveRef, channel, idGenerator, profiles, waveStore, isNewWave, Session.get().getDomain(), true, i18n); this.wave = wave; wave.load(new Command() { @Override @@ -438,8 +443,10 @@ final String encodedToken = History.getToken(); // Kune patch if (encodedToken != null && !encodedToken.isEmpty() && !encodedToken.equals(SiteTokens.WAVEINBOX)) { - final WaveRef fromWaveRef = HistorySupport.waveRefFromHistoryToken(encodedToken); - if (waveRef == null) { + WaveRef fromWaveRef; + try { + fromWaveRef = GwtWaverefEncoder.decodeWaveRefFromPath(encodedToken); + } catch (final InvalidWaveRefException e) { LOG.info("History token contains invalid path: " + encodedToken); return; } @@ -450,7 +457,7 @@ return; } } - final String tokenFromWaveref = HistorySupport.historyTokenFromWaveref(waveRef); + final String tokenFromWaveref = GwtWaverefEncoder.encodeToUriPathSegment(waveRef); SpaceConfEvent.fire(eventBus, Space.userSpace, tokenFromWaveref); History.newItem(tokenFromWaveref, false); } Modified: trunk/src/main/java/cc/kune/wave/server/WaveMain.java =================================================================== --- trunk/src/main/java/cc/kune/wave/server/WaveMain.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/java/cc/kune/wave/server/WaveMain.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -140,6 +140,13 @@ boolean enableFederation = settingsInjector.getInstance(Key.get(Boolean.class, Names.named(CoreSettings.ENABLE_FEDERATION))); + int listenerCount = settingsInjector.getInstance(Key.get(Integer.class, + Names.named(CoreSettings.LISTENER_EXECUTOR_THREAD_COUNT))); + int waveletLoadCount = settingsInjector.getInstance(Key.get(Integer.class, + Names.named(CoreSettings.WAVELET_LOAD_EXECUTOR_THREAD_COUNT))); + int deltaPersistCount = settingsInjector.getInstance(Key.get(Integer.class, + Names.named(CoreSettings.DELTA_PERSIST_EXECUTOR_THREAD_COUNT))); + if (enableFederation) { Module federationSettings = SettingsBinder.bindSettings(PROPERTIES_FILE_KEY, FederationSettings.class); @@ -150,7 +157,8 @@ Module federationModule = buildFederationModule(settingsInjector, enableFederation); PersistenceModule persistenceModule = settingsInjector.getInstance(PersistenceModule.class); Injector injector = - settingsInjector.createChildInjector(new ServerModule(enableFederation), + settingsInjector.createChildInjector(new ServerModule(enableFederation, listenerCount, + waveletLoadCount, deltaPersistCount), new RobotApiModule(), federationModule, persistenceModule); ServerRpcProvider server = injector.getInstance(ServerRpcProvider.class); Modified: trunk/src/main/resources/wave-server.properties =================================================================== --- trunk/src/main/resources/wave-server.properties 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/main/resources/wave-server.properties 2011-12-12 21:47:20 UTC (rev 1638) @@ -71,11 +71,19 @@ admin_user = @local.net # The wave id of the welcome template wave. (Without domain, for example: w+Fxjs_-ZPmmA). -# If filled in then a copy of this wave (actually only the root blip) will be +# If filled in then a copy of this wave (actually only the root blip) will be # automatically added to the inbox of every new user. # Default value: "" (empty) -welcome_wave_id = +welcome_wave_id = +# Thread counts +#The number of threads to listen on wavelet updates. Default value: 1 +listener_executor_thread_count = 1 +#The number of threads for loading wavelets. Default value: 2 +wavelet_load_executor_thread_count = 2 +#The number of threads to persist deltas. Default value: 2 +delta_persist_executor_thread_count = 2 + # To enable federation, edit the server.federation.config file and include it here. #include = server.federation.config Modified: trunk/src/test/java/cc/kune/core/server/TestHelper.java =================================================================== --- trunk/src/test/java/cc/kune/core/server/TestHelper.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/test/java/cc/kune/core/server/TestHelper.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -59,16 +59,16 @@ final PersistenceModule wavePersistModule = injector.getInstance(PersistenceModule.class); final NoOpFederationModule federationModule = injector.getInstance(NoOpFederationModule.class); final Injector childInjector = injector.createChildInjector(wavePersistModule, new ServerModule( - false), new RobotApiModule(), federationModule, FinderRegistry.init(new JpaPersistModule( - persistenceUnit)), module, new Module() { - @Override - public void configure(final Binder binder) { - binder.bindScope(SessionScoped.class, Scopes.SINGLETON); - binder.bindScope(RequestScoped.class, Scopes.SINGLETON); - binder.bind(KuneProperties.class).toInstance(new KunePropertiesDefault(propetiesFileName)); - binder.bind(HttpServletRequest.class).to(HttpServletRequestMocked.class); - } - }); + false, 1, 2, 2), new RobotApiModule(), federationModule, + FinderRegistry.init(new JpaPersistModule(persistenceUnit)), module, new Module() { + @Override + public void configure(final Binder binder) { + binder.bindScope(SessionScoped.class, Scopes.SINGLETON); + binder.bindScope(RequestScoped.class, Scopes.SINGLETON); + binder.bind(KuneProperties.class).toInstance(new KunePropertiesDefault(propetiesFileName)); + binder.bind(HttpServletRequest.class).to(HttpServletRequestMocked.class); + } + }); try { childInjector.getInstance(WaveServerImpl.class).initialize(); } catch (final WaveServerException e) { Modified: trunk/src/test/java/cc/kune/core/server/integration/IntegrationTestHelper.java =================================================================== --- trunk/src/test/java/cc/kune/core/server/integration/IntegrationTestHelper.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/test/java/cc/kune/core/server/integration/IntegrationTestHelper.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -65,8 +65,8 @@ final Injector childInjector = injector.createChildInjector(wavePersistModule, FinderRegistry.init(new JpaPersistModule(TestConstants.PERSISTENCE_UNIT)), new ListsServerModule(), new RobotApiModule(), new PlatformServerModule(), - new DocumentServerModule(), new ChatServerModule(), new ServerModule(false), federationModule, - new WikiServerModule(), new TaskServerModule(), new BarterServerModule(), + new DocumentServerModule(), new ChatServerModule(), new ServerModule(false, 1, 2, 2), + federationModule, new WikiServerModule(), new TaskServerModule(), new BarterServerModule(), new EventsServerModule(), new AbstractModule() { @Override protected void configure() { Modified: trunk/src/test/java/cc/kune/wave/server/KuneWaveServiceDefaultTest.java =================================================================== --- trunk/src/test/java/cc/kune/wave/server/KuneWaveServiceDefaultTest.java 2011-12-07 12:18:53 UTC (rev 1637) +++ trunk/src/test/java/cc/kune/wave/server/KuneWaveServiceDefaultTest.java 2011-12-12 21:47:20 UTC (rev 1638) @@ -32,6 +32,7 @@ import java.util.TreeSet; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.waveprotocol.wave.model.waveref.WaveRef; @@ -57,6 +58,27 @@ ParticipantUtils participantUtils; @Test + @Ignore + public void addAndDelMainParticipant() throws IOException { + doLogin(); + final WaveRef waveletName = createTestWave(); + assertNotNull(waveletName); + manager.addParticipants(waveletName, getSiteAdminShortName(), NEW_PARTICIPANT); + + final Wavelet fetchWavelet = manager.fetchWave(waveletName, getSiteAdminShortName()); + assertNotNull(fetchWavelet); + assertEquals(2, fetchWavelet.getParticipants().size()); + assertTrue(manager.isParticipant(fetchWavelet, NEW_PARTICIPANT)); + assertTrue(manager.isParticipant(fetchWavelet, getSiteAdminShortName())); + // Del all + manager.delParticipants(waveletName, getSiteAdminShortName(), getSiteAdminShortName()); + // This fails because we don't have a way to access to than wave now ... + // @domain don't work neither + final Wavelet fetchedAfterDeleted = manager.fetchWave(waveletName, ""); + assertNotNull(fetchedAfterDeleted); + } + + @Test public void addAndDelParticipantTwice() throws IOException { doLogin(); final WaveRef waveletName = createTestWave(); @@ -72,7 +94,7 @@ assertEquals(2, fetchWavelet.getParticipants().size()); assertTrue(manager.isParticipant(fetchWavelet, NEW_PARTICIPANT)); assertTrue(manager.isParticipant(fetchWavelet, getSiteAdminShortName())); - // Del all + // Del main editor manager.delParticipants(waveletName, getSiteAdminShortName(), NEW_PARTICIPANT, NEW_PARTICIPANT, getSiteAdminShortName(), getSiteAdminShortName()); }