Package org.wso2.carbon.bam.core.receivers

Source Code of org.wso2.carbon.bam.core.receivers.ActivityMessageReceiver



package org.wso2.carbon.bam.core.receivers;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.namespace.QName;

import org.apache.axiom.om.OMElement;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.receivers.AbstractMessageReceiver;
import org.wso2.carbon.bam.common.dataobjects.activity.XPathConfigDO;
import org.wso2.carbon.bam.core.ActivityConstants;
import org.wso2.carbon.bam.core.admin.BAMDataServiceAdmin;
import org.wso2.carbon.bam.common.dataobjects.activity.ActivityDO;
import org.wso2.carbon.bam.common.dataobjects.activity.MessageDO;
import org.wso2.carbon.bam.common.dataobjects.activity.MessageDataDO;
import org.wso2.carbon.bam.common.dataobjects.activity.MessagePropertyDO;
import org.wso2.carbon.bam.common.dataobjects.service.OperationDO;
import org.wso2.carbon.bam.common.dataobjects.activity.PropertyFilterDO;
import org.wso2.carbon.bam.common.dataobjects.service.ServerDO;
import org.wso2.carbon.bam.common.dataobjects.service.ServiceDO;
import org.wso2.carbon.bam.core.util.SimpleLRUCache;
import org.wso2.carbon.bam.util.BAMCalendar;
import org.wso2.carbon.bam.util.BAMException;

import java.util.concurrent.ConcurrentHashMap;

/* (1)<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelo pe/">
* (2)  <activitydata:Event xmlns:activitydata="http://wso2.org/ns/2009/09/bam/service/activity/data">
* (3)    <activitydata:ActivityData>
* (4)    <activitydata:ServerName>https://10.10 0.1.143:9443</activitydata:ServerName>
* (5)    <activitydata:ActivityID>prash491-a03a-426 0-b177-c493ab7a2dbb</activitydata:ActivityID>
* (6)    <activitydata:MessageID />
* (7)    <activity data:ServiceName>SampleHelloService</activitydata:ServiceName>
* (8)    <activitydata:OperationName>sayHello</activitydata:OperationName>
* (9)    <activitydata:ActivityName>hello2 </activitydata:ActivityName>
* (10)   <activitydata:ActivityDescription>say hello2</activitydata:ActivityDescription>
* (11)   <activitydata:RemoteIPAddress>127.0.0.1</activitydata:RemoteIPAddress>
* (12)   <activitydata:UserAgent>%%%%%</activitydata:UserAgent>
* (13)   </activitydata:ActivityData>
* (14) </activitydata:Event>
* (15)</soapenv:Body>
*/

public class ActivityMessageReceiver extends AbstractMessageReceiver {
    private String messageFaultReason = "";

    private Map<String, ServerDO> serverMap = new ConcurrentHashMap<String, ServerDO>();
    private Map<String, ServiceDO> serviceMap = new ConcurrentHashMap<String, ServiceDO>();
    private Map<String, OperationDO> operationMap = new ConcurrentHashMap<String, OperationDO>();
    private Map<String, ActivityDO> activityMap = new SimpleLRUCache<String, ActivityDO>(100);

    /**
     * When first time message comes to a system, service, operation will be
     * added.(bam persistance manager will take care about it, if not add to DB
     */
    protected void invokeBusinessLogic(MessageContext messageContext) throws AxisFault {

        BAMDataServiceAdmin dsAdmin = new BAMDataServiceAdmin();
        SOAPBody body = messageContext.getEnvelope().getBody();
        Iterator itr = body.getChildren(); // Retrieving an empty body message
        if (itr.hasNext()) {
            QName aidEventQname = new QName(ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.ACTIVITY_ELEMENT_EVENT);
            OMElement aidEventElement = messageContext.getEnvelope().getBody().getFirstChildWithName(aidEventQname);

            if (aidEventElement != null) {
                if (log.isDebugEnabled()) {
                    log.debug("Activity Event has been received" + aidEventElement);
                }

                QName activityQname = new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                ActivityConstants.ACTIVITY_ELEMENT_ACTIVITY_DATA);

                Iterator iterator = aidEventElement.getChildrenWithName(activityQname);
                while (iterator.hasNext()) {
                    OMElement activityElement = (OMElement) iterator.next();
                    ActivityData data = processActivityElement(activityElement);
                    if (data != null) {

                        if ((data.getXPathEvaluations() != null && !data.getXPathEvaluations().isEmpty())) {
                            storeActivity(data, dsAdmin);
                            storeMessage(data, dsAdmin);
                            storeMessageData(data, dsAdmin);
                            storeProperties(data, dsAdmin);

                            for (PropertyFilterData filterData : data.getXPathEvaluations().keySet()) {
                                storeXPathData(filterData, dsAdmin);
                            }
                            storeXPathProperties(data, dsAdmin);
                        }
                        // For message status,event comes from observer
                        else if (data.getRequestMessageStatus() != null) {

                            if (!data.getRequestMessageStatus().equals("")) {
                                storeActivity(data, dsAdmin);
                                storeMessage(data, dsAdmin);
                                storeMessageStatusData(data, dsAdmin);
                                storeProperties(data, dsAdmin);
                            }

                        }// it is a normal event, fill activity,property,message, message_data tables
                        else {

                            storeActivity(data, dsAdmin);
                            storeMessage(data, dsAdmin);
                            storeMessageData(data, dsAdmin);
                            storeProperties(data, dsAdmin);

                        }

/*                        if (data.getMessageBody() != null && (data.getXPathEvaluations() != null &&
                                                              !data.getXPathEvaluations().isEmpty())) {

                            storeActivity(data, dsAdmin);
                            storeMessage(data, dsAdmin);
                            storeMessageData(data, dsAdmin);
                            storeProperties(data, dsAdmin);

                            for (PropertyFilterData filterData : data.getXPathEvaluations().keySet()) {
                                storeXPathData(filterData, dsAdmin);
                            }
                            storeXPathProperties(data, dsAdmin);

                        } else if (data.getMessageBody() != null) {

                            storeActivity(data, dsAdmin);
                            storeMessage(data, dsAdmin);
                            storeMessageData(data, dsAdmin);
                            storeProperties(data, dsAdmin);

                        } else if (data.getXPathEvaluations() != null && !data.getXPathEvaluations().isEmpty()) {

                            for (PropertyFilterData filterData : data.getXPathEvaluations().keySet()) {
                                storeXPathData(filterData, dsAdmin);
                            }
                            storeActivity(data, dsAdmin);
                            storeMessage(data, dsAdmin);
                            storeProperties(data, dsAdmin);
                            storeXPathProperties(data, dsAdmin);

                        }
                        // For message status,event comes from observer
                        else if (data.getRequestMessageStatus() != null) {

                            if (!data.getRequestMessageStatus().equals("")) {
                                storeActivity(data, dsAdmin);
                                storeMessage(data, dsAdmin);
                                storeMessageStatusData(data, dsAdmin);
                                storeProperties(data, dsAdmin);
                            }

                        }// it is a normal event, fill activity,property,message table
                        else {

                            storeActivity(data, dsAdmin);
                            storeMessage(data, dsAdmin);
                            storeProperties(data, dsAdmin);

                        }*/
                    }
                }

/*                QName propertyFilterQname = new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                      ActivityConstants.PROPERTY_FILTER_DATA_ELEMENT);
                iterator = aidEventElement.getChildrenWithName(propertyFilterQname);

                while (iterator.hasNext()) {
                    OMElement propertyFilterElement = (OMElement) iterator.next();
                    PropertyFilterData data = processPropertyFilterElement(propertyFilterElement);

                    if (data != null) {
                        storeXPathData(data, dsAdmin);
                    }
                }*/
            }


            if (!"".equals(messageFaultReason)) {
                log.error("BAM ActivityIDMessageReceiver invokeBusinessLogic " + messageFaultReason);
                log.error("BAM ActivityIDMessageReceiver invokeBusinessLogic SOAP Envelope causing the problem"
                          + messageContext.getEnvelope().toString());
            }
        }

        if (log.isDebugEnabled()) {
            log.debug("BAM ActivityIDMessageReceiver invokeBusinessLogic SOAP Envelope "
                      + messageContext.getEnvelope().toString());
        }

        messageFaultReason = "";
    }

    /**
     * Stores xpath configuration data to the database. Two tables are affected. BAM_XPATH and BAM_NAMESPACE.
     * If the xpath configuration is already present updates it in BAM_XPATH. All the namespaces in
     * BAM_NAMESPACE relating to particular xpath configuration are deleted and new namespaces are
     * added during an update.
     *
     * @param data    New xpath configuration data to be added to the database
     * @param dsAdmin Dataservice client facade.
     */
    private void storeXPathData(PropertyFilterData data, BAMDataServiceAdmin dsAdmin) {
        try {
            ServerDO serverDO = dsAdmin.getServer(data.getServerName());
            if (serverDO != null && data != null) {
                PropertyFilterDO propertyFilterDO = dsAdmin.getXpathConfiguration(
                        data.getExpressionKey(), serverDO.getId());

                if (propertyFilterDO != null) { // If the xpath configuration is already present in the database we do an update instead of adding.
                    if (!isEqualConfigurations(propertyFilterDO, data)) {
                        try {
                            dsAdmin.updateXpathConfiguration(data.getAlias(), data.getExpressionKey(),
                                                             data.getExpression(), serverDO.getId(),
                                                             propertyFilterDO.getId());
                        } catch (BAMException e) {
                            log.error("Could not update xpath configuration in database..");
                            return;
                        }

                        try {
                            dsAdmin.deleteNamespaceData(propertyFilterDO.getId());
                        } catch (BAMException e) {
                            log.error("Failed to delete existing namespace data in database." +
                                      " New namespace changes won't be written..", e);
                            return;
                        }

                        storeNamespaceData(data, propertyFilterDO, dsAdmin);
                    }

                } else {
                    try {
                        dsAdmin.addXpathConfiguration(data.getAlias(), data.getExpressionKey(),
                                                      data.getExpression(), serverDO.getId());
                    } catch (BAMException e) {
                        log.error("Could not add xpath configuration to the database..");
                        return;
                    }

                    propertyFilterDO = dsAdmin.getXpathConfiguration(data.getExpressionKey(), serverDO.getId());

                    if (propertyFilterDO != null) { // Adds to namespace table.
                        storeNamespaceData(data, propertyFilterDO, dsAdmin);
                    } else {
                        log.error("Error adding xpath configuration to database..");
                    }
                }
            } else {
                log.error("Server is not in the Database " + data.getServerName());
            }
        } catch (BAMException e) {
            log.error("Could not retrieve server from DB ", e);
        }
    }

    /**
     * Adds namespace data relating to a particular xpath configuration to the BAM_NAMESPACE table.
     * Continues adding namespace until end even though some additions may fail.
     *
     * @param data             New xpath configuration data to be added to the database
     * @param propertyFilterDO Xpath configuration data already existing in the database.
     * @param dsAdmin          Dataservice client facade.
     */
    private void storeNamespaceData(PropertyFilterData data,
                                    PropertyFilterDO propertyFilterDO,
                                    BAMDataServiceAdmin dsAdmin) {
        for (String ns : data.getNamespaces()) {
            String[] tokens = ns.split("@");
            if (tokens != null && tokens.length == 2) {
                String prefix = tokens[0];
                String uri = tokens[1];

                try {
                    dsAdmin.addNamespaceData(propertyFilterDO.getId(), prefix, uri);
                } catch (BAMException e) {
                    log.error("Error adding xpath namespace " + ns + "to the database", e);
                }
            }
        }
    }

    private boolean isEqualConfigurations(PropertyFilterDO filterDO,
                                          PropertyFilterData filterData) {
        if (filterDO.getExpression() != null && filterData.getExpression() != null &&
            filterDO.getExpressionKey() != null && filterData.getExpressionKey() != null) {

            if (filterDO.getExpressionKey().trim().equals(filterData.getExpressionKey().trim())) {
                if (filterDO.getExpression().trim().equals(filterData.getExpression().trim())) {

                    if (filterDO.getAlias() != null && filterData.getAlias() != null) {
                        if (!filterDO.getAlias().trim().equals(filterData.getAlias().trim())) {
                            return false;
                        }
                    } else if (filterDO.getAlias() != null || filterData.getAlias() != null) {
                        return false;
                    }

                    if (filterDO.getNamespaces() != null && filterData.getNamespaces() != null) {
                        for (String ns : filterDO.getNamespaces()) {
                            boolean nsFound = false;
                            for (String innerNs : filterData.getNamespaces()) {
                                if (ns.trim().equals(innerNs.trim())) {
                                    nsFound = true;
                                }
                            }

                            if (!nsFound) {
                                return false;
                            }
                        }

                        return true;
                    } else if ((filterDO.getNamespaces() != null || filterData.getNamespaces() != null)) {
                        if (filterDO.getNamespaces() != null && filterDO.getNamespaces().length == 0) {
                            if (filterData.getNamespaces() == null || filterData.getNamespaces().length == 0) {
                                return true;
                            }
                        }

                        if (filterData.getNamespaces() != null && filterData.getNamespaces().length == 0) {
                            if (filterDO.getNamespaces() == null || filterData.getNamespaces().length == 0) {
                                return true;
                            }
                        }

                        return false;

                    } else {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    /**
     * Store Message
     *
     * @param data    Event data
     * @param dsAdmin Data service access
     */
    private void storeMessage(ActivityData data, BAMDataServiceAdmin dsAdmin) {
        if (data.getServiceName() != null && data.getOperationName() != null && data.getActivityId() != null) {
            if (!data.getOperationName().equals("") && !data.getServiceName().equals("")
                && !data.getActivityId().equals("")) {

                MessageDO messageDO;

                // TODO timestamp Fix
                if (data.getTimeStamp() != null) {
                    if (data.getTimeStamp().equals("")) {
                        messageDO = new MessageDO(data.getMessageId(), BAMCalendar.getInstance(Calendar.getInstance())
                                .getBAMTimestamp(), data.getRemoteIPAddress(), data.getUserAgent());
                    } else {
                        messageDO = new MessageDO(data.getMessageId(), data.getTimeStamp(), data.getRemoteIPAddress(),
                                                  data.getUserAgent());
                    }
                } else {
                    messageDO = new MessageDO(data.getMessageId(), BAMCalendar.getInstance(Calendar.getInstance())
                            .getBAMTimestamp(), data.getRemoteIPAddress(), data.getUserAgent());
                }

                // For the tenanting serverDO should be get passing server name
                // and tenant ID
                ServerDO serverDO = null;
                try {
                    if (serverMap.containsKey(data.getServerName())) {
                        serverDO = serverMap.get(data.getServerName());
                    } else {
                        serverDO = dsAdmin.getServer(data.getServerName());
                        if (serverDO == null) {
                            log.error("Server is not in the Database " + data.getServerName());
                            return;
                        } else {
                            serverMap.put(data.getServerName(), serverDO);
                        }
                    }
                    messageDO.setServerId(serverDO.getId());
                } catch (BAMException e) {
                    log.error("Could not retrieve server from DB ", e);
                }

                ServiceDO serviceDO = null;
                try {
                    String key = messageDO.getServerId() + "-" + data.getServiceName();
                    if (serviceMap.containsKey(key)) {
                        serviceDO = serviceMap.get(key);
                    } else {
                        serviceDO = dsAdmin.getService(messageDO.getServerId(), data.getServiceName());
                        if (serviceDO == null) {
                            serviceDO = new ServiceDO();
                            serviceDO.setServerID(serverDO.getId());
                            serviceDO.setName(data.getServiceName());
                            dsAdmin.addService(serviceDO);
                            serviceDO = dsAdmin.getService(messageDO.getServerId(), data.getServiceName());
                        }
                        serviceMap.put(key, serviceDO);
                    }
                    messageDO.setServiceId(serviceDO.getId());
                } catch (BAMException e) {
                    log.error("Could not retrieve service from DB ", e);
                }

                OperationDO operationDO;
                try {
                    String key = messageDO.getServiceId() + "-" + data.getOperationName();
                    if (operationMap.containsKey(key)) {
                        operationDO = operationMap.get(key);
                    } else {
                        operationDO = dsAdmin.getOperation(messageDO.getServiceId(), data.getOperationName());
                        if (operationDO == null) {
                            operationDO = new OperationDO();
                            operationDO.setServiceID(serviceDO.getId());
                            operationDO.setName(data.getOperationName());
                            dsAdmin.addOperation(operationDO);
                            operationDO = dsAdmin.getOperation(messageDO.getServiceId(), data.getOperationName());
                        }
                        operationMap.put(key, operationDO);
                    }
                    messageDO.setOperationId(operationDO.getOperationID());

                } catch (BAMException e) {
                    log.error("Could not retrieve operation from DB ", e);
                }

                try {
                    ActivityDO activity = null;
                    if (activityMap.containsKey(data.getActivityId())) {
                        activity = activityMap.get(data.getActivityId());
                    } else {
                        activity = dsAdmin.getActivityForActivityID(data.getActivityId());
                        if (activity == null) {
                            activity = new ActivityDO();
                            activity.setActivityId(data.getActivityId());
                            activity.setName(data.getActivityName());
                            activity.setDescription(data.getActivityDescription());
                            dsAdmin.addActivity(activity);
                            activity = dsAdmin.getActivityForActivityID(data.getActivityId());
                        }
                        activityMap.put(data.getActivityId(), activity);
                    }
                    messageDO.setActivityKeyId(activity.getActivityKeyId());
                } catch (BAMException e) {
                    log.error("Could not retrieve activity from DB ", e);
                }

                try {
                    MessageDO msg = dsAdmin.getMessage(data.getMessageId(), messageDO.getOperationId(), messageDO
                            .getActivityKeyId());
                    if (msg != null) {
                        messageDO.setMessageKeyId(msg.getMessageKeyId());
                    } else {
                        dsAdmin.addMessageData(messageDO);
                        if (log.isDebugEnabled()) {
                            log.debug("Message is saved");
                        }
                    }
                } catch (BAMException e) {
                    log.error("Error updating Message statistics data for server " + data.getServerName() + " service "
                              + data.getServiceName() + " operation " + data.getOperationName()
                              + " from eventing message receiver " + e.getLocalizedMessage());
                }
            } else {
                messageFaultReason = "Required element is empty ;\n Service :" + data.getServiceName()
                                     + "\n Operation:" + data.getOperationName() + "\n ActivityID:" + data.getActivityId();
            }
        } else {
            messageFaultReason = "Required element is null ;\n Service :" + data.getServiceName() + "\n Operation:"
                                 + data.getOperationName() + "\n ActivityID:" + data.getActivityId();
        }
    }

    /**
     * Store Activity
     *
     * @param data    Event data
     * @param dsAdmin Data service access
     */
    private void storeActivity(ActivityData data, BAMDataServiceAdmin dsAdmin) {

        ActivityDO activityDO;

        if (data.getActivityId() != null) {
            if (!data.getActivityId().equals("")) {
                activityDO = new ActivityDO(data.getActivityId(), data.getActivityName(), data.getActivityDescription());
                ActivityDO act;

                try {
                    act = dsAdmin.getActivityForActivityID(data.getActivityId());
                    if (act != null) {
                        //NOTE: Activity name & description never get changed. Hence no need to call update
                        //method
                        //TODO: if this update method is needed, implement dirty pattern first to check if the
                        //record in the database really needs to be updated.

                        //    dsAdmin.updateActivity(data.getActivityName(), data.getActivityDescription(),
                        //            act.getActivityKeyId());
                    } else {
                        try {
                            dsAdmin.addActivityData(activityDO);
                            if (log.isDebugEnabled()) {
                                log.debug("Activity is saved");
                            }
                            // After adding to the DB set the activityKeyID.
                            act = dsAdmin.getActivityForActivityID(data.getActivityId());
                        } catch (Exception ignore) {
                            log.error("Recovered successfully from race condition - trying to add the same"
                                      + " activity from two events.");
                        }
                    }
                    activityDO.setActivityKeyId(act.getActivityKeyId());
                } catch (Exception e) {
                    log.error("Couldn't add activity  : ", e);
                }
            }
        }
    }

    /**
     * Process activity event
     *
     * @param activityElement Activity data root element
     * @return Event data encapsulated in ActivityData bean
     */

    private ActivityData processActivityElement(OMElement activityElement) {
        String activityId;
        String messageId;
        String operationName;
        String serverName;
        String serviceName;
        String activityName;
        String activityDescription;
        String userAgent;
        String remoteIPAddress;
        String messageDirection;
        String messageBody;
        String timeStamp;
        String requestMessageStatus;
        String responseMessageStatus;
        String outMessageID;

        Map<PropertyFilterData, String> xpathEvaluations = new HashMap<PropertyFilterData, String>();
        Map<String, String> activityProperties = new HashMap<String, String>();

        ActivityData data = new ActivityData();
        if (activityElement != null) {

            serverName = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                               ActivityConstants.ACTIVITY_ELEMENT_SERVER_NAME), activityElement);

            messageId = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                              ActivityConstants.MESSAGE_ID), activityElement);

            activityId = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                               ActivityConstants.ACTIVITY_ID_STATISTICS_DATA), activityElement);

            activityName = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                 ActivityConstants.ACTIVITY_ELEMENT_ACTIVITY_NAME), activityElement);

            activityDescription = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                        ActivityConstants.ACTIVITY_ELEMENT_ACTIVITY_DESCRIPTION), activityElement);

            remoteIPAddress = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                    ActivityConstants.ACTIVITY_ELEMENT_REMOTE_IP_ADDRESS), activityElement);

            userAgent = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                              ActivityConstants.ACTIVITY_ELEMENT_USER_AGENT), activityElement);

            serviceName = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                ActivityConstants.ACTIVITY_ELEMENT_SERVICE_NAME), activityElement);

            operationName = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                  ActivityConstants.ACTIVITY_ELEMENT_OPERATION_NAME), activityElement);

            messageDirection = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                     ActivityConstants.ACTIVITY_ELEMENT_MESSAGE_DIRECTION), activityElement);

            messageBody = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                ActivityConstants.ACTIVITY_ELEMENT_MESSAGE_BODY), activityElement);

            timeStamp = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                              ActivityConstants.ACTIVITY_ELEMENT_TIMESTAMP), activityElement);

            OMElement xpathExpressions = activityElement.getFirstChildWithName(new QName(
                    ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.ACTIVITY_ELEMENT_XPATH_EXPRESSIONS));

            if (xpathExpressions != null) {
                Iterator xpathExpressionItr = xpathExpressions.getChildrenWithName(
                        new QName(ActivityConstants.ACTIVITY_NS_URI,
                                  ActivityConstants.ACTIVITY_ELEMENT_XPATH_EXPRESSION));

                while (xpathExpressionItr.hasNext()) {
                    OMElement xpathExpression = (OMElement) xpathExpressionItr.next();
                    String expressionKey = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                                 ActivityConstants.XPATH_EXPRESSION_KEY), xpathExpression);

                    String xpath = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                         ActivityConstants.ACTIVITY_XPATH_EXPRESSION), xpathExpression);

                    String alias = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                         ActivityConstants.PROPERTY_FILTER_ALIAS), xpathExpression);

                    OMElement namespaces = activityElement.getFirstChildWithName(new QName(
                            ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.PROPERTY_FILTER_NAMESPACES));

                    List<String> nsList = new ArrayList<String>();
                    if (namespaces != null) {
                        Iterator namespaceItr = xpathExpressions.getChildrenWithName(
                                new QName(ActivityConstants.ACTIVITY_NS_URI,
                                          ActivityConstants.PROPERTY_FILTER_NAMESPACE));


                        while (namespaceItr.hasNext()) {
                            OMElement namespace = (OMElement) namespaceItr.next();
                            String ns = namespace.getText();
                            nsList.add(ns);
                        }
                    }

                    PropertyFilterData propertyFilterData = new PropertyFilterData();
                    propertyFilterData.setServerName(serverName);
                    propertyFilterData.setExpressionKey(expressionKey);
                    propertyFilterData.setExpression(xpath);
                    propertyFilterData.setAlias(alias);
                    propertyFilterData.setNamespaces(nsList.toArray(new String[nsList.size()]));

                    String xpathValue = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                              ActivityConstants.XPATH_VALUE), xpathExpression);
                    xpathEvaluations.put(propertyFilterData, xpathValue);

                }
            }

            OMElement properties = activityElement.getFirstChildWithName(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                                   ActivityConstants.ACTIVITY_ELEMENT_PROPERTIES));
            if (properties != null) {
                Iterator<OMElement> propertiesItr = properties.getChildrenWithName(new QName(
                        ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.ACTIVITY_ELEMENT_PROPERTY));

                while (propertiesItr.hasNext()) {
                    OMElement property = propertiesItr.next();
                    String propertyChild = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                                 ActivityConstants.ACTIVITY_ELEMENT_PROPERTY_CHILD), property);

                    String propertyChildValue = getDataWithQNameFromElement(new QName(
                            ActivityConstants.ACTIVITY_NS_URI,
                            ActivityConstants.ACTIVITY_ELEMENT_PROPERTY_VALUE), property);

                    activityProperties.put(propertyChild, propertyChildValue);
                }
            }

            outMessageID = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                 ActivityConstants.ACTIVITY_OUT_MESSAGE_ID), activityElement);

            requestMessageStatus = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                         ActivityConstants.ACTIVITY_REQUEST_MESSAGE_STATUS), activityElement);

            responseMessageStatus = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                          ActivityConstants.ACTIVITY_RESPONSE_MESSAGE_STATUS), activityElement);

            if (requestMessageStatus != null) {
                if (requestMessageStatus.equals("0")) {
                    requestMessageStatus = "SUCCESS MESSAGE";
                }
                if (requestMessageStatus.equals("1")) {
                    requestMessageStatus = "FAULTY MESSAGE";
                }
                if (requestMessageStatus.equals("-1")) {
                    requestMessageStatus = "UNDEFINED STATUS";
                }
            }

            if (responseMessageStatus != null) {
                if (responseMessageStatus.equals("0")) {
                    responseMessageStatus = "SUCCESS MESSAGE";
                }
                if (responseMessageStatus.equals("1")) {
                    responseMessageStatus = "FAULTY MESSAGE";
                }
                if (responseMessageStatus.equals("-1")) {
                    responseMessageStatus = "UNDEFINED STATUS";
                }
            }
            data.setServerName(serverName);
            data.setServiceName(serviceName);
            data.setOperationName(operationName);
            data.setMessageId(messageId);
            data.setActivityId(activityId);
            data.setActivityName(activityName);
            data.setActivityDescription(activityDescription);
            data.setUserAgent(userAgent);
            data.setRemoteIPAddress(remoteIPAddress);
            data.setTimeStamp(timeStamp);
            data.setMessageDirection(messageDirection);
            data.setMessageBody(messageBody);
            data.setXPathEvaluations(xpathEvaluations);
            data.setRequestMessageStatus(requestMessageStatus);
            data.setResponseMessageStatus(responseMessageStatus);
            data.setOutMessageID(outMessageID);
            data.setProperties(activityProperties);
        }

        return data;
    }

/*
    private PropertyFilterData processPropertyFilterElement(OMElement propertyFilterElement) {
        String serverName;
        String expressionKey = null;
        String alias = null;
        String expression = null;
        String[] namespaces = null;

        PropertyFilterData data = new PropertyFilterData();
        if (propertyFilterElement != null) {
            serverName = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                               ActivityConstants.ACTIVITY_ELEMENT_SERVER_NAME), propertyFilterElement);

            OMElement xpathExpressionsElement = propertyFilterElement.getFirstChildWithName(new QName(
                    ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.PROPERTY_FILTER_XPATH_EXPRESSIONS));

            if (xpathExpressionsElement != null) {
                OMElement xpathExpressionElement = xpathExpressionsElement.getFirstChildWithName(new QName(
                        ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.PROPERTY_FILTER_XPATH_EXPRESSION));

                if (xpathExpressionElement != null) {
                    expressionKey = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                          ActivityConstants.PROPERTY_FILTER_EXPRESSION_KEY), xpathExpressionElement);

                    alias = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                  ActivityConstants.PROPERTY_FILTER_ALIAS), xpathExpressionElement);

                    expression = getDataWithQNameFromElement(new QName(ActivityConstants.ACTIVITY_NS_URI,
                                                                       ActivityConstants.PROPERTY_FILTER_EXPRESSION), xpathExpressionElement);

                    OMElement namespacesElement = xpathExpressionElement.getFirstChildWithName(new QName(
                            ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.PROPERTY_FILTER_NAMESPACES));

                    if (namespacesElement != null) {
                        Iterator iterator = namespacesElement.getChildrenWithName(new QName(
                                ActivityConstants.ACTIVITY_NS_URI, ActivityConstants.PROPERTY_FILTER_NAMESPACE));

                        ArrayList<String> namespacesList = new ArrayList<String>();
                        while (iterator != null && iterator.hasNext()) {
                            OMElement namespaceElement = (OMElement) iterator.next();

                            if (namespaceElement != null) {
                                namespacesList.add(namespaceElement.getText());
                            }
                        }

                        namespaces = namespacesList.toArray(new String[namespacesList.size()]);
                    }
                }
            }

            data.setServerName(serverName);
            data.setAlias(alias);
            data.setExpression(expression);
            data.setExpressionKey(expressionKey);
            data.setNamespaces(namespaces);

            return data;
        }

        return null;

    }
*/

    private String getDataWithQNameFromElement(QName qName, OMElement element) {
        OMElement dataElement = element.getFirstChildWithName(qName);

        String value = null;
        if (dataElement != null) {
            value = dataElement.getText();
        }
        return value;
    }

    /*
     * Store message Body+timestamp details @ DB
     */

    private void storeMessageData(ActivityData data, BAMDataServiceAdmin dsAdmin) {
        if (data.getServiceName() != null && data.getOperationName() != null && data.getActivityId() != null) {
            if (!data.getOperationName().equals("") && !data.getServiceName().equals("")
                && !data.getActivityId().equals("")) {

                ServiceDO service;
                OperationDO operation;
                ActivityDO activity;
                MessageDataDO messageDataDO;

                if (data.getTimeStamp() != null) {
                    messageDataDO = new MessageDataDO(data.getTimeStamp(), data.getRemoteIPAddress(), data
                            .getMessageDirection(), data.getMessageBody(), data.getRequestMessageStatus(), data
                            .getResponseMessageStatus());

                } else {
                    messageDataDO = new MessageDataDO(
                            BAMCalendar.getInstance(Calendar.getInstance()).getBAMTimestamp(),
                            data.getRemoteIPAddress(), data.getMessageDirection(), data.getMessageBody(),
                            data.getRequestMessageStatus(), data.getResponseMessageStatus());
                }

                // When first time message comes to a system, service, operation
                // need to be
                // added.
                try {
                    ServerDO serverDO = dsAdmin.getServer(data.getServerName());
                    if (serverDO != null) {
                        int serverId = serverDO.getId();
                        messageDataDO.setServerId(serverId);
                    } else {
                        log.error("Server is not in the Database" + data.getServerName());
                    }
                } catch (BAMException e) {
                    log.error("Could not retrieve server from DB ", e);
                }

                try {
                    if (dsAdmin.getService(messageDataDO.getServerId(), data.getServiceName()) == null) {
                        service = new ServiceDO();

                        ServerDO serverDO = dsAdmin.getServer(data.getServerName());
                        if (serverDO != null) {
                            int serverId = serverDO.getId();
                            service.setServerID(serverId);
                            service.setName(data.getServiceName());
                            dsAdmin.addService(service);
                            messageDataDO.setServiceId(dsAdmin.getService(messageDataDO.getServerId(),
                                                                          data.getServiceName()).getId());
                        }

                    } else {
                        messageDataDO.setServiceId(dsAdmin.getService(messageDataDO.getServerId(),
                                                                      data.getServiceName()).getId());
                    }
                } catch (BAMException e) {
                    log.error("Could not retrieve service from DB ", e);
                }

                try {
                    if (dsAdmin.getOperation(messageDataDO.getServiceId(), data.getOperationName()) == null) {
                        operation = new OperationDO();
                        ServiceDO serviceDO = dsAdmin.getService(messageDataDO.getServerId(), data.getServiceName());
                        if (serviceDO != null) {
                            operation.setServiceID(serviceDO.getId());
                            operation.setName(data.getOperationName());
                            dsAdmin.addOperation(operation);
                            messageDataDO.setOperationId(dsAdmin.getOperation(messageDataDO.getServiceId(),
                                                                              data.getOperationName()).getOperationID());
                        } else {
                            serviceDO = new ServiceDO();
                            serviceDO.setServerID(messageDataDO.getServerId());
                            serviceDO.setName(data.getServiceName());
                            dsAdmin.addService(serviceDO);

                            messageDataDO.setServiceId(dsAdmin.getService(messageDataDO.getServerId(),
                                                                          data.getServiceName()).getId());

                            operation.setServiceID(messageDataDO.getServiceId());
                            operation.setName(data.getOperationName());
                            dsAdmin.addOperation(operation);

                            messageDataDO.setOperationId(dsAdmin.getOperation(messageDataDO.getServiceId(),
                                                                              data.getOperationName()).getOperationID());

                        }
                    } else {
                        messageDataDO.setOperationId(dsAdmin.getOperation(messageDataDO.getServiceId(),
                                                                          data.getOperationName()).getOperationID());
                    }
                } catch (BAMException e) {
                    log.error("Could not retrieve operation from DB ", e);
                }

                checkForActivityExistense(data, dsAdmin, messageDataDO);

                try {
                    MessageDO msg = dsAdmin.getMessage(data.getMessageId(), messageDataDO.getOperationId(),
                                                       messageDataDO.getActivityKeyId());
                    if (msg != null) {
                        messageDataDO.setMessageKeyId(msg.getMessageKeyId());
                    } else {
                        MessageDO mesg = new MessageDO();
                        mesg.setMessageId(data.getMessageId());
                        mesg.setActivityKeyId(messageDataDO.getActivityKeyId());
                        mesg.setOperationId(messageDataDO.getOperationId());
                        mesg.setTimestamp(data.getTimeStamp());
                        mesg.setIPAddress(data.getRemoteIPAddress());
                        mesg.setUserAgent(data.getUserAgent());

                        //TODO: Data Services supports returning the ID
                        dsAdmin.addMessage(mesg);
                        messageDataDO.setMessageKeyId(dsAdmin.getMessage(data.getMessageId(),
                                                                         messageDataDO.getOperationId(),
                                                                         messageDataDO.getActivityKeyId())
                                .getMessageKeyId());
                    }
                } catch (BAMException e) {
                    log.error("Error updating Message statistics data for server " + data.getServerName() + " service "
                              + data.getServiceName() + " operation " + data.getOperationName()
                              + " from eventing message receiver " + e.getLocalizedMessage());
                }

                // store to the BAM MessageData table
                try {
                    MessageDataDO msgDat = dsAdmin.getMessageDataForActivityKeyIDandMessageKeyID(
                            messageDataDO.getMessageKeyId(), messageDataDO.getActivityKeyId());
                    if (msgDat != null) {
                        messageDataDO.setMessageDataKeyId(msgDat.getMessageDataKeyId());
//                        dsAdmin.updateMessageDump(data.getMessageBody(), data.getMessageDirection(),
//                                data.getRemoteIPAddress(), msgDat.getMessageDataKeyId());
                    } else {
                        if (data.getMessageDirection() != null) {
                            dsAdmin.addMessageDataDump(messageDataDO, data.getMessageDirection());
                            messageDataDO.setMessageDataKeyId(dsAdmin.getMessageDataForActivityKeyIDandMessageKeyID(
                                    messageDataDO.getMessageKeyId(), messageDataDO.getActivityKeyId())
                                                                      .getMessageDataKeyId());
                        }
                        if (log.isDebugEnabled()) {
                            log.debug("Message Data is saved");
                        }
                    }
                } catch (BAMException e) {
                    log.error("Could not dump the full message to DB", e);
                }

            } else {
                messageFaultReason = "Required element is empty ;\n Service :" + data.getServiceName()
                                     + "\n Operation :" + data.getOperationName() + "\n ActivityID :" + data.getActivityId();
            }
        } else {
            messageFaultReason = "Required element is null ; \n Service :" + data.getServiceName() + "\n Operation :"
                                 + data.getOperationName() + "\n ActivityID :" + data.getActivityId();
        }
    }

    // store status

    private void storeMessageStatusData(ActivityData data,
                                        BAMDataServiceAdmin dsAdmin) {
        if (data.getServiceName() != null && data.getOperationName() != null && data.getActivityId() != null) {
            if (!data.getOperationName().equals("") && !data.getServiceName().equals("")
                && !data.getActivityId().equals("")) {

                ServiceDO service;
                OperationDO operation;
                ActivityDO activity;
                MessageDataDO messageDataDO;

                if (data.getTimeStamp() != null) {
                    if (data.getTimeStamp().equals("")) {
                        messageDataDO = new MessageDataDO(BAMCalendar.getInstance(Calendar.getInstance())
                                .getBAMTimestamp(), data.getRemoteIPAddress(), data.getMessageDirection(),
                                                          data.getMessageBody(), data.getRequestMessageStatus(),
                                                          data.getResponseMessageStatus());
                    } else {
                        messageDataDO = new MessageDataDO(data.getTimeStamp(), data.getRemoteIPAddress(),
                                                          data.getMessageDirection(), data.getMessageBody(),
                                                          data.getRequestMessageStatus(), data.getResponseMessageStatus());
                    }
                } else {
                    messageDataDO = new MessageDataDO(
                            BAMCalendar.getInstance(Calendar.getInstance()).getBAMTimestamp(),
                            data.getRemoteIPAddress(), data.getMessageDirection(), data.getMessageBody(),
                            data.getRequestMessageStatus(), data.getResponseMessageStatus());
                }

                // When first time message comes to a system, service, operation
                // need to be
                // added.
                try {
                    ServerDO serverDO = dsAdmin.getServer(data.getServerName());
                    if (serverDO != null) {
                        messageDataDO.setServerId(serverDO.getId());
                    } else {
                        log.error("Server is not in the Database" + data.getServerName());
                    }
                } catch (BAMException e) {
                    log.error("Could not retrieve server from DB ", e);
                }
                try {
                    if (dsAdmin.getService(messageDataDO.getServerId(), data.getServiceName()) == null) {
                        service = new ServiceDO();
                        ServerDO serverDO = dsAdmin.getServer(data.getServerName());
                        if (serverDO != null) {
                            service.setServerID(serverDO.getId());
                            service.setName(data.getServiceName());
                            dsAdmin.addService(service);
                            messageDataDO.setServiceId(dsAdmin.getService(messageDataDO.getServerId(),
                                                                          data.getServiceName()).getId());
                        }

                    } else {
                        messageDataDO.setServiceId(dsAdmin.getService(messageDataDO.getServerId(),
                                                                      data.getServiceName()).getId());
                    }
                } catch (BAMException e) {
                    log.error("Could not retrieve service from DB ", e);
                }
                try {
                    if (dsAdmin.getOperation(messageDataDO.getServiceId(), data.getOperationName()) == null) {
                        operation = new OperationDO();
                        ServiceDO serviceDO = dsAdmin.getService(messageDataDO.getServerId(), data.getServiceName());
                        if (serviceDO != null) {
                            operation.setServiceID(serviceDO.getId());
                            operation.setName(data.getOperationName());
                            dsAdmin.addOperation(operation);
                            messageDataDO.setOperationId(dsAdmin.getOperation(messageDataDO.getServiceId(),
                                                                              data.getOperationName()).getOperationID());
                        } else {
                            serviceDO = new ServiceDO();
                            serviceDO.setServerID(messageDataDO.getServerId());
                            serviceDO.setName(data.getServiceName());
                            dsAdmin.addService(serviceDO);

                            messageDataDO.setServiceId(dsAdmin.getService(messageDataDO.getServerId(),
                                                                          data.getServiceName()).getId());

                            operation.setServiceID(messageDataDO.getServiceId());
                            operation.setName(data.getOperationName());
                            dsAdmin.addOperation(operation);

                            messageDataDO.setOperationId(dsAdmin.getOperation(messageDataDO.getServiceId(),
                                                                              data.getOperationName()).getOperationID());
                        }
                    } else {
                        messageDataDO.setOperationId(dsAdmin.getOperation(messageDataDO.getServiceId(),
                                                                          data.getOperationName()).getOperationID());
                    }
                } catch (BAMException e) {
                    log.error("Could not retrieve operation from DB ", e);
                }
                checkForActivityExistense(data, dsAdmin, messageDataDO);
                // this is for mediation observer event(it publishes
                // req+response @ single
                // event)
                try {
                    MessageDO inMsg = dsAdmin.getMessage(data.getMessageId(), messageDataDO.getOperationId(),
                                                         messageDataDO.getActivityKeyId());
                    if (inMsg != null) {
                        messageDataDO.setMessageKeyId(inMsg.getMessageKeyId());
                    } else {
                        MessageDO mesg_in = new MessageDO();
                        mesg_in.setMessageId(data.getMessageId());
                        mesg_in.setActivityKeyId(messageDataDO.getActivityKeyId());
                        mesg_in.setOperationId(messageDataDO.getOperationId());
                        mesg_in.setTimestamp(data.getTimeStamp());
                        mesg_in.setIPAddress(data.getRemoteIPAddress());
                        mesg_in.setUserAgent(data.getUserAgent());

                        //TODO: Data Services supports returning the ID
                        dsAdmin.addMessage(mesg_in);
                        messageDataDO.setMessageKeyId(dsAdmin.getMessage(data.getMessageId(),
                                                                         messageDataDO.getOperationId(),
                                                                         messageDataDO.getActivityKeyId())
                                .getMessageKeyId());
                    }
                } catch (BAMException e) {
                    log.error("Error updating Message statistics data for server " + data.getServerName() + " service "
                              + data.getServiceName() + " operation " + data.getOperationName()
                              + " from eventing message receiver " + e.getLocalizedMessage());
                }
                // store to the BAM MessageData table
                try {
                    MessageDataDO msgDat_in = dsAdmin.getMessageDataForActivityKeyIDandMessageKeyID(
                            messageDataDO.getMessageKeyId(), messageDataDO.getActivityKeyId());
                    if (msgDat_in != null) {
                        messageDataDO.setMessageDataKeyId(msgDat_in.getMessageDataKeyId());
                        dsAdmin.updateMessageStatus(data.getRequestMessageStatus(), msgDat_in.getMessageDataKeyId());
                    } else {
                        String direction = "Request";
                        dsAdmin.addMessageDataDump(messageDataDO, direction);
                    }
                } catch (BAMException e) {
                    log.error("Could not dump the full message to DB", e);
                }
                try {
                    String out_msg_id = data.getOutMessageID();
                    if (out_msg_id != null && !"".equals(out_msg_id)) {
                        MessageDO outMsg = dsAdmin.getMessage(data.getOutMessageID(), messageDataDO.getOperationId(),
                                                              messageDataDO.getActivityKeyId());
                        if (outMsg != null) {
                            messageDataDO.setMessageKeyId(outMsg.getMessageKeyId());
                        } else {
                            MessageDO mesg_out = new MessageDO();
                            mesg_out.setMessageId(data.getOutMessageID());
                            mesg_out.setActivityKeyId(messageDataDO.getActivityKeyId());
                            mesg_out.setOperationId(messageDataDO.getOperationId());
                            mesg_out.setTimestamp(data.getTimeStamp());
                            mesg_out.setIPAddress(data.getRemoteIPAddress());
                            mesg_out.setUserAgent(data.getUserAgent());

                            //TODO: Data Services supports returning the ID
                            dsAdmin.addMessage(mesg_out);
                            messageDataDO.setMessageKeyId(dsAdmin.getMessage(data.getOutMessageID(),
                                                                             messageDataDO.getOperationId(),
                                                                             messageDataDO.getActivityKeyId())
                                    .getMessageKeyId());
                        }
                    }

                } catch (BAMException e) {
                    log.error("Error updating Message statistics data for server " + data.getServerName() + " service "
                              + data.getServiceName() + " operation " + data.getOperationName()
                              + " from eventing message receiver " + e.getLocalizedMessage());
                }
                // store to the BAM MessageData table
                try {
                    MessageDataDO msgDat_out = dsAdmin.getMessageDataForActivityKeyIDandMessageKeyID(
                            messageDataDO.getMessageKeyId(), messageDataDO.getActivityKeyId());
                    if (msgDat_out != null) {
                        messageDataDO.setMessageDataKeyId(msgDat_out.getMessageDataKeyId());
                        dsAdmin.updateMessageStatus(data.getResponseMessageStatus(), msgDat_out.getMessageDataKeyId());
                    } else {
                        String direction = "Response";
                        dsAdmin.addMessageDataDump(messageDataDO, direction);
                    }
                } catch (BAMException e) {
                    log.error("Could not dump the full message to DB", e);
                }
            } else {
                messageFaultReason = "Required element is empty ; \n Service :" + data.getServiceName()
                                     + "\n Operation:" + data.getOperationName() + "\n ActivityID:" + data.getActivityId();
            }
        } else {
            messageFaultReason = "Required element is null ; \n Service :" + data.getServiceName() + "\n Operation:"
                                 + data.getOperationName() + "\n ActivityID:" + data.getActivityId();
        }
    }

    /**
     * @param data
     * @param dsAdmin
     * @param messageDataDO
     */
    private void checkForActivityExistense(ActivityData data,
                                           BAMDataServiceAdmin dsAdmin,
                                           MessageDataDO messageDataDO) {
        ActivityDO activity = null;
        try {
            if (activityMap.containsKey(data.getActivityId())) {
                activity = activityMap.get(data.getActivityId());
            } else {
                if (dsAdmin.getActivityForActivityID(data.getActivityId()) == null) {
                    activity = new ActivityDO();
                    activity.setActivityId(data.getActivityId());
                    activity.setName(data.getActivityName());
                    activity.setDescription(data.getActivityDescription());
                    dsAdmin.addActivity(activity);
                }
                activity = dsAdmin.getActivityForActivityID(data.getActivityId());
                activityMap.put(activity.getActivityId(), activity);
            }
            messageDataDO.setActivityKeyId((activity.getActivityKeyId()));
        } catch (BAMException e) {
            log.error("Could not retrieve activity from DB ", e);
        }
    }

    /**
     * Store activity properties+xpath values
     *
     * @param data    Event data
     * @param dsAdmin Data service access
     */
    private void storeProperties(ActivityData data, BAMDataServiceAdmin dsAdmin) {
        if (data.getServiceName() != null && data.getOperationName() != null && data.getActivityId() != null) {
            if (!data.getOperationName().equals("") && !data.getServiceName().equals("")
                && !data.getActivityId().equals("")) {

                if (data.getProperties() != null && data.getProperties().size() > 0) {
                    MessagePropertyDO messagePropertyDO;
                    String dbtime = null; //need to check the timestamp of the different events

                    messagePropertyDO = new MessagePropertyDO();

                    ServerDO serverDO = null;
                    try {
                        if (serverMap.containsKey(data.getServerName())) {
                            serverDO = serverMap.get(data.getServerName());
                        } else {
                            serverDO = dsAdmin.getServer(data.getServerName());
                            if (serverDO == null) {
                                log.error("Server is not in the Database " + data.getServerName());
                                return;
                            } else {
                                serverMap.put(data.getServerName(), serverDO);
                            }
                        }
                        messagePropertyDO.setServerId(serverDO.getId());
                    } catch (BAMException e) {
                        log.error("Could not retrieve server from DB ", e);
                    }

                    ServiceDO serviceDO = null;
                    try {
                        String key = messagePropertyDO.getServerId() + "-" + data.getServiceName();
                        if (serviceMap.containsKey(key)) {
                            serviceDO = serviceMap.get(key);
                        } else {
                            serviceDO = dsAdmin.getService(messagePropertyDO.getServerId(), data.getServiceName());
                            if (serviceDO == null) {
                                serviceDO = new ServiceDO();
                                serviceDO.setServerID(serverDO.getId());
                                serviceDO.setName(data.getServiceName());
                                dsAdmin.addService(serviceDO);
                                serviceDO = dsAdmin.getService(messagePropertyDO.getServerId(), data.getServiceName());
                            }
                            serviceMap.put(key, serviceDO);
                        }
                        messagePropertyDO.setServiceId(serviceDO.getId());
                    } catch (BAMException e) {
                        log.error("Could not retrieve service from DB ", e);
                    }

                    OperationDO operationDO = null;
                    try {
                        String key = messagePropertyDO.getServiceId() + "-" + data.getOperationName();
                        if (operationMap.containsKey(key)) {
                            operationDO = operationMap.get(key);
                        } else {
                            operationDO = dsAdmin.getOperation(messagePropertyDO.getServiceId(), data.getOperationName());
                            if (operationDO == null) {
                                operationDO = new OperationDO();
                                operationDO.setServiceID(serviceDO.getId());
                                operationDO.setName(data.getOperationName());
                                dsAdmin.addOperation(operationDO);
                                operationDO = dsAdmin.getOperation(messagePropertyDO.getServiceId(), data.getOperationName());
                            }
                            operationMap.put(key, operationDO);
                        }
                        messagePropertyDO.setOperationId(operationDO.getOperationID());

                    } catch (BAMException e) {
                        log.error("Could not retrieve operation from DB ", e);
                    }

                    ActivityDO activity = null;
                    try {
                        if (activityMap.containsKey(data.getActivityId())) {
                            activity = activityMap.get(data.getActivityId());
                        } else {
                            activity = dsAdmin.getActivityForActivityID(data.getActivityId());
                            if (activity == null) {
                                activity = new ActivityDO();
                                activity.setActivityId(data.getActivityId());
                                activity.setName(data.getActivityName());
                                activity.setDescription(data.getActivityDescription());
                                dsAdmin.addActivity(activity);
                                activity = dsAdmin.getActivityForActivityID(data.getActivityId());
                            }
                            activityMap.put(data.getActivityId(), activity);
                        }
                        messagePropertyDO.setActivityKeyId(activity.getActivityKeyId());
                    } catch (BAMException e) {
                        log.error("Could not retrieve activity from DB ", e);
                    }

                    try {
                        MessageDO msg = dsAdmin.getMessage(data.getMessageId(), messagePropertyDO
                                .getOperationId(), messagePropertyDO.getActivityKeyId());
                        if (msg != null) {
                            return; // If message is already present avoid adding duplicate messages
                        } else {
                            MessageDO mesg = new MessageDO();
                            if (activity != null) {
                                mesg.setMessageId(data.getMessageId());
                                mesg.setActivityKeyId(messagePropertyDO.getActivityKeyId());
                                mesg.setOperationId(messagePropertyDO.getOperationId());
                                mesg.setTimestamp(data.getTimeStamp());
                                mesg.setIPAddress(data.getRemoteIPAddress());
                                mesg.setUserAgent(data.getUserAgent());

                                //TODO: Data Services supports returning the ID
                                dsAdmin.addMessage(mesg);
                                messagePropertyDO.setMessageKeyId(dsAdmin.getMessage(
                                        data.getMessageId(),
                                        messagePropertyDO
                                                .getOperationId(),
                                        messagePropertyDO
                                                .getActivityKeyId())
                                        .getMessageKeyId());
                                dbtime = data.getTimeStamp();
                            }

                        }
                    } catch (BAMException e) {
                        log.error("Could not retrieve message from DB", e);
                    }

                    try {
                        // MessagePropertyDO property = dsAdmin.getPropertyofMessage(
                        // messagePropertyDO.getMessageKeyId(),
                        // messagePropertyDO.getActivityKeyId(), messagePropertyDO.getKey());
                        // if (property == null) {

                        // process properties and get arraylist out of it
                        Map<String, String> propertyList = new HashMap<String, String>();
                        for (String actProperty : data.getProperties().keySet()) {
                            propertyList.put(actProperty, data.getProperties().get(actProperty));
                        }
                        ArrayList<String> keyList = new ArrayList<String>();
                        ArrayList<String> valueList = new ArrayList<String>();
                        Set<String> keys = propertyList.keySet();
                        for (Iterator i = keys.iterator(); i.hasNext();) {
                            String key = (String) i.next();
                            String value = propertyList.get(key);
                            keyList.add(key);
                            valueList.add(value);
                        }
                        String valueArray[] = new String[keyList.size()];

                        String keyArray[] = new String[keyList.size()];
                        keyList.toArray(keyArray);
                        valueList.toArray(valueArray);
                        messagePropertyDO.setKeyArray(keyArray);
                        messagePropertyDO.setValueArray(valueArray);
                        dsAdmin.addMessageProperty(messagePropertyDO);

                        if (log.isDebugEnabled()) {
                            log.debug("Message Properties are saved");
                        }
                        // }
                    } catch (BAMException e) {
                        log.error("Could not add message property ", e);
                    }

                }
            }
        }
    }

    private void storeXPathProperties(ActivityData data, BAMDataServiceAdmin dsAdmin) {
        if (data.getServiceName() != null && data.getOperationName() != null && data.getActivityId() != null) {
            if (!data.getOperationName().equals("") && !data.getServiceName().equals("")
                && !data.getActivityId().equals("")) {

                if (data.getXPathEvaluations() != null) {
                    ServiceDO service;
                    OperationDO operation;
                    ActivityDO activity;


                    MessagePropertyDO messagePropertyDO = null;

                    messagePropertyDO = new MessagePropertyDO();
                    try {
                        ServerDO serverDO = dsAdmin.getServer(data.getServerName());
                        if (serverDO != null) {
                            messagePropertyDO.setServerId(serverDO.getId());
                        } else {
                            log.error("Server is not in the Database" + data.getServerName());
                        }
                    } catch (BAMException e) {
                        log.error("Could not retrieve server from DB ", e);
                    }

                    try {
                        if (dsAdmin.getService(messagePropertyDO.getServerId(), data.getServiceName()) == null) {
                            service = new ServiceDO();
                            ServerDO serverDO = dsAdmin.getServer(data.getServerName());
                            if (serverDO != null) {
                                service.setServerID(serverDO.getId());
                                service.setName(data.getServiceName());
                                dsAdmin.addService(service);
                                messagePropertyDO.setServiceId(dsAdmin.getService(messagePropertyDO.getServerId(),
                                                                                  data.getServiceName()).getId());
                            }

                        } else {
                            messagePropertyDO.setServiceId(dsAdmin.getService(messagePropertyDO.getServerId(),
                                                                              data.getServiceName()).getId());
                        }
                    } catch (BAMException e) {
                        log.error("Could not retrieve service from DB ", e);
                    }

                    try {
                        if (dsAdmin.getOperation(messagePropertyDO.getServiceId(), data.getOperationName()) == null) {
                            operation = new OperationDO();
                            ServiceDO serviceDO = dsAdmin.getService(messagePropertyDO.getServerId(),
                                                                     data.getServiceName());
                            if (serviceDO != null) {
                                operation.setServiceID(messagePropertyDO.getServiceId());
                                operation.setName(data.getOperationName());
                                dsAdmin.addOperation(operation);
                                messagePropertyDO.setOperationId(dsAdmin.getOperation(
                                        messagePropertyDO.getServiceId(), data.getOperationName())
                                        .getOperationID());
                            } else {
                                serviceDO = new ServiceDO();
                                serviceDO.setServerID(messagePropertyDO.getServerId());
                                serviceDO.setName(data.getServiceName());
                                dsAdmin.addService(serviceDO);

                                messagePropertyDO.setServiceId(dsAdmin.getService(messagePropertyDO.getServerId(),
                                                                                  data.getServiceName()).getId());

                                operation.setServiceID(messagePropertyDO.getServiceId());
                                operation.setName(data.getOperationName());
                                dsAdmin.addOperation(operation);

                                messagePropertyDO.setOperationId(dsAdmin.getOperation(
                                        messagePropertyDO.getServiceId(), data.getOperationName())
                                        .getOperationID());
                            }
                        } else {
                            messagePropertyDO.setOperationId(dsAdmin.getOperation(messagePropertyDO.getServiceId(),
                                                                                  data.getOperationName()).getOperationID());
                        }
                    } catch (BAMException e) {
                        log.error("Could not retrieve operation from DB ", e);
                    }

                    try {
                        if (dsAdmin.getActivityForActivityID(data.getActivityId()) == null) {
                            activity = new ActivityDO();
                            activity.setActivityId(data.getActivityId());
                            activity.setName(data.getActivityName());
                            activity.setDescription(data.getActivityDescription());
                            dsAdmin.addActivity(activity);
                            messagePropertyDO.setActivityKeyId(dsAdmin.getActivityForActivityID(
                                    data.getActivityId()).getActivityKeyId());
                        } else {
                            messagePropertyDO.setActivityKeyId(dsAdmin.getActivityForActivityID(
                                    data.getActivityId()).getActivityKeyId());
                        }
                    } catch (BAMException e) {
                        log.error("Could not retrieve activity from DB ", e);
                    }

                    try {
                        MessageDO msg = dsAdmin.getMessage(data.getMessageId(), messagePropertyDO.getOperationId(),
                                                           messagePropertyDO.getActivityKeyId());
                        if (msg != null) {
                            messagePropertyDO.setMessageKeyId(msg.getMessageKeyId());
                        } else {
                            MessageDO mesg = new MessageDO();
                            ActivityDO activityDO = dsAdmin.getActivityForActivityID(data.getActivityId());
                            if (activityDO != null) {
                                mesg.setMessageId(data.getMessageId());
                                mesg.setActivityKeyId(messagePropertyDO.getActivityKeyId());
                                mesg.setOperationId(messagePropertyDO.getOperationId());
                                // TODO timestamp fix
                                mesg.setTimestamp(BAMCalendar.getInstance(Calendar.getInstance()).getBAMTimestamp());
                                mesg.setIPAddress(data.getRemoteIPAddress());
                                mesg.setUserAgent(data.getUserAgent());

                                //TODO: Data Services supports returning the ID
                                dsAdmin.addMessage(mesg);
                                messagePropertyDO.setMessageKeyId(dsAdmin.getMessage(
                                        data.getMessageId(),
                                        messagePropertyDO
                                                .getOperationId(),
                                        messagePropertyDO
                                                .getActivityKeyId())
                                        .getMessageKeyId());
                            }

                        }
                    } catch (BAMException e) {
                        log.error("Could not retrieve message from DB", e);
                    }

                    try {
//                            MessagePropertyDO property = dsAdmin.getPropertyofMessage(
//                                    messagePropertyDO.getMessageKeyId(), messagePropertyDO.getActivityKeyId(),
//                                    messagePropertyDO.getKey());
//                            if (property == null) {
                        Map<String, String> propertyList = new HashMap<String, String>();
                        for (PropertyFilterData propertyFilterData : data.getXPathEvaluations().keySet()) {
                            propertyList.put(propertyFilterData.getExpressionKey(),
                                             data.getXPathEvaluations().get(propertyFilterData));
                        }
                        ArrayList<String> keyList = new ArrayList<String>();
                        ArrayList<String> valueList = new ArrayList<String>();
                        Set<String> keys = propertyList.keySet();
                        for (Iterator i = keys.iterator(); i.hasNext();) {
                            String key = (String) i.next();
                            String value = propertyList.get(key);
                            keyList.add(key);
                            valueList.add(value);
                        }
                        String valueArray[] = new String[keyList.size()];
                        String keyArray[] = new String[keyList.size()];
                        keyList.toArray(keyArray);
                        valueList.toArray(valueArray);
                        messagePropertyDO.setKeyArray(keyArray);
                        messagePropertyDO.setValueArray(valueArray);
                        dsAdmin.addMessageProperty(messagePropertyDO);
                        //   }
//                               else {
//                                messagePropertyDO.setMessagePropertyKeyId(property.getMessagePropertyKeyId());
//                            }
                    } catch (BAMException e) {
                        log.error("Could not add message property ", e);
                    }
                }

            }
        }
    }


    /**
     * Encapsulates event data relating to message tracing.
     */
    class ActivityData {

        private String activityId;
        private String messageId;
        private String operationName;
        private String serverName;
        private String serviceName;
        private String activityName;
        private String activityDescription;
        private String userAgent;
        private String remoteIPAddress;
        private String messageDirection;
        private String messageBody;
        private String timeStamp;
        private String requestMessageStatus;
        private String responseMessageStatus;
        private String outMessageID;

        private Map<String, String> properties;
        private Map<PropertyFilterData, String> xpathEvaluations;

        public String getActivityId() {
            return activityId;
        }

        public void setActivityId(String activityId) {
            this.activityId = activityId;
        }

        public String getMessageId() {
            return messageId;
        }

        public void setMessageId(String messageId) {
            this.messageId = messageId;
        }

        public String getOperationName() {
            return operationName;
        }

        public void setOperationName(String operationName) {
            this.operationName = operationName;
        }

        public String getServerName() {
            return serverName;
        }

        public void setServerName(String serverName) {
            this.serverName = serverName;
        }

        public String getServiceName() {
            return serviceName;
        }

        public void setServiceName(String serviceName) {
            this.serviceName = serviceName;
        }

        public String getActivityName() {
            return activityName;
        }

        public void setActivityName(String activityName) {
            this.activityName = activityName;
        }

        public String getActivityDescription() {
            return activityDescription;
        }

        public void setActivityDescription(String activityDescription) {
            this.activityDescription = activityDescription;
        }

        public String getUserAgent() {
            return userAgent;
        }

        public void setUserAgent(String userAgent) {
            this.userAgent = userAgent;
        }

        public String getRemoteIPAddress() {
            return remoteIPAddress;
        }

        public void setRemoteIPAddress(String remoteIPAddress) {
            this.remoteIPAddress = remoteIPAddress;
        }

        public String getMessageDirection() {
            return messageDirection;
        }

        public void setMessageDirection(String messageDirection) {
            this.messageDirection = messageDirection;
        }

        public String getMessageBody() {
            return messageBody;
        }

        public void setMessageBody(String messageBody) {
            this.messageBody = messageBody;
        }

        public String getTimeStamp() {
            return timeStamp;
        }

        public void setTimeStamp(String timeStamp) {
            this.timeStamp = timeStamp;
        }

        public Map<PropertyFilterData, String> getXPathEvaluations() {
            return xpathEvaluations;
        }

        public void setXPathEvaluations(Map<PropertyFilterData, String> xpathEvaluations) {
            this.xpathEvaluations = xpathEvaluations;
        }

        public String getRequestMessageStatus() {
            return requestMessageStatus;
        }

        public void setRequestMessageStatus(String requestMessageStatus) {
            this.requestMessageStatus = requestMessageStatus;
        }

        public String getResponseMessageStatus() {
            return responseMessageStatus;
        }

        public void setResponseMessageStatus(String responseMessageStatus) {
            this.responseMessageStatus = responseMessageStatus;
        }

        public String getOutMessageID() {
            return outMessageID;
        }

        public void setOutMessageID(String outMessageID) {
            this.outMessageID = outMessageID;
        }

        public void setProperties(Map<String, String> properties) {
            this.properties = properties;
        }

        public Map<String, String> getProperties() {
            return properties;
        }
    }

    /**
     * Encapsulates event data relating to message tracing.
     */
    class PropertyFilterData {
        private String serverName;
        private String expressionKey;
        private String alias;
        private String expression;
        private String[] namespaces;


        public String getExpressionKey() {
            return expressionKey;
        }

        public void setExpressionKey(String expressionKey) {
            this.expressionKey = expressionKey;
        }

        public String getAlias() {
            return alias;
        }

        public void setAlias(String alias) {
            this.alias = alias;
        }

        public String getExpression() {
            return expression;
        }

        public void setExpression(String expression) {
            this.expression = expression;
        }

        public String[] getNamespaces() {
            return namespaces;
        }

        public void setNamespaces(String[] namespaces) {
            this.namespaces = namespaces;
        }

        public String getServerName() {
            return serverName;
        }

        public void setServerName(String serverName) {
            this.serverName = serverName;
        }
    }

}
TOP

Related Classes of org.wso2.carbon.bam.core.receivers.ActivityMessageReceiver

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.