Author: tmjee
Date: Sat Jun 17 01:33:02 2006
New Revision: 415011

URL: http://svn.apache.org/viewvc?rev=415011&view=rev
Log:
WW-1351
  - added a simple chat webapp into showcase demonstrating SAF2's AJAX
    features


Added:
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatAuthenticationInterceptor.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatException.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatInterceptor.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLoginAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLogoutAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatMessage.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatService.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatServiceImpl.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Constants.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/CrudRoomAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/DateConverter.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/EnterRoomAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ExitRoomAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/MessagesAvailableInRoomAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Room.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/RoomsAvailableAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/SendMessageToRoomAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/User.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableAction.java
   (with props)
    
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableInRoomAction.java
   (with props)

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatAuthenticationInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatAuthenticationInterceptor.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatAuthenticationInterceptor.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatAuthenticationInterceptor.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,40 @@
+package org.apache.struts.action2.showcase.chat;
+
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action2.dispatcher.SessionMap;
+
+import com.opensymphony.xwork.Action;
+import com.opensymphony.xwork.ActionContext;
+import com.opensymphony.xwork.ActionInvocation;
+import com.opensymphony.xwork.interceptor.Interceptor;
+
+public class ChatAuthenticationInterceptor implements Interceptor {
+
+       private static final long serialVersionUID = 1L;
+       
+       private static final Log _log = 
LogFactory.getLog(ChatAuthenticationInterceptor.class);
+       
+       public static final String USER_SESSION_KEY = "chatUserSessionKey";
+
+       public void destroy() {
+       }
+
+       public void init() {
+       }
+
+       public String intercept(ActionInvocation invocation) throws Exception {
+               
+               _log.debug("Authenticating chat user");
+               
+               SessionMap session = (SessionMap) 
ActionContext.getContext().get(ActionContext.SESSION);
+               User user = (User) session.get(USER_SESSION_KEY);
+               
+               if (user == null) {
+                       return Action.LOGIN;
+               }
+               return invocation.invoke();
+       }
+
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatAuthenticationInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatException.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatException.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatException.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatException.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,16 @@
+package org.apache.struts.action2.showcase.chat;
+
+public class ChatException extends RuntimeException {
+       
+       private static final long serialVersionUID = 1L;
+
+       public enum ErrorType {
+               ROOM_ALREADY_EXISTS, 
+               USER_ALREADY_EXISTS,
+               NO_SUCH_ROOM_EXISTS
+       }
+       
+       public ChatException(String description, ErrorType type) {
+               super(description);
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatInterceptor.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatInterceptor.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatInterceptor.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,58 @@
+/*
+ * $Id: DateAction.java 394498 2006-04-16 15:28:06Z tmjee $
+ *
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * 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 org.apache.struts.action2.showcase.chat;
+
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import com.opensymphony.xwork.Action;
+import com.opensymphony.xwork.ActionContext;
+import com.opensymphony.xwork.ActionInvocation;
+import com.opensymphony.xwork.interceptor.Interceptor;
+
+/**
+ * Authenticate showcase chat example, make sure everyone have a username.
+ */
+public class ChatInterceptor implements Interceptor {
+       
+       private static final Log _log = 
LogFactory.getLog(ChatInterceptor.class);
+
+       private static final long serialVersionUID = 1L;
+       
+       public static final String CHAT_USER_SESSION_KEY = "ChatUserSessionKey";
+
+       public void destroy() {
+       }
+
+       public void init() {
+       }
+
+       public String intercept(ActionInvocation invocation) throws Exception {
+               HttpSession session = (HttpSession) 
ActionContext.getContext().get(ActionContext.SESSION);
+               User chatUser = (User) 
session.getAttribute(CHAT_USER_SESSION_KEY);
+               if (chatUser == null) {
+                       _log.debug("Chat user not logged in");
+                       return Action.LOGIN;
+               }
+               return invocation.invoke();
+       }
+}
+
+

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLoginAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLoginAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLoginAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLoginAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,48 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.Map;
+
+import org.apache.struts.action2.interceptor.SessionAware;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class ChatLoginAction extends ActionSupport implements SessionAware {
+
+       private static final long serialVersionUID = 1L;
+       
+       private ChatService chatService;
+       private Map session;
+       
+       private String name;
+       
+       public ChatLoginAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String getName() {
+               return this.name;
+       }
+       public void setName(String name) {
+               this.name = name;
+       }
+       
+       
+       public String execute() throws Exception {
+               try {
+                       chatService.login(new User(name));
+                       
session.put(ChatAuthenticationInterceptor.USER_SESSION_KEY, new User(name));
+               }
+               catch(ChatException e) {
+                       e.printStackTrace();
+                       addActionError(e.getMessage());
+                       return INPUT;
+               }
+               return SUCCESS;
+       }
+
+       
+       // === SessionAware ===
+       public void setSession(Map session) {
+               this.session = session;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLoginAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLogoutAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLogoutAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLogoutAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLogoutAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,38 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.Map;
+
+import org.apache.struts.action2.interceptor.SessionAware;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class ChatLogoutAction extends ActionSupport implements SessionAware {
+
+       private static final long serialVersionUID = 1L;
+
+       private ChatService chatService;
+       
+       private Map session;
+       
+       
+       public ChatLogoutAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String execute() throws Exception {
+               
+               User user = (User) 
session.get(ChatAuthenticationInterceptor.USER_SESSION_KEY);
+               if (user != null) {
+                       chatService.logout(user.getName());
+                       
session.remove(ChatAuthenticationInterceptor.USER_SESSION_KEY);
+               }
+               
+               return SUCCESS;
+       }
+
+       
+       // === SessionAware ===
+       public void setSession(Map session) {   
+               this.session = session;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatLogoutAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatMessage.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatMessage.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatMessage.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatMessage.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,29 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.Date;
+
+public class ChatMessage {
+       
+       private Date creationDate;
+       private String message;
+       private User creator;
+       
+       public ChatMessage(String message, User creator) {
+               assert(message != null);
+               assert(creator != null);
+               
+               this.creationDate = new Date(System.currentTimeMillis());
+               this.message = message;
+               this.creator = creator;
+       }
+       
+       public Date getCreationDate() {
+               return creationDate;
+       }
+       public User getCreator() {
+               return creator;
+       }
+       public String getMessage() {
+               return message;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatMessage.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatService.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatService.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatService.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatService.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,17 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.List;
+
+public interface ChatService {
+       List<User> getAvailableUsers();
+       void login(User user);
+       void logout(String name);
+       
+       List<Room> getAvailableRooms();
+       void addRoom(Room room);
+       void enterRoom(User user, String roomName);
+       void exitRoom(String userName, String roomName);
+       List<ChatMessage> getMessagesInRoom(String roomName);
+       void sendMessageToRoom(String roomName, User user, String message);
+       List<User> getUsersAvailableInRoom(String roomName);
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatServiceImpl.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatServiceImpl.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatServiceImpl.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatServiceImpl.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,95 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ChatServiceImpl implements ChatService {
+       
+       private Map<String, User> availableUsers = new LinkedHashMap<String, 
User>();
+       private Map<String, Room> availableRooms = new LinkedHashMap<String, 
Room>();
+       
+       
+       public List<User> getAvailableUsers() {
+               return new ArrayList<User>(availableUsers.values());
+       }
+
+       public List<Room> getAvailableRooms() {
+               return new ArrayList<Room>(availableRooms.values());
+       }
+
+       public void addRoom(Room room) {
+               if (availableRooms.containsKey(room.getName())) {
+                       throw new ChatException("room ["+room.getName()+"] is 
already available", ChatException.ErrorType.valueOf("ROOM_ALREADY_EXISTS"));
+               }
+               availableRooms.put(room.getName(), room);
+       }
+       
+       public void login(User user) {
+               assert(user != null);
+               if (availableUsers.containsKey(user.getName())) {
+                       throw new ChatException("User ["+user.getName()+"] 
already exists", ChatException.ErrorType.valueOf("USER_ALREADY_EXISTS"));
+               }
+               availableUsers.put(user.getName(), user);
+       }
+
+       public void logout(String name) {
+               assert(name != null);
+               assert(name.trim().length() > 0);
+               availableUsers.remove(name);
+               for (Room room : availableRooms.values()) {
+                       if (room.hasMember(name)) {
+                               room.memberExit(name);
+                       }
+               }
+       }
+
+       public void exitRoom(String userName, String roomName) {
+               assert(roomName != null);
+               assert(roomName.trim().length()> 0);
+               
+               if (availableRooms.containsKey(roomName)) {
+                       Room room = availableRooms.get(roomName);
+                       room.memberExit(userName);
+               }
+       }
+       
+       public void enterRoom(User user, String roomName) {
+               assert(roomName != null);
+               assert(roomName.trim().length() > 0);
+               if (! availableRooms.containsKey(roomName)) {
+                       throw new ChatException("No such room exists 
["+roomName+"]", ChatException.ErrorType.NO_SUCH_ROOM_EXISTS);
+               }
+               Room room = availableRooms.get(roomName);
+               room.memberEnter(user);
+       }
+
+       public List<ChatMessage> getMessagesInRoom(String roomName) {
+               assert(roomName != null);
+               assert(roomName.trim().length() > 0);
+               if (! availableRooms.containsKey(roomName)) {
+                       throw new ChatException("No such room exists 
["+roomName+"]", ChatException.ErrorType.NO_SUCH_ROOM_EXISTS);
+               }
+               Room room = availableRooms.get(roomName);
+               return room.getChatMessages();
+       }
+
+       public void sendMessageToRoom(String roomName, User user, String 
message) {
+               assert(roomName != null);
+               if (! availableRooms.containsKey(roomName)) {
+                       throw new ChatException("No such room exists 
["+roomName+"]", ChatException.ErrorType.NO_SUCH_ROOM_EXISTS);
+               }
+               Room room = availableRooms.get(roomName);
+               room.addMessage(new ChatMessage(message, user));
+       }
+
+       public List<User> getUsersAvailableInRoom(String roomName) {
+               assert(roomName != null);
+               if (! availableRooms.containsKey(roomName)) {
+                       throw new ChatException("No such room exists 
["+roomName+"]", ChatException.ErrorType.NO_SUCH_ROOM_EXISTS);
+               }
+               Room room = availableRooms.get(roomName);
+               return room.getMembers();
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ChatServiceImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Constants.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Constants.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Constants.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Constants.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,5 @@
+package org.apache.struts.action2.showcase.chat;
+
+public class Constants {
+       public static String UPDATE_FREQ = "30000";
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Constants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/CrudRoomAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/CrudRoomAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/CrudRoomAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/CrudRoomAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,44 @@
+package org.apache.struts.action2.showcase.chat;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class CrudRoomAction extends ActionSupport {
+
+       private static final long serialVersionUID = 1L;
+
+       private ChatService chatService;
+       
+       private String name;
+       private String description;
+       
+       
+       public String getDescription() {
+               return description;
+       }
+
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public CrudRoomAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String create() throws Exception {
+               try {
+                       chatService.addRoom(new Room(name, description));
+               }
+               catch(ChatException e) {
+                       addActionError(e.getMessage());
+               }
+               return SUCCESS;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/CrudRoomAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/DateConverter.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/DateConverter.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/DateConverter.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/DateConverter.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,39 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.struts.action2.util.StrutsTypeConverter;
+
+public class DateConverter extends StrutsTypeConverter {
+       
+       private static final Log _log = LogFactory.getLog(DateConverter.class);
+
+       public Object convertFromString(Map context, String[] values, Class 
toClass) {
+               
+               if (values.length > 0 && values[0] != null && 
values[0].trim().length() > 0) {
+                       SimpleDateFormat sdf = new SimpleDateFormat();
+                       try {
+                               return sdf.parse(values[0]);
+                       }
+                       catch(ParseException e) {
+                               _log.error("error converting value 
["+values[0]+"] to Date ", e);
+                       }
+               }
+               return null;
+       }
+
+       public String convertToString(Map context, Object o) {
+               
+               if (o instanceof Date) {
+                       SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy 
hh:mm:ss");
+                       return sdf.format((Date) o);
+               }
+               return "";
+       }
+}
+

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/DateConverter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/EnterRoomAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/EnterRoomAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/EnterRoomAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/EnterRoomAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,42 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.Map;
+
+import org.apache.struts.action2.interceptor.SessionAware;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class EnterRoomAction extends ActionSupport implements SessionAware {
+
+       private static final long serialVersionUID = 1L;
+       
+       private ChatService chatService;
+       private Map session;
+       private String roomName;
+       
+       public String getRoomName() { return this.roomName; }
+       public void setRoomName(String roomName) { this.roomName = roomName; }
+       
+       public EnterRoomAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String execute() throws Exception {
+               
+               User user = (User) 
session.get(ChatAuthenticationInterceptor.USER_SESSION_KEY);
+               try {
+                       chatService.enterRoom(user, roomName);
+               }
+               catch(Exception e) {
+                       addActionError(e.getMessage());
+               }       
+               return SUCCESS;
+       }
+
+       
+       // === SessionAware ===
+       public void setSession(Map session) {
+               this.session = session;
+       }
+       
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/EnterRoomAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ExitRoomAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ExitRoomAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ExitRoomAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ExitRoomAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,38 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.Map;
+
+import org.apache.struts.action2.interceptor.SessionAware;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class ExitRoomAction extends ActionSupport implements SessionAware {
+
+       private static final long serialVersionUID = 1L;
+
+       private String roomName;
+       
+       private Map session;
+       
+       public String getRoomName() { return roomName; }
+       public void setRoomName(String roomName) { this.roomName = roomName; }
+       
+       private ChatService chatService; 
+       
+       public ExitRoomAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String execute() throws Exception {
+               User user = (User) 
session.get(ChatAuthenticationInterceptor.USER_SESSION_KEY);
+               chatService.exitRoom(user.getName(), roomName);
+               
+               return SUCCESS;
+       }
+       
+       // === SessionAware ===
+       public void setSession(Map session) {
+               this.session = session;
+       }
+       
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/ExitRoomAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/MessagesAvailableInRoomAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/MessagesAvailableInRoomAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/MessagesAvailableInRoomAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/MessagesAvailableInRoomAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,39 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class MessagesAvailableInRoomAction extends ActionSupport {
+
+       private static final long serialVersionUID = 1L;
+
+       private String roomName;
+       private ChatService chatService;
+       private List<ChatMessage> messagesAvailableInRoom = new 
ArrayList<ChatMessage>();
+       
+       public String getRoomName() { return this.roomName; }
+       public void setRoomName(String roomName) {
+               this.roomName = roomName;
+       }
+       
+       public List<ChatMessage> getMessagesAvailableInRoom() {
+               return messagesAvailableInRoom;
+       }
+       
+       public MessagesAvailableInRoomAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String execute() throws Exception {
+               try {
+                       messagesAvailableInRoom = 
chatService.getMessagesInRoom(roomName);
+               }
+               catch(ChatException e) {
+                       addActionError(e.getMessage());
+               }
+               return SUCCESS;
+       }
+       
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/MessagesAvailableInRoomAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Room.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Room.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Room.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Room.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,81 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Room {
+       
+       private static final int MAX_CHAT_MESSAGES = 10;
+       
+       private String name;
+       private String description;
+       private Date creationDate;
+       
+       private List<ChatMessage> messages = new ArrayList<ChatMessage>();
+       
+       private Map<String, User> members = new LinkedHashMap<String, User>();
+       
+       public Room(String name, String description) {
+               this.name = name;
+               this.description = description;
+               this.creationDate = new Date(System.currentTimeMillis());
+       }
+       
+       
+       // properties
+       public Date getCreationDate() {
+               return creationDate;
+       }
+
+       public String getDescription() {
+               return description;
+       }
+
+       public String getName() {
+               return name;
+       }
+       
+       
+       // (behaviour) members
+       public List<User> getMembers() {
+               return new ArrayList<User>(members.values());
+       }
+       public User findMember(String name) {
+               assert(name != null);
+               return members.get(name);
+       }
+       public boolean hasMember(String name) {
+               assert(name != null);
+               return members.containsKey(name);
+       }
+       public void memberEnter(User member) {
+               assert(member != null);
+               if (! hasMember(member.getName())) {
+                       members.put(member.getName(), member);
+               }
+       }
+       
+       public void memberExit(String memberName) {
+               assert(memberName != null);
+               assert(memberName.trim().length() > 0);
+               members.remove(memberName);
+       }
+
+       
+       // (behaviour) chat messags
+       public void addMessage(ChatMessage chatMessage) {
+               if (messages.size() > MAX_CHAT_MESSAGES) {
+                       // messages.remove(messages.size() - 1);
+                       messages.remove(0);
+               }
+               messages.add(chatMessage);
+       }
+       
+       public List<ChatMessage> getChatMessages() {
+               return new ArrayList<ChatMessage>(messages);
+       }
+       
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/Room.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/RoomsAvailableAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/RoomsAvailableAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/RoomsAvailableAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/RoomsAvailableAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,28 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class RoomsAvailableAction extends ActionSupport {
+
+       private static final long serialVersionUID = 1L;
+
+       private List<Room> availableRooms = new ArrayList<Room>();
+       
+       private ChatService chatService;
+       
+       public RoomsAvailableAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String execute() throws Exception {
+               availableRooms = chatService.getAvailableRooms();
+               return SUCCESS;
+       }
+       
+       public List<Room> getAvailableRooms() {
+               return availableRooms;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/RoomsAvailableAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/SendMessageToRoomAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/SendMessageToRoomAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/SendMessageToRoomAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/SendMessageToRoomAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,50 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.Map;
+
+import org.apache.struts.action2.interceptor.SessionAware;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class SendMessageToRoomAction extends ActionSupport implements 
SessionAware {
+
+       private static final long serialVersionUID = 1L;
+       
+       private ChatService chatService;
+       
+       private String roomName;
+       private String message;
+       private Map session;
+       
+       
+       public SendMessageToRoomAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String getRoomName() { return this.roomName; }
+       public void setRoomName(String roomName) {
+               this.roomName = roomName;
+       }
+       
+       public String getMessage() { return this.message; }
+       public void setMessage(String message) {
+               this.message = message;
+       }
+       
+       
+       public String execute() throws Exception {
+               User user = (User) 
session.get(ChatAuthenticationInterceptor.USER_SESSION_KEY);
+               try {
+                       chatService.sendMessageToRoom(roomName, user, message);
+               }catch(ChatException e) {
+                       addActionError(e.getMessage());
+               }
+               return SUCCESS;
+       }
+
+       public void setSession(Map session) {
+               this.session = session;
+       }
+
+       
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/SendMessageToRoomAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/User.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/User.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/User.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/User.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,41 @@
+/*
+ * $Id: DateAction.java 394498 2006-04-16 15:28:06Z tmjee $
+ *
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * 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 org.apache.struts.action2.showcase.chat;
+
+import java.util.Date;
+
+/**
+ * Represends a user in the Chat example.
+ */
+public class User {
+       private String name;
+       private Date creationDate;
+       
+       
+       public User(String name) {
+               this.name = name;
+               this.creationDate = new Date(System.currentTimeMillis());
+       }
+       
+       public Date getCreationDate() {
+               return creationDate;
+       }
+       public String getName() {
+               return name;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/User.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,29 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class UsersAvailableAction extends ActionSupport {
+
+       private static final long serialVersionUID = 1L;
+       
+       private List<User> availableUsers = new ArrayList<User>();
+       private ChatService chatService;
+       
+       public UsersAvailableAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       public String execute() throws Exception {
+               
+               availableUsers = chatService.getAvailableUsers();
+               
+               return SUCCESS;
+       }
+       
+       public List<User> getAvailableUsers() {
+               return availableUsers;
+       }
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableAction.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableInRoomAction.java
URL: 
http://svn.apache.org/viewvc/struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableInRoomAction.java?rev=415011&view=auto
==============================================================================
--- 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableInRoomAction.java
 (added)
+++ 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableInRoomAction.java
 Sat Jun 17 01:33:02 2006
@@ -0,0 +1,41 @@
+package org.apache.struts.action2.showcase.chat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.opensymphony.xwork.ActionSupport;
+
+public class UsersAvailableInRoomAction extends ActionSupport {
+
+       private static final long serialVersionUID = 1L;
+       
+       private ChatService chatService;
+       private List<User> usersAvailableInRoom = new ArrayList<User>();
+       
+       private String roomName;
+       
+       public UsersAvailableInRoomAction(ChatService chatService) {
+               this.chatService = chatService;
+       }
+       
+       
+       public String getRoomName() { return this.roomName; }
+       public void setRoomName(String roomName) {
+               this.roomName = roomName;
+       }
+       
+       public List<User> getUsersAvailableInRoom() {
+               return usersAvailableInRoom;
+       }
+       
+       public String execute() throws Exception {
+               try {
+                       usersAvailableInRoom = 
chatService.getUsersAvailableInRoom(roomName);
+               }
+               catch(ChatException e) {
+                       addActionError(e.getMessage());
+               }
+               return SUCCESS;
+       }
+
+}

Propchange: 
struts/action2/trunk/apps/showcase/src/main/java/org/apache/struts/action2/showcase/chat/UsersAvailableInRoomAction.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to