com.arjuna.webservices.base.processors.BaseProcessor Maven / Gradle / Ivy
/*
* JBoss, Home of Professional Open Source
* Copyright 2006, 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.arjuna.webservices.base.processors;
import java.util.HashMap;
import java.util.Map;
import com.arjuna.webservices.logging.WSCLogger;
/**
* Utility class handling common callback functionality.
* @author kevin
*/
public abstract class BaseProcessor
{
/**
* The callback map.
*/
private final Map callbackMap = new HashMap() ;
/**
* Register the callback for the message ID.
* @param messageID The message ID.
* @param callback The callback.
*/
protected void register(final String messageID, final Callback callback)
{
synchronized(callbackMap)
{
callbackMap.put(messageID, callback) ;
}
}
/**
* Remove the callback for the specified message ID.
* @param messageID The message ID.
*/
public void removeCallback(final String messageID)
{
synchronized(callbackMap)
{
callbackMap.remove(messageID) ;
}
}
/**
* Handle the callbacks for the specified addressing context.
* @param executor The callback executor.
* @param ids The message ids.
*
*/
protected void handleCallbacks(final CallbackExecutor executor, final String[] ids)
{
final Callback[] callbacks = getCallbacks(ids) ;
if (callbacks != null)
{
boolean executed = false ;
final int numCallbacks = callbacks.length ;
for(int count = 0 ; count < numCallbacks ; count++)
{
final Callback callback = callbacks[count] ;
if (callback != null)
{
executed = true ;
try
{
executor.execute(callback) ;
callback.setTriggered() ;
}
catch (final Throwable th)
{
if (WSCLogger.logger.isTraceEnabled())
{
WSCLogger.logger.tracev("Unexpected throwable while executing callback:", th) ;
}
callback.setFailed() ;
}
}
}
if (!executed && WSCLogger.logger.isTraceEnabled())
{
executor.executeUnknownIds(ids) ;
}
}
}
/**
* Get the callbacks associated with the message ids.
* @param ids The message ids.
* @return The callbacks associated with the message ids in the addressing context.
*/
private Callback[] getCallbacks(final String[] ids)
{
if (ids == null)
{
return null ;
}
final int numIDs = ids.length ;
final Callback[] callbacks = new Callback[numIDs] ;
synchronized(callbackMap)
{
for(int count = 0 ; count < numIDs ; count++)
{
callbacks[count] = (Callback)callbackMap.get(ids[count]) ;
}
}
return callbacks ;
}
/**
* Interface for executing a specific callback.
* @author kevin
*/
protected static interface CallbackExecutor
{
/**
* The execute method.
* @param callback The callback instance.
*/
public void execute(final Callback callback) ;
/**
* Execute method for an unknown identifier.
* @param ids The current ids.
*/
public void executeUnknownIds(final String[] ids) ;
}
/**
* Adapter for the callback executor.
* @author kevin
*/
protected abstract static class CallbackExecutorAdapter implements CallbackExecutor
{
/**
* Execute method for an unknown identifier.
* @param ids The current ids.
*/
public void executeUnknownIds(final String[] ids)
{
WSCLogger.logger.tracev("Received a response for non existent message IDs {0}", new Object[] {toString(ids)}) ;
}
/**
* Convert an array of IDs to a comma separated string representation.
* @param ids The ids.
* @return The string representation.
*/
private String toString(final String[] ids)
{
final int numIDs = (ids == null ? 0 : ids.length) ;
if (numIDs == 0)
{
return "" ;
}
else if (numIDs == 1)
{
return ids[0] ;
}
else
{
final StringBuffer buffer = new StringBuffer(ids[0]) ;
for(int count = 1 ; count < numIDs ; count++)
{
buffer.append(", ") ;
buffer.append(ids[count]) ;
}
return buffer.toString() ;
}
}
}
}