/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */ package com.jboss.transaction.wstf.proxy; import java.util.ArrayList; import java.util.Map; import java.util.TreeMap; /** * Message logging via the proxy. */ public class ProxyConversation { /** * The conversation id. */ private static int currentConversationId ; /** * The conversation map. */ private static Map conversationMap = new TreeMap() ; /** * The conversation state map. */ private static Map conversationStateMap = new TreeMap() ; /** * The marker for an internal id. */ private static final char INTERNAL_ID = 'c' ; /** * The marker for an external id. */ private static final char EXTERNAL_ID = 'C' ; /** * Create a conversation. * @return The id of the conversation. */ public static synchronized String createConversation() { final String conversationId = INTERNAL_ID + Integer.toString(++currentConversationId) ; conversationMap.put(mapConversationId(conversationId), new ArrayList()) ; System.out.println("KEV: created conversation " + conversationId) ; return conversationId ; } /** * Remove the conversation. * @param conversationId The conversation id. * @return The conversation messages in sequence. */ public static synchronized String[] removeConversation(final String conversationId) { final ArrayList list = (ArrayList)conversationMap.remove(mapConversationId(conversationId)) ; System.out.println("KEV: removed conversation " + conversationId) ; return (list == null ? new String[0] : (String[])list.toArray(new String[list.size()])) ; } /** * Append a message to the conversation. * @param conversationId The conversation id. * @param message The message to append to the conversation. */ public static synchronized void appendConversation(final String conversationId, final String message) { final ArrayList list = (ArrayList)conversationMap.get(mapConversationId(conversationId)) ; if (list != null) { list.add(message) ; } } /** * Set the conversation state for the specified conversation. * @param conversationId The conversation id. * @param conversationState The conversation state. */ public static synchronized void setConversationState(final String conversationId, final ProxyConversationState conversationState) { conversationStateMap.put(mapConversationId(conversationId), conversationState) ; } /** * Get the conversation state for the specified conversation. * @param conversationId The conversation id. * @return The conversation state or null. */ public static synchronized ProxyConversationState getConversationState(final String conversationId) { return (ProxyConversationState)conversationStateMap.get(mapConversationId(conversationId)) ; } /** * Clear the conversation state for the specified conversation. * @param conversationId The conversation id. */ public static synchronized void clearConversationState(final String conversationId) { conversationStateMap.remove(mapConversationId(conversationId)) ; } /** * Is the conversation id an internal id? * @param conversationId The conversation id. * @return True if the conversation id is internal, false if it is external. */ public static boolean isInternalConversationId(final String conversationId) { return ((conversationId != null) && (conversationId.length() != 0) && (conversationId.charAt(0) == INTERNAL_ID)) ; } /** * Get the alternate conversation id. * @param conversationId The current conversation id. * @return The alternate conversation id. */ public static String getAlternateConversationId(final String conversationId) { if ((conversationId == null) || (conversationId.length() == 0)) { return conversationId ; } if (conversationId.charAt(0) == INTERNAL_ID) { return EXTERNAL_ID + mapConversationId(conversationId) ; } else { return INTERNAL_ID + mapConversationId(conversationId) ; } } /** * Get the map conversation id. * @param conversationId The full conversation id. * @return The conversation id for the map. */ private static String mapConversationId(final String conversationId) { if ((conversationId == null) || (conversationId.length() == 0)) { return conversationId ; } return conversationId.substring(1) ; } }