Package org.wso2.carbon.tracer.service

Source Code of org.wso2.carbon.tracer.service.TracerAdmin

/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.tracer.service;

import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.AxisModule;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.util.Loader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.core.AbstractAdmin;
import org.wso2.carbon.tracer.TracerConstants;
import org.wso2.carbon.tracer.module.MemoryBasedTracePersister;
import org.wso2.carbon.tracer.module.TracePersister;
import org.wso2.carbon.logging.appenders.CircularBuffer;

import java.util.ArrayList;
import java.util.Collections;

/**
*
*/
@SuppressWarnings("unused")
public class TracerAdmin extends AbstractAdmin {

    private static Log log = LogFactory.getLog(TracerAdmin.class);

    public TracerServiceInfo getMessages(int numberOfMessages, String filter) throws AxisFault {

        ConfigurationContext configContext = getConfigContext();
        AxisConfiguration axisConfiguration = configContext.getAxisConfiguration();
        CircularBuffer msgSeqBuff = getMessageSequenceBuffer();
        Object[] messageObjs;
        TracerServiceInfo tracerServiceInfo = new TracerServiceInfo();
        AxisModule axisModule = axisConfiguration.getModule(TracerConstants.WSO2_TRACER);

        if (axisModule == null) {
            throw new AxisFault(TracerConstants.WSO2_TRACER + " module is not available");
        }
        TracePersister tracePersister = getTracePersister();
        tracerServiceInfo.setTracePersister(tracePersister.getClass().getName());
        if (tracePersister.isTracingEnabled()) {
            if (!axisConfiguration.isEngaged(axisModule)) {
                axisConfiguration.engageModule(axisModule);
            }
            tracerServiceInfo.setFlag("ON");
        } else {
            if (axisConfiguration.isEngaged(axisModule)) {
                axisConfiguration.disengageModule(axisModule);
            }
            tracerServiceInfo.setFlag("OFF");
        }
        if (msgSeqBuff == null) {
            tracerServiceInfo.setEmpty(true);
            return tracerServiceInfo;
        } else {
            messageObjs = msgSeqBuff.getObjects(numberOfMessages);

            if (messageObjs.length == 0) {
                tracerServiceInfo.setEmpty(true);
                return tracerServiceInfo;

            } else {
                ArrayList<MessageInfo> msgInfoList = new ArrayList<MessageInfo>();
                boolean filterProvided = (filter != null && (filter = filter.trim()).length() != 0);
                tracerServiceInfo.setFilter(filterProvided);

                for (Object messageObj : messageObjs) {
                    MessageInfo mi = (MessageInfo) messageObj;
                    if (filterProvided) {
                        MessagePayload miPayload = getMessage(mi.getServiceId(),
                                                              mi.getOperationName(),
                                                              mi.getMessageSequence());
                        String req = miPayload.getRequest();
                        if (req == null) {
                            req = "";
                        }
                        String resp = miPayload.getResponse();
                        if (resp == null) {
                            resp = "";
                        }
                        if (req.toUpperCase().indexOf(filter.toUpperCase()) > -1
                            || resp.toUpperCase().indexOf(filter.toUpperCase()) > -1) {
                            msgInfoList.add(mi);
                        }
                    } else {
                        msgInfoList.add(mi);
                    }
                }

                if (filterProvided) {
                    tracerServiceInfo.setFilterString(filter);
                    if (msgInfoList.size() == 0) {
                        tracerServiceInfo.setEmpty(true);
                        return tracerServiceInfo;
                    }
                }

                Collections.reverse(msgInfoList);
                MessageInfo lastMessageInfo = msgInfoList.get(0);
                tracerServiceInfo.setMessageInfo(
                        msgInfoList.toArray(new MessageInfo[msgInfoList.size()]));
                MessagePayload lastMsg = getMessage(lastMessageInfo.getServiceId(),
                                                    lastMessageInfo.getOperationName(),
                                                    lastMessageInfo.getMessageSequence());
                tracerServiceInfo.setLastMessage(lastMsg);
                tracerServiceInfo.setEmpty(false);
            }
        }
        return tracerServiceInfo;
    }

    /**
     * @param flag; support ON or OFF.
     * @return The information about the Tracer service
     * @throws AxisFault If the tracer module is not found
     */
    public TracerServiceInfo setMonitoring(String flag) throws AxisFault {
        if (!flag.equalsIgnoreCase("ON") && !flag.equalsIgnoreCase("OFF")) {
            throw new RuntimeException("IllegalArgument for monitoring status :" + flag);
        }
        TracerServiceInfo tracerServiceInfo = new TracerServiceInfo();
        ConfigurationContext configurationContext = getConfigContext();
        AxisConfiguration axisConfiguration = configurationContext.getAxisConfiguration();
        AxisModule axisModule = axisConfiguration.getModule(TracerConstants.WSO2_TRACER);

        if (axisModule == null) {
            throw new RuntimeException(TracerAdmin.class.getName() + " " +
                                       TracerConstants.WSO2_TRACER + " is not available");
        }

        if (flag.equalsIgnoreCase("ON")) {
            if (!axisConfiguration.isEngaged(axisModule.getName())) {
                try {
                    axisConfiguration.engageModule(axisModule);
                } catch (AxisFault axisFault) {
                    log.error(axisFault);
                    throw new RuntimeException(axisFault);
                }
            }
        } else if (flag.equalsIgnoreCase("OFF")) {
            if (axisConfiguration.isEngaged(axisModule.getName())) {
                axisConfiguration.disengageModule(axisModule);
                configurationContext.removeProperty(TracerConstants.MSG_SEQ_BUFFER);
            }
        }
        TracePersister tracePersister = getTracePersister();
        tracePersister.saveTraceStatus(flag);
        tracerServiceInfo.setEmpty(true);
        tracerServiceInfo.setFlag(flag);
        tracerServiceInfo.setTracePersister(tracePersister.getClass().getName());

        return tracerServiceInfo;
    }

    public MessagePayload getMessage(String serviceId,
                                     String operationName,
                                     long messageSequence) throws AxisFault {
        TracePersister tracePersisterImpl = getTracePersister();
        MessagePayload messagePayload = new MessagePayload();
        if (tracePersisterImpl != null) {
            String[] respArray =
                    tracePersisterImpl.getMessages(serviceId, operationName,
                                                   messageSequence,
                                                   MessageContext.getCurrentMessageContext());
            if (respArray[0] != null) {
                messagePayload.setRequest(respArray[0]);
            }
            if (respArray[1] != null) {
                messagePayload.setResponse(respArray[1]);
            }
        } else {
            String message = "Tracer service encountered an error ";
            log.error(message);
            throw new RuntimeException(message);
        }

        return messagePayload;

    }

    private TracePersister getTracePersister() throws AxisFault {
        Parameter tracePersisterParam =
                getAxisConfig().getParameter(TracerConstants.TRACE_PERSISTER_IMPL);
        return getTracePersister(tracePersisterParam);
    }

    public void clearAllSoapMessages(){
        CircularBuffer msgSeqBuff = getMessageSequenceBuffer();
        if (msgSeqBuff != null) {
            msgSeqBuff.clear();
        }
    }

    private CircularBuffer getMessageSequenceBuffer() {
        return (CircularBuffer) getConfigContext().getProperty(TracerConstants.MSG_SEQ_BUFFER);
    }

    private TracePersister getTracePersister(Parameter tracePersisterParam) throws AxisFault {
        TracePersister tracePersister = null;
        if (tracePersisterParam != null) {
            Object tracePersisterImplObj = tracePersisterParam.getValue();
            if (tracePersisterImplObj instanceof TracePersister) {
                tracePersister = (TracePersister) tracePersisterImplObj;
            } else if (tracePersisterImplObj instanceof String) {
                //This will need in TestSuite
                try {
                    tracePersister =
                            (TracePersister) Loader
                                    .loadClass(((String) tracePersisterImplObj).trim())
                                    .newInstance();
                } catch (Exception e) {
                    String message = "Cannot instatiate TracePersister ";
                    log.error(message, e);
                    throw new RuntimeException(message, e);
                }
            }
        } else {
            return new MemoryBasedTracePersister(); // The default is the MemoryBasedTRacePersister
        }
        return tracePersister;
    }

}
TOP

Related Classes of org.wso2.carbon.tracer.service.TracerAdmin

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.