package org.apache.ws.muws.v1_0.topics.impl;
import org.apache.ws.XmlObjectWrapper;
import org.apache.ws.muws.impl.CategoryImpl;
import org.apache.ws.muws.v1_0.MuwsConstants;
import org.apache.ws.muws.v1_0.events.ManagementEvent;
import org.apache.ws.muws.v1_0.events.Situation;
import org.apache.ws.muws.v1_0.events.impl.SituationImpl;
import org.apache.ws.muws.v1_0.events.impl.XmlBeansManagementEvent;
import org.apache.ws.muws.v1_0.topics.ManagementEventTopic;
import org.apache.ws.notification.topics.impl.TopicImpl;
import org.apache.ws.resource.properties.ResourcePropertyValueChangeEvent;
import org.apache.ws.resource.i18n.MessagesImpl;
import org.apache.ws.util.XmlBeanUtils;
import org.apache.ws.util.i18n.Messages;
import org.apache.xmlbeans.XmlObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart1.ManagementEventDocument;
/**
* A ManagementEvent topic listener for generic management events and PropChange->Management Events.
*
* @author Sal Campana
*/
public class XmlBeansManagementEventTopicImpl extends TopicImpl implements ManagementEventTopic
{
private static final Log LOG = LogFactory.getLog( XmlBeansManagementEventTopicImpl.class );
private static final Messages MSG = MessagesImpl.getInstance();
private ManagementEvent m_propChangeManagementEvent;
public XmlBeansManagementEventTopicImpl( String capabilityName )
{
super( capabilityName );
}
/**
* This operation is used to set the default ManagementEvent to
* be used when sending Property Changed Management Events.
*
* Note: The object must implement XmlObjectWrapper, the getXmlObject() operation will be used to get a new instance
* of the Management Event for use to throw the event.
*
* @param me
*/
public void setPropChangeManagemntEvent (ManagementEvent me)
{
if(!(me instanceof XmlObjectWrapper))
{
throw new IllegalArgumentException("The Management Event must implement the XmlObjectWrpper interface.");
}
m_propChangeManagementEvent = me;
}
public void propertyChanged(ResourcePropertyValueChangeEvent event)
{
XmlObject me = buildManagementEvent(event);
Object msg;
if ( me instanceof XmlObjectWrapper )
{
msg = ((XmlObjectWrapper)me).getXmlObject();
}
else
{
msg = me;
}
try
{
publish( msg );
}
catch ( Exception e )
{
// TODO: do we want to throw this and cause the SetRP request to fault?
e.printStackTrace();
}
}
private XmlObject buildManagementEvent(ResourcePropertyValueChangeEvent event)
{
ManagementEventDocument me;
if(m_propChangeManagementEvent != null)
{
me = (ManagementEventDocument) ((XmlObjectWrapper)m_propChangeManagementEvent).getXmlObject();
}
else
{
Situation situation = new SituationImpl(new CategoryImpl(MuwsConstants.SITUATION_OTHER));
XmlBeansManagementEvent xme = new XmlBeansManagementEvent(situation);
me = (ManagementEventDocument) ((XmlObjectWrapper)xme).getXmlObject();
}
org.oasisOpen.docs.wsdm.x2004.x12.muws.wsdmMuwsPart1.ManagementEventType managementEvent = me.getManagementEvent();
XmlBeanUtils.addChildElement(managementEvent, ((XmlObjectWrapper)event).getXmlObject());
return me;
}
/**
* This method is used to send a ManagementEvent to subscribers to this topic.
*
* precondition: The param ManagementEvent should be complete and not rely on
* any setters in this topic.
*
* @param me
*/
public void publish(ManagementEvent me)
{
Object msg;
if ( me instanceof XmlObjectWrapper )
{
msg = ((XmlObjectWrapper)me).getXmlObject();
}
else
{
msg = me;
}
try
{
publish( msg );
}
catch ( Exception e )
{
// TODO: do we want to throw this and cause the SetRP request to fault?
e.printStackTrace();
}
}
}