001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.monitoring.statistics.service;
016    
017    import com.liferay.portal.kernel.monitoring.RequestStatus;
018    import com.liferay.portal.kernel.monitoring.statistics.DataSampleProcessor;
019    import com.liferay.portal.kernel.monitoring.statistics.RequestStatistics;
020    import com.liferay.portal.monitoring.jmx.MethodSignature;
021    
022    import java.util.Map;
023    import java.util.concurrent.ConcurrentHashMap;
024    
025    /**
026     * @author Michael C. Han
027     */
028    public class ServiceStatistics
029            implements DataSampleProcessor<ServiceRequestDataSample> {
030    
031            public ServiceStatistics(String className) {
032                    _className = className;
033            }
034    
035            public long getAverageTime(String methodName, String[] parameterTypes) {
036                    MethodSignature methodSignature = new MethodSignature(
037                            _className, methodName, parameterTypes);
038    
039                    RequestStatistics requestStatistics = _methodRequestStatistics.get(
040                            methodSignature);
041    
042                    if (requestStatistics != null) {
043                            return requestStatistics.getAverageTime();
044                    }
045    
046                    return -1;
047            }
048    
049            public long getErrorCount(String methodName, String[] parameterTypes) {
050                    MethodSignature methodSignature = new MethodSignature(
051                            _className, methodName, parameterTypes);
052    
053                    RequestStatistics requestStatistics = _methodRequestStatistics.get(
054                            methodSignature);
055    
056                    if (requestStatistics != null) {
057                            return requestStatistics.getErrorCount();
058                    }
059    
060                    return -1;
061            }
062    
063            public long getMaxTime(String methodName, String[] parameterTypes) {
064                    MethodSignature methodSignature = new MethodSignature(
065                            _className, methodName, parameterTypes);
066    
067                    RequestStatistics requestStatistics = _methodRequestStatistics.get(
068                            methodSignature);
069    
070                    if (requestStatistics != null) {
071                            return requestStatistics.getMaxTime();
072                    }
073    
074                    return -1;
075            }
076    
077            public long getMinTime(String methodName, String[] parameterTypes) {
078                    MethodSignature methodSignature = new MethodSignature(
079                            _className, methodName, parameterTypes);
080    
081                    RequestStatistics requestStatistics = _methodRequestStatistics.get(
082                            methodSignature);
083    
084                    if (requestStatistics != null) {
085                            return requestStatistics.getMinTime();
086                    }
087    
088                    return -1;
089            }
090    
091            public long getRequestCount(String methodName, String[] parameterTypes) {
092                    MethodSignature methodSignature = new MethodSignature(
093                            _className, methodName, parameterTypes);
094    
095                    RequestStatistics requestStatistics = _methodRequestStatistics.get(
096                            methodSignature);
097    
098                    if (requestStatistics != null) {
099                            return requestStatistics.getRequestCount();
100                    }
101    
102                    return -1;
103            }
104    
105            @Override
106            public void processDataSample(
107                    ServiceRequestDataSample serviceRequestDataSample) {
108    
109                    MethodSignature methodSignature =
110                            serviceRequestDataSample.getMethodSignature();
111    
112                    RequestStatistics requestStatistics = _methodRequestStatistics.get(
113                            methodSignature);
114    
115                    if (requestStatistics == null) {
116                            requestStatistics = new RequestStatistics(
117                                    methodSignature.toString());
118    
119                            _methodRequestStatistics.put(methodSignature, requestStatistics);
120                    }
121    
122                    RequestStatus requestStatus =
123                            serviceRequestDataSample.getRequestStatus();
124    
125                    if (requestStatus == RequestStatus.ERROR) {
126                            requestStatistics.incrementError();
127                    }
128                    else if (requestStatus == RequestStatus.TIMEOUT) {
129                            requestStatistics.incrementTimeout();
130                    }
131                    else if (requestStatus == RequestStatus.SUCCESS) {
132                            requestStatistics.incrementSuccessDuration(
133                                    serviceRequestDataSample.getDuration());
134                    }
135            }
136    
137            private String _className;
138            private Map<MethodSignature, RequestStatistics> _methodRequestStatistics =
139                    new ConcurrentHashMap<MethodSignature, RequestStatistics>();
140    
141    }