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