/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/chat/trunk/chat-tool/tool/src/java/org/sakaiproject/chat/tool/ChatDelivery.java $ * $Id: ChatDelivery.java 14062 2006-08-27 03:44:18Z csev@umich.edu $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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.sakaiproject.chat2.tool; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.chat2.model.ChatMessage; import org.sakaiproject.chat2.model.ChatManager; import org.sakaiproject.time.api.Time; import org.sakaiproject.time.cover.TimeService; import org.sakaiproject.chat2.model.ChatChannel; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.courier.api.Expirable; import org.sakaiproject.user.api.ContextualUserDisplayService; import org.sakaiproject.user.api.User; import org.sakaiproject.user.cover.UserDirectoryService; import org.sakaiproject.user.api.UserNotDefinedException; import org.sakaiproject.util.BaseDelivery; import org.sakaiproject.util.StringUtil; import org.sakaiproject.util.Web; /** * <p> * ChatDelivery is a Delivery that causes a chat message to be appended to a table of chat messages in the HTML element identified by the address and elementID. * </p> */ public class ChatDelivery extends BaseDelivery implements Expirable { /** Our logger. */ private static Log logger = LogFactory.getLog(ChatDelivery.class); /** The message. it could be a string id or the actual message. */ protected Object m_message = null; protected ChatManager chatManager = null; protected boolean m_beepOnDelivery = false; protected String placementId = ""; private ContextualUserDisplayService contextualUserDisplayService; private long created; private int ttl; /** * Construct. * * @param address * The address. * @param elementId * The elementId. */ public ChatDelivery(String address, String elementId, Object message, String placementId, boolean beepOnDelivery, ChatManager chatManager) { super(address, elementId); m_message = message; m_beepOnDelivery = beepOnDelivery; this.chatManager = chatManager; this.placementId = placementId; this.created = System.currentTimeMillis(); this.ttl = ServerConfigurationService.getInt("chat.delivery.ttl", 300); } // ChatDelivery public ChatMessage getMessage() { if(m_message instanceof String) { m_message = chatManager.getMessage((String)m_message); } if(m_message instanceof ChatMessage) return (ChatMessage)m_message; return null; } public void setMessage(Object message) { this.m_message = message; } /** * Compose a javascript message for delivery to the browser client window. * This function happens in the client connection thread instead of in the event notification thread * * @return The javascript message to send to the browser client window. */ public String compose() { ChatMessage message = null; if(m_message instanceof ChatMessage) { message = (ChatMessage)m_message; } else if(m_message instanceof String) { message = chatManager.getMessage((String)m_message); } else { return ""; } if (logger.isDebugEnabled()) logger.debug("compose() element: " + m_elementId + ", message: " + message.getId()); // generate a string of JavaScript commands to update the message log User sender = null; try { sender = UserDirectoryService.getUser(message.getOwner()); } catch(UserNotDefinedException e) { logger.error(e); } User myself = UserDirectoryService.getCurrentUser(); ChatChannel channel = message.getChatChannel(); // We may not have a usage session String retval = null; if (channel == null) { retval = "try { this.location.replace(addAuto(this.location));} catch (error) {alert(error);}"; } // otherwise setup for a browser-side javascript DOM modification to insert the message else { String msgbody = Web.escapeJsQuoted(Web.escapeHtmlFormattedText(message.getBody())); msgbody = msgbody.replace('\n',' ').replace('\r',' '); Time messageTime = TimeService.newTime(message.getMessageDate().getTime()); StringBuilder retvalBuf = new StringBuilder(); retvalBuf.append( "try { appendMessage('" ); String displayName = getUserDisplayName(sender, channel.getContext()); retvalBuf.append( Web.escapeJsQuoted(Web.escapeHtml(displayName)) ); retvalBuf.append( "', '" ); retvalBuf.append( sender.getId() ); retvalBuf.append( "', '" ); retvalBuf.append( String.valueOf(chatManager.getCanDelete(message)) ); retvalBuf.append( "', '" ); retvalBuf.append( messageTime.toStringLocalDate() ); retvalBuf.append( "', '" ); retvalBuf.append( messageTime.toStringLocalTimeZ() ); retvalBuf.append( "', '" ); retvalBuf.append( messageTime.toString() ); retvalBuf.append( "', '" ); retvalBuf.append( msgbody ); retvalBuf.append( "','" ); retvalBuf.append( message.getId() ); retvalBuf.append( "'); } catch (error) {alert(error);} " ); retval = retvalBuf.toString(); } if (m_beepOnDelivery && (sender != null) && sender.compareTo(myself) != 0) { retval += "beep = true;"; } return retval; } // compose /** * Display. */ public String toString() { return super.toString() + " : " + m_message; } // toString public String getMessageId() { if (m_message instanceof String) { return (String)m_message; } else if (m_message instanceof ChatMessage) { return ((ChatMessage)m_message).getId(); } else { return ""; } } /** * Are these the same? * * @return true if obj is the same Delivery as this one. */ public boolean equals(Object obj) { if (!super.equals(obj)) return false; ChatDelivery cob = (ChatDelivery) obj; if (StringUtil.different(cob.getMessageId(), getMessageId())) return false; return true; } private String getUserDisplayName(User u, String context) { contextualUserDisplayService = (ContextualUserDisplayService) ComponentManager.get("org.sakaiproject.user.api.ContextualUserDisplayService"); if (contextualUserDisplayService == null) { return u.getDisplayName(); } else { String ret = contextualUserDisplayService.getUserDisplayName(u, "/site/" + context); if (ret == null) ret = u.getDisplayName(); return ret; } } @Override public long getCreated() { return created; } public void setCreated(long created) { this.created = created; } @Override public int getTtl() { return ttl; } }