You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by do...@apache.org on 2013/09/12 06:18:32 UTC

svn commit: r1522328 - in /james/hupa/trunk/client/src/main/java/org/apache/hupa/client: activity/ ioc/ mapper/ ui/

Author: dongxu
Date: Thu Sep 12 04:18:31 2013
New Revision: 1522328

URL: http://svn.apache.org/r1522328
Log:
try to fix some issues by reorganize the activity mapper and place controller

Added:
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/AbstractActivityMapper.java
Modified:
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/activity/TopBarActivity.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ioc/AppGinModule.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/LogoActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/MessageListFooterActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/NavigationActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/StatusActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/ToolBarActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopBarActivityMapper.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/FoldersTreeViewModel.java
    james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/HupaLayout.java

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/activity/TopBarActivity.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/activity/TopBarActivity.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/activity/TopBarActivity.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/activity/TopBarActivity.java Thu Sep 12 04:18:31 2013
@@ -168,9 +168,14 @@ public class TopBarActivity extends AppB
 
 	@Override
 	public void start(AcceptsOneWidget container, EventBus eventBus) {
+		eventBus.addHandler(LoginEvent.TYPE, new LoginEventHandler() {
+			public void onLogin(LoginEvent event) {
+				user = event.getUser();
+			}
+		});
 		container.setWidget(display.asWidget());
 		bindTo(eventBus);
-		if (user != null && isOccupied()) {
+		if (user != null && !isOccupied()) {
 			display.getUserLabel().add(new HTML(user.getName()));
 		}
 	}
@@ -183,11 +188,6 @@ public class TopBarActivity extends AppB
 =======
 	private void bindTo(EventBus eventBus) {
 
-		eventBus.addHandler(LoginEvent.TYPE, new LoginEventHandler() {
-			public void onLogin(LoginEvent event) {
-				user = event.getUser();
-			}
-		});
 		registerHandler(display.getLogoutClick().addClickHandler(new ClickHandler() {
 			public void onClick(ClickEvent event) {
 				doLogout();

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ioc/AppGinModule.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ioc/AppGinModule.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ioc/AppGinModule.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ioc/AppGinModule.java Thu Sep 12 04:18:31 2013
@@ -524,8 +524,12 @@ public class AppGinModule extends Abstra
 		bind(ComposeToolBarActivity.class).in(Singleton.class);
 		bind(ComposeActivity.class).in(Singleton.class);
 
+<<<<<<< HEAD
 >>>>>>> integrate all of the views to their corresponding activities and mappers
 		bind(TopActivity.Displayable.class).to(TopView.class);
+=======
+		bind(TopActivity.Displayable.class).to(TopView.class).in(Singleton.class);
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 		bind(WestActivity.Displayable.class).to(WestView.class).in(Singleton.class);
 		bind(IMAPMessageListActivity.Displayable.class).to(IMAPMessageListView.class);
 		bind(MessageSendActivity.Displayable.class).to(MessageSendView.class);

Added: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/AbstractActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/AbstractActivityMapper.java?rev=1522328&view=auto
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/AbstractActivityMapper.java (added)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/AbstractActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -0,0 +1,19 @@
+package org.apache.hupa.client.mapper;
+
+import org.apache.hupa.client.place.DefaultPlace;
+
+import com.google.gwt.activity.shared.Activity;
+import com.google.gwt.activity.shared.ActivityMapper;
+import com.google.gwt.place.shared.Place;
+
+abstract class AbstractActivityMapper implements ActivityMapper{
+
+	@Override
+	public Activity getActivity(Place place) {
+		if(place instanceof DefaultPlace)return null;
+		return getAppActivity(place);
+	}
+	
+	abstract Activity getAppActivity(Place place);
+
+}

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/LogoActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/LogoActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/LogoActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/LogoActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -23,6 +23,7 @@ import org.apache.hupa.client.activity.L
 
 import com.google.gwt.activity.shared.Activity;
 <<<<<<< HEAD
+<<<<<<< HEAD
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.RunAsyncCallback;
 =======
@@ -30,6 +31,8 @@ import com.google.gwt.activity.shared.Ac
 <<<<<<< HEAD
 >>>>>>> integrate all of the views to their corresponding activities and mappers
 =======
+=======
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.RunAsyncCallback;
 >>>>>>> support code split
@@ -38,10 +41,14 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 
 <<<<<<< HEAD
+<<<<<<< HEAD
 public class LogoActivityMapper extends _HupaActivityMapper {
 =======
 public class LogoActivityMapper implements ActivityMapper {
 >>>>>>> integrate all of the views to their corresponding activities and mappers
+=======
+public class LogoActivityMapper extends AbstractActivityMapper {
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 	private final Provider<LogoActivity> logoActivityProvider;
 
 	@Inject
@@ -50,6 +57,7 @@ public class LogoActivityMapper implemen
 	}
 
 <<<<<<< HEAD
+<<<<<<< HEAD
 	@Override
 	public Activity asyncLoadActivity(Place place) {
 		return new ActivityAsyncProxy() {
@@ -69,6 +77,10 @@ public class LogoActivityMapper implemen
 		return logoActivityProvider.get();
 >>>>>>> integrate all of the views to their corresponding activities and mappers
 =======
+=======
+	@Override
+	public Activity getAppActivity(Place place) {
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 		return new ActivityAsyncProxy() {
 			@Override
 			protected void doAsync(RunAsyncCallback callback) {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/MessageListFooterActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/MessageListFooterActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/MessageListFooterActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/MessageListFooterActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -20,6 +20,7 @@
 package org.apache.hupa.client.mapper;
 
 import org.apache.hupa.client.activity.MessageListFooterActivity;
+import org.apache.hupa.client.place.DefaultPlace;
 
 import com.google.gwt.activity.shared.Activity;
 <<<<<<< HEAD
@@ -65,6 +66,7 @@ public class MessageListFooterActivityMa
 	};}
 =======
 	public Activity getActivity(Place place) {
+		if(place instanceof DefaultPlace) return null;
 		return new ActivityAsyncProxy() {
 			@Override
 			protected void doAsync(RunAsyncCallback callback) {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/NavigationActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/NavigationActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/NavigationActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/NavigationActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -21,6 +21,9 @@ package org.apache.hupa.client.mapper;
 
 import org.apache.hupa.client.activity.NavigationActivity;
 <<<<<<< HEAD
+<<<<<<< HEAD
+=======
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 import org.apache.hupa.client.place.DefaultPlace;
 
 import com.google.gwt.activity.shared.Activity;
@@ -64,9 +67,13 @@ public class NavigationActivityMapper im
 	public Activity getActivity(Place place) {
 <<<<<<< HEAD
 <<<<<<< HEAD
+<<<<<<< HEAD
 		if(place instanceof DefaultPlace) return null;
 =======
 >>>>>>> support code split
+=======
+		if(place instanceof DefaultPlace) return null;
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 		return new ActivityAsyncProxy() {
 			@Override
 			protected void doAsync(RunAsyncCallback callback) {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/StatusActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/StatusActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/StatusActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/StatusActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -21,6 +21,9 @@ package org.apache.hupa.client.mapper;
 
 import org.apache.hupa.client.activity.StatusActivity;
 <<<<<<< HEAD
+<<<<<<< HEAD
+=======
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 import org.apache.hupa.client.place.DefaultPlace;
 
 import com.google.gwt.activity.shared.Activity;
@@ -50,9 +53,13 @@ public class StatusActivityMapper implem
 	public Activity getActivity(Place place) {
 <<<<<<< HEAD
 <<<<<<< HEAD
+<<<<<<< HEAD
 		if(place instanceof DefaultPlace) return null;
 =======
 >>>>>>> support code split
+=======
+		if(place instanceof DefaultPlace) return null;
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 		return new ActivityAsyncProxy() {
 			@Override
 			protected void doAsync(RunAsyncCallback callback) {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/ToolBarActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/ToolBarActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/ToolBarActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/ToolBarActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -21,6 +21,7 @@ package org.apache.hupa.client.mapper;
 
 import org.apache.hupa.client.activity.ToolBarActivity;
 <<<<<<< HEAD
+<<<<<<< HEAD
 import org.apache.hupa.client.place.FolderPlace;
 import org.apache.hupa.client.place.MessagePlace;
 import org.apache.hupa.client.place.SettingPlace;
@@ -30,6 +31,9 @@ import com.google.gwt.activity.shared.Ac
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.RunAsyncCallback;
 =======
+=======
+import org.apache.hupa.client.place.DefaultPlace;
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 
 import com.google.gwt.activity.shared.Activity;
 import com.google.gwt.activity.shared.ActivityMapper;
@@ -92,9 +96,13 @@ public class ToolBarActivityMapper imple
 
 	public Activity getActivity(Place place) {
 <<<<<<< HEAD
+<<<<<<< HEAD
 		return toolBarActivityProvider.get();
 >>>>>>> integrate all of the views to their corresponding activities and mappers
 =======
+=======
+		if(place instanceof DefaultPlace) return null;
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 		return new ActivityAsyncProxy() {
 			@Override
 			protected void doAsync(RunAsyncCallback callback) {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -20,6 +20,7 @@
 package org.apache.hupa.client.mapper;
 
 import org.apache.hupa.client.activity.TopActivity;
+import org.apache.hupa.client.place.DefaultPlace;
 
 import com.google.gwt.activity.shared.Activity;
 import com.google.gwt.activity.shared.ActivityMapper;
@@ -36,6 +37,7 @@ public class TopActivityMapper implement
 	}
 
 	public Activity getActivity(Place place) {
+		if(place instanceof DefaultPlace) return null;
 		return topActivityProvider.get();
 	}
 }

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopBarActivityMapper.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopBarActivityMapper.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopBarActivityMapper.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/mapper/TopBarActivityMapper.java Thu Sep 12 04:18:31 2013
@@ -23,6 +23,7 @@ import org.apache.hupa.client.activity.T
 
 import com.google.gwt.activity.shared.Activity;
 <<<<<<< HEAD
+<<<<<<< HEAD
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.RunAsyncCallback;
 =======
@@ -30,6 +31,8 @@ import com.google.gwt.activity.shared.Ac
 <<<<<<< HEAD
 >>>>>>> integrate all of the views to their corresponding activities and mappers
 =======
+=======
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.RunAsyncCallback;
 >>>>>>> support code split
@@ -38,10 +41,14 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 
 <<<<<<< HEAD
+<<<<<<< HEAD
 public class TopBarActivityMapper extends _HupaActivityMapper {
 =======
 public class TopBarActivityMapper implements ActivityMapper {
 >>>>>>> integrate all of the views to their corresponding activities and mappers
+=======
+public class TopBarActivityMapper extends AbstractActivityMapper {
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 	private final Provider<TopBarActivity> topBarActivityProvider;
 
 	@Inject
@@ -50,6 +57,7 @@ public class TopBarActivityMapper implem
 	}
 
 <<<<<<< HEAD
+<<<<<<< HEAD
 	@Override
 	Activity asyncLoadActivity(final Place place) {
 		return new ActivityAsyncProxy() {
@@ -69,6 +77,10 @@ public class TopBarActivityMapper implem
 		return topBarActivityProvider.get();
 >>>>>>> integrate all of the views to their corresponding activities and mappers
 =======
+=======
+	@Override
+	Activity getAppActivity(Place place) {
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 		return new ActivityAsyncProxy() {
 			@Override
 			protected void doAsync(RunAsyncCallback callback) {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/FoldersTreeViewModel.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/FoldersTreeViewModel.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/FoldersTreeViewModel.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/FoldersTreeViewModel.java Thu Sep 12 04:18:31 2013
@@ -28,6 +28,7 @@ import org.apache.hupa.shared.domain.Use
 import org.apache.hupa.shared.events.LoadMessagesEvent;
 import org.apache.hupa.shared.events.LoginEvent;
 import org.apache.hupa.shared.events.LoginEventHandler;
+import org.apache.hupa.widgets.ui.HasEditable;
 
 import com.google.gwt.cell.client.AbstractCell;
 import com.google.gwt.cell.client.ValueUpdater;
@@ -90,30 +91,55 @@ public class FoldersTreeViewModel implem
 	 */
 	@Override
 	public <T> NodeInfo<?> getNodeInfo(T value) {
-		return new DefaultNodeInfo<ImapFolder>(new ImapFolderListDataProvider((ImapFolder) value),
-				new AbstractCell<ImapFolder>(ClickEvent.getType().getName()) {
-					// TODO different images for each folder
-					@Override
-					public void render(Context context, ImapFolder value, SafeHtmlBuilder sb) {
-						if (value != null) {
-							sb.appendEscaped(value.getName());
-						}
-					}
+		return new DefaultNodeInfo<ImapFolder>(new ImapFolderListDataProvider((ImapFolder) value), new FolderCell(
+				ClickEvent.getType().getName()), selectionModel, null);
+	}
 
-					// TODO is this a click event?
-					@Override
-					public void onBrowserEvent(Context context, Element parent, ImapFolder value, NativeEvent event,
-							ValueUpdater<ImapFolder> valueUpdater) {
-						if (clickSameFolder(value)) {
-							eventBus.fireEvent(new LoadMessagesEvent(user, value));
-							placeController.goTo(new MailFolderPlace(value.getFullName()));
-						}
-					}
+	class FolderCell extends AbstractCell<ImapFolder> implements HasEditable{
+		public FolderCell(String... consumedEvents) {
+			super(consumedEvents);
+		}
+		// TODO different images for each folder
+		@Override
+		public void render(Context context, ImapFolder value, SafeHtmlBuilder sb) {
+			if (value != null) {
+				sb.appendEscaped(value.getName());
+			}
+		}
 
-					private boolean clickSameFolder(ImapFolder value) {
-						return value == currentFolder;
-					}
-				}, selectionModel, null);
+		// TODO is this a click event?
+		@Override
+		public void onBrowserEvent(Context context, Element parent, ImapFolder value, NativeEvent event,
+				ValueUpdater<ImapFolder> valueUpdater) {
+			if (clickSameFolder(value)) {
+				eventBus.fireEvent(new LoadMessagesEvent(user, value));
+				placeController.goTo(new MailFolderPlace(value.getFullName()));
+			}
+		}
+
+		private boolean clickSameFolder(ImapFolder value) {
+			return value == currentFolder;
+		}
+		@Override
+		public void startEdit() {
+			// TODO Auto-generated method stub
+			
+		}
+		@Override
+		public void cancelEdit() {
+			// TODO Auto-generated method stub
+			
+		}
+		@Override
+		public void stopEdit() {
+			// TODO Auto-generated method stub
+			
+		}
+		@Override
+		public boolean isEdit() {
+			// TODO Auto-generated method stub
+			return false;
+		}
 	}
 
 	class ImapFolderListDataProvider extends AsyncDataProvider<ImapFolder> {

Modified: james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/HupaLayout.java
URL: http://svn.apache.org/viewvc/james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/HupaLayout.java?rev=1522328&r1=1522327&r2=1522328&view=diff
==============================================================================
--- james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/HupaLayout.java (original)
+++ james/hupa/trunk/client/src/main/java/org/apache/hupa/client/ui/HupaLayout.java Thu Sep 12 04:18:31 2013
@@ -21,7 +21,11 @@ package org.apache.hupa.client.ui;
 
 <<<<<<< HEAD
 <<<<<<< HEAD
+<<<<<<< HEAD
 import org.apache.hupa.client.place.SettingPlace;
+=======
+import org.apache.hupa.client.evo.ActivityManagerInitializer;
+>>>>>>> try to fix some issues by reorganize the activity mapper and place controller
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Style.Unit;
@@ -245,6 +249,7 @@ import com.google.gwt.user.client.ui.Lay
 >>>>>>> deal with onResizeEvent of folder list panel, but found issue #25
 import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.Widget;
+import com.google.inject.Inject;
 
 public class HupaLayout implements HupaLayoutable {
 
@@ -259,6 +264,7 @@ public class HupaLayout implements HupaL
 
 	private LayoutPanel hupaMainPanel;
 
+//	@Inject
 	public HupaLayout() {
 		hupaMainPanel = binder.createAndBindUi(this);
 	}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org