You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2013/07/11 07:18:13 UTC

[22/27] aplying 0001-Refactor-usage-module-to-apache-stratos.patch

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/api/TenantUsageRetriever.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/api/TenantUsageRetriever.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/api/TenantUsageRetriever.java
new file mode 100644
index 0000000..8bb190c
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/api/TenantUsageRetriever.java
@@ -0,0 +1,607 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.api;
+
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.stratos.usage.beans.*;
+import org.apache.stratos.usage.util.Util;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.stratos.common.constants.UsageConstants;
+import org.apache.stratos.common.util.CommonUtil;
+import org.wso2.carbon.registry.core.exceptions.RegistryException;
+import org.wso2.carbon.registry.core.service.RegistryService;
+import org.apache.stratos.usage.util.DataAccessObject;
+import org.wso2.carbon.user.core.UserRealm;
+import org.wso2.carbon.user.core.UserStoreException;
+import org.wso2.carbon.user.core.tenant.TenantManager;
+
+import java.util.*;
+
+public class TenantUsageRetriever {
+    private static final Log log = LogFactory.getLog(TenantUsageRetriever.class);
+    private static final String DEFAULT_SERVICE_NAME = "Stratos";
+    private static final String METERING_ENDPOINT = "local://services/MeteringQueryDS";
+    private static final String TOTAL_LABEL = "Total";
+    public static final int REG_BANDWIDTH_INDEX = 0;
+    public static final int SVC_BANDWIDTH_INDEX = 1;
+    public static final int WEBAPP_BANDWIDTH_INDEX = 2;
+    public static final int API_CALL_STATS=3;
+
+    private RegistryService registryService;
+    private DataAccessObject dao;
+
+    public TenantUsageRetriever(RegistryService registryService, ConfigurationContext configContext)
+            throws Exception {
+
+        // we are loading the essentials from the constructors in order to restrict the users
+        // to use the usage retrievers.
+        this.registryService = registryService;
+        this.dao = new DataAccessObject();
+    }
+
+
+    public TenantDataCapacity getDataCapacity(int tenantId, Calendar startDate, Calendar endDate,
+                                              boolean currentMonth) throws Exception {
+        TenantDataCapacity dataCapacity = null;
+
+        if(currentMonth){
+            dataCapacity = dao.getTenantDataCapacity(tenantId);
+        } else {
+            //we don't have a way to see the registry usage of last months yet
+        }
+
+        return dataCapacity;
+
+    }
+
+    /**
+     * This returns the number of users in a given tenant
+     * @param tenantId Tenant ID
+     * @return Number of users
+     * @throws RegistryException
+     */
+    public int getCurrentUserCount(int tenantId) throws RegistryException {
+        UserRealm userRealm = registryService.getUserRealm(tenantId);
+        int usersCount;
+        try {
+            String[] users = userRealm.getUserStoreManager().listUsers("*", -1);
+            usersCount = users.length;
+        } catch (UserStoreException e) {
+            String msg = "Error in getting the current users.";
+            log.error(msg, e);
+            throw new RegistryException(msg, e);
+        }
+        return usersCount;
+    }
+
+    public BandwidthStatistics[][] getBandwidthStatistics(int tenantId, Calendar startDate,
+                                                          Calendar endDate, boolean currentMonth) throws Exception {
+        //return the bandwidth usage of a user for a given period
+        BandwidthStatistics[] stats;
+        if (currentMonth) {
+            //get from daily usage stats
+            List<BandwidthStatistics> bwsList = new ArrayList<BandwidthStatistics>();
+            bwsList = dao.getDailyBandwidthStats(tenantId, startDate, endDate);
+
+            //next we'll get from the houlry stats to get the stats which are not yet
+            //summarized to the daily stats table
+            Calendar startHour = Calendar.getInstance();
+            startHour.set(Calendar.HOUR, 0);
+            startHour.set(Calendar.MINUTE, 0);
+            startHour.set(Calendar.SECOND, 0);
+
+            Calendar endHour = Calendar.getInstance();
+
+            bwsList.addAll(dao.getHourlyBandwidthStats(tenantId, startHour, endHour));
+            stats = convertBWListToArray(bwsList);
+
+        } else {
+            //get from monthly usage stats
+            Calendar monthCal = (Calendar) endDate.clone();
+            monthCal.set(Calendar.DATE, 0);
+            monthCal.set(Calendar.HOUR, 0);
+            monthCal.set(Calendar.MINUTE, 0);
+            monthCal.set(Calendar.SECOND, 0);
+
+            stats = convertBWListToArray(dao.getMonthlyBandwidthStats(tenantId, monthCal));
+        }
+
+        // store the statistics in a temporary map. This is because, we are getting the server name
+        // from the URL and there might be two distinct URL gives same server name.
+        // For example, http://esb.a.b/ and http://esb.c.d/ both will give the server name as "esb"
+        // Hence, the value should be accumulated value
+        HashMap<String, BandwidthStatistics> regBwMap = new HashMap<String, BandwidthStatistics>();
+        HashMap<String, BandwidthStatistics> svcBwMap = new HashMap<String, BandwidthStatistics>();
+        HashMap<String, BandwidthStatistics> webappBwMap = new HashMap<String, BandwidthStatistics>();
+
+        if (stats != null) {
+            for (BandwidthStatistics stat : stats) {
+                //Proceed only if incoming bandwidth or outgoing bandwidth is not zero
+                if (stat.getIncomingBandwidth() == 0 && stat.getOutgoingBandwidth() == 0) {
+                    continue;
+                }
+
+                //TODO: fix the extractServiceUrl method properly
+                String serverName = extractServiceNameFromUrl(stat.getServerUrl());
+                String bandwidthName = stat.getKey();
+
+                HashMap<String, BandwidthStatistics> bwMap;
+                if (bandwidthName.equals(UsageConstants.REGISTRY_INCOMING_BW) ||
+                        bandwidthName.equals(UsageConstants.REGISTRY_OUTGOING_BW)) {
+                    bwMap = regBwMap;
+                } else if (bandwidthName.equals(UsageConstants.SERVICE_INCOMING_BW) ||
+                        bandwidthName.equals(UsageConstants.SERVICE_OUTGOING_BW)) {
+                    bwMap = svcBwMap;
+                } else if (bandwidthName.equals(UsageConstants.WEBAPP_INCOMING_BW) ||
+                        bandwidthName.equals(UsageConstants.WEBAPP_OUTGOING_BW)) {
+                    bwMap = webappBwMap;
+                } else {
+                    log.warn("Unable to identify bandwidth name " + bandwidthName);
+                    continue;
+                }
+
+                //find whether the map already has this key; If not, insert a new one
+                BandwidthStatistics reqStat = bwMap.get(serverName);
+                if (reqStat == null) {
+                    reqStat = new BandwidthStatistics(serverName);
+                    bwMap.put(serverName, reqStat);
+                }
+
+                // Update the service specific statistics
+                reqStat.setIncomingBandwidth(
+                        reqStat.getIncomingBandwidth() + stat.getIncomingBandwidth());
+                reqStat.setOutgoingBandwidth(
+                        reqStat.getOutgoingBandwidth() + stat.getOutgoingBandwidth());
+            }
+        }
+
+        //Convert to array and return it
+        BandwidthStatistics[][] returnValue = new BandwidthStatistics[3][];
+        Collection<BandwidthStatistics> values = regBwMap.values();
+        returnValue[REG_BANDWIDTH_INDEX] = values.toArray(new BandwidthStatistics[values.size()]);
+        values = svcBwMap.values();
+        returnValue[SVC_BANDWIDTH_INDEX] = values.toArray(new BandwidthStatistics[values.size()]);
+        values = webappBwMap.values();
+        returnValue[WEBAPP_BANDWIDTH_INDEX] = values.toArray(new BandwidthStatistics[values.size()]);
+
+        return returnValue;
+    }
+
+
+    public APIManagerUsageStats[] getAPIManagerUsageStats(int tenantId, Calendar startDate,
+                                                          Calendar endDate, boolean currentMonth) throws Exception {
+        //return the bandwidth usage of a user for a given period
+        APIManagerUsageStats[] stats;
+        if (currentMonth) {
+            //get from daily usage stats
+            List<APIManagerUsageStats> bwsList = new ArrayList<APIManagerUsageStats>();
+            bwsList = dao.getDailyAPIManagerUsageStats(tenantId, startDate, endDate);
+
+            //next we'll get from the houlry stats to get the stats which are not yet
+            //summarized to the daily stats table
+            Calendar startHour = Calendar.getInstance();
+            startHour.set(Calendar.HOUR, 0);
+            startHour.set(Calendar.MINUTE, 0);
+            startHour.set(Calendar.SECOND, 0);
+
+            Calendar endHour = Calendar.getInstance();
+
+            bwsList.addAll(dao.getHourlyAPIManagerUsageStats(tenantId, startHour, endHour));
+            stats = convertAPIStatListToArray(bwsList);
+
+        } else {
+            //get from monthly usage stats
+            Calendar monthCal = (Calendar) endDate.clone();
+            monthCal.set(Calendar.DATE, 0);
+            monthCal.set(Calendar.HOUR, 0);
+            monthCal.set(Calendar.MINUTE, 0);
+            monthCal.set(Calendar.SECOND, 0);
+
+            stats = convertAPIStatListToArray(dao.getMonthlyAPIManagerUsageStats(tenantId, monthCal));
+        }
+        HashMap<String, APIManagerUsageStats> statMap = new HashMap<String, APIManagerUsageStats>();
+        if (stats != null) {
+            for (APIManagerUsageStats stat : stats) {
+                if (stat.getRequestCount() == 0) {
+                    continue;
+                }
+                String serverName = extractServiceNameFromUrl(stat.getServerUrl());
+                String statName = stat.getKey();
+
+                HashMap<String, APIManagerUsageStats> statsHashMap;
+                if (statName.equals("API-Call")) {
+                    statsHashMap = statMap;
+                } else {
+                    log.warn("Unable to identify bandwidth name " + statName);
+                    continue;
+                }
+
+                //find whether the map already has this key; If not, insert a new one
+                APIManagerUsageStats reqStat = statsHashMap.get(serverName);
+                if (reqStat == null) {
+                    reqStat = new APIManagerUsageStats(serverName);
+                    statsHashMap.put(serverName, reqStat);
+                }
+                reqStat.setRequestCount(stat.getRequestCount());
+            }
+        }
+
+        //Convert to array and return it
+        APIManagerUsageStats[] returnValue = new APIManagerUsageStats[0];
+        Collection<APIManagerUsageStats> values = statMap.values();
+        returnValue = values.toArray(new APIManagerUsageStats[values.size()]);
+        return returnValue;
+    }
+
+
+    public RequestStatistics[] getRequestStatistics(int tenantId, Calendar startDate,
+                                                    Calendar endDate, boolean currentMonth) throws Exception {
+        RequestStatistics[] stats;
+        if (currentMonth) {
+            //get from daily usage stats
+            List<RequestStatistics> rsList = new ArrayList<RequestStatistics>();
+            rsList = dao.getDailyRequestStats(tenantId, startDate, endDate);
+
+            //next we'll get from the houlry stats to get the stats which are not yet
+            //summarized to the daily stats table
+            Calendar startHour = Calendar.getInstance();
+            startHour.set(Calendar.HOUR, 0);
+            startHour.set(Calendar.MINUTE, 0);
+            startHour.set(Calendar.SECOND, 0);
+
+            Calendar endHour = Calendar.getInstance();
+
+            rsList.addAll(dao.getHourlyRequestStats(tenantId, startHour, endHour));
+
+            stats = convertRSListToArray(rsList);
+        } else {
+            //get from monthly usage stats
+            Calendar monthCal = (Calendar) endDate.clone();
+            monthCal.set(Calendar.DATE, 0);
+            monthCal.set(Calendar.HOUR, 0);
+            monthCal.set(Calendar.MINUTE, 0);
+            monthCal.set(Calendar.SECOND, 0);
+
+            stats = convertRSListToArray(dao.getMonthlyRequestStats(tenantId, monthCal));
+        }
+
+        // store the statistics in a temporary map. This is because, we are getting the server name
+        // from the URL and there might be two distinct URL gives same server name.
+        // For example, http://esb.a.b/ and http://esb.c.d/ both will give the server name as "esb"
+        // Hence, the value should be accumulated value
+        HashMap<String, RequestStatistics> tempReqStatMap = new HashMap<String, RequestStatistics>();
+
+        if (stats != null) {
+            for (RequestStatistics stat : stats) {
+                //Proceed only if request count is not zero
+                if (stat.getRequestCount() == 0) {
+                    continue;
+                }
+
+                String serverName = extractServiceNameFromUrl(stat.getKey());
+
+                //find whether the map already has this key; If not, insert a new one
+                RequestStatistics reqStat = tempReqStatMap.get(serverName);
+                if (reqStat == null) {
+                    reqStat = new RequestStatistics(serverName);
+                    tempReqStatMap.put(serverName, reqStat);
+                }
+
+                // Update the service specific statistics
+                reqStat.setRequestCount(reqStat.getRequestCount() + stat.getRequestCount());
+                reqStat.setResponseCount(reqStat.getResponseCount() + stat.getResponseCount());
+                reqStat.setFaultCount(reqStat.getFaultCount() + stat.getFaultCount());
+            }
+        }
+
+        //Convert to array and return it
+        Collection<RequestStatistics> values = tempReqStatMap.values();
+        return values.toArray(new RequestStatistics[values.size()]);
+
+    }
+
+    public CartridgeStatistics[] getCartridgeStatistics(int tenantId, Calendar startDate,
+                                                    Calendar endDate, boolean currentMonth) throws Exception {
+        CartridgeStatistics[] stats;
+        /*if (currentMonth) {
+            //get from daily usage stats
+            List<CartridgeStatistics> csList = new ArrayList<CartridgeStatistics>();
+            csList = dao.getDailyCartridgeStats(tenantId, startDate, endDate);
+
+            //next we'll get from the houlry stats to get the stats which are not yet
+            //summarized to the daily stats table
+            Calendar startHour = Calendar.getInstance();
+            startHour.set(Calendar.HOUR, 0);
+            startHour.set(Calendar.MINUTE, 0);
+            startHour.set(Calendar.SECOND, 0);
+
+            Calendar endHour = Calendar.getInstance();
+
+            csList.addAll(dao.getHourlyCartridgeStats(tenantId, startHour, endHour));
+
+            stats = convertCSListToArray(csList);
+        } else {
+            //get from monthly usage stats
+            Calendar monthCal = (Calendar) endDate.clone();
+            monthCal.set(Calendar.DATE, 0);
+            monthCal.set(Calendar.HOUR, 0);
+            monthCal.set(Calendar.MINUTE, 0);
+            monthCal.set(Calendar.SECOND, 0);
+
+            stats = convertCSListToArray(dao.getMonthlyCartridgeStats(tenantId, monthCal));
+        }*/
+        List<CartridgeStatistics> csList = new ArrayList<CartridgeStatistics>();
+        csList = dao.getHourlyCartridgeStats(tenantId, startDate, endDate);
+        stats = convertCSListToArray(csList);
+
+        //Add a comment explaining following logic later
+        HashMap<String, CartridgeStatistics> tempCartridgeStatMap = new HashMap<String, CartridgeStatistics>();
+
+        if (stats != null) {
+            for (CartridgeStatistics stat : stats) {
+                //Proceed only if request count is not zero
+                if (stat.getCartridgeHours() == 0) {
+                    continue;
+                }
+
+                
+                //find whether the map already has this key; If not, insert a new one
+                CartridgeStatistics cartridgeStat = tempCartridgeStatMap.get(stat.getKey());
+                if (cartridgeStat == null) {
+                    cartridgeStat = new CartridgeStatistics(stat.getKey());
+                    tempCartridgeStatMap.put(stat.getKey(), cartridgeStat);
+                }
+
+                // Update the service specific statistics
+                cartridgeStat.setCartridgeHours(cartridgeStat.getCartridgeHours() + stat.getCartridgeHours());
+                cartridgeStat.setInstanceId(stat.getInstanceId());
+            }
+        }
+
+        //Convert to array and return it
+        Collection<CartridgeStatistics> values = tempCartridgeStatMap.values();
+        return values.toArray(new CartridgeStatistics[values.size()]);
+
+    }
+
+    public TenantUsage getTenantUsage(int tenantId, String yearMonth) throws Exception {
+        //get the domain name
+        TenantManager tenantManger = Util.getRealmService().getTenantManager();
+        String domain = tenantManger.getDomain(tenantId);
+        TenantUsage tenantUsage = new TenantUsage(tenantId, domain);
+
+        //Get the startDate, endDate from yearMonth String
+        Date date = CommonUtil.getDateFromMonthString(yearMonth);
+        Calendar startDate = Calendar.getInstance();
+        startDate.setTime(date);
+        Calendar endDate = (Calendar) startDate.clone();
+        endDate.add(Calendar.MONTH, 1);
+
+        //Calculate whether the yearMonth fits to current month; if the current date is less than
+        // endDate, then we treat it as current month
+        boolean isCurrentMonth = (Calendar.getInstance().compareTo(endDate) <= 0);
+
+        //get the data capacity
+        TenantDataCapacity capacity;
+        try {
+            capacity = getDataCapacity(tenantId, startDate, endDate, isCurrentMonth);
+        } catch (Exception e) {
+            String msg = "Error in getting data capacity from metering service.";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+        tenantUsage.setRegistryCapacity(capacity);
+
+        //get the service request statistics
+        RequestStatistics[] reqStats = null;
+        try {
+            reqStats = getRequestStatistics(tenantId, startDate, endDate, isCurrentMonth);
+        } catch (Exception e) {
+            String msg = "Error in getting request statistics from metering service.";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+        tenantUsage.setRequestStatistics(reqStats);
+
+        //Calculate total Request statistics
+        RequestStatistics totalReqStat = new RequestStatistics(TOTAL_LABEL);
+        long totalReq = 0;
+        long totalRes = 0;
+        long totalFault = 0;
+        if(reqStats!=null){
+            for (RequestStatistics stat : reqStats) {
+                totalReq += stat.getRequestCount();
+                totalRes += stat.getResponseCount();
+                totalFault += stat.getFaultCount();
+            }
+            totalReqStat.setRequestCount(totalReq);
+            totalReqStat.setResponseCount(totalRes);
+            totalReqStat.setFaultCount(totalFault);
+        }
+        tenantUsage.setTotalRequestStatistics(totalReqStat);
+
+        //get Bandwidth statistics
+        BandwidthStatistics[][] bwStats = null;
+        try {
+            bwStats = getBandwidthStatistics(tenantId, startDate, endDate, isCurrentMonth);
+        } catch (Exception e) {
+            String msg = "Error in getting bandwidth statistics from metering service.";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+        tenantUsage.setRegistryBandwidthStatistics(bwStats[REG_BANDWIDTH_INDEX]);
+        tenantUsage.setServiceBandwidthStatistics(bwStats[SVC_BANDWIDTH_INDEX]);
+        tenantUsage.setWebappBandwidthStatistics(bwStats[WEBAPP_BANDWIDTH_INDEX]);
+
+        //get the total bandwidths
+        int index = 0;
+        for (BandwidthStatistics[] bwArray : bwStats) {
+            long incomingBandwidth = 0;
+            long outgoingBandwidth = 0;
+            for (BandwidthStatistics bandwidth : bwArray) {
+                incomingBandwidth += bandwidth.getIncomingBandwidth();
+                outgoingBandwidth += bandwidth.getOutgoingBandwidth();
+            }
+            BandwidthStatistics total = new BandwidthStatistics(TOTAL_LABEL);
+            total.setIncomingBandwidth(incomingBandwidth);
+            total.setOutgoingBandwidth(outgoingBandwidth);
+            switch (index) {
+                case REG_BANDWIDTH_INDEX:
+                    tenantUsage.setTotalRegistryBandwidth(total);
+                    break;
+                case SVC_BANDWIDTH_INDEX:
+                    tenantUsage.setTotalServiceBandwidth(total);
+                    break;
+                case WEBAPP_BANDWIDTH_INDEX:
+                    tenantUsage.setTotalWebappBandwidth(total);
+                    break;
+            }
+            ++index;
+        }
+
+        // the users count will be calculated only if the yearMonth is the current yearMonth
+        if (isCurrentMonth) {
+            int usersCount = getCurrentUserCount(tenantId);
+            tenantUsage.setNumberOfUsers(usersCount);
+        }
+        // get the API invocation data
+        APIManagerUsageStats[] apiStats = null;
+        try {
+            apiStats = getAPIManagerUsageStats(tenantId, startDate, endDate, isCurrentMonth);
+        } catch (Exception e) {
+            String msg = "Error in getting bandwidth statistics from metering service.";
+            log.error(msg, e);
+            throw new Exception(msg, e);
+        }
+        tenantUsage.setApiManagerUsageStats(apiStats);
+
+        //retrieving cartridge hours
+        CartridgeStatistics[] cartridgeStatistics = getCartridgeStatistics(tenantId, startDate, endDate, isCurrentMonth);
+        tenantUsage.setCartridgeStatistics(cartridgeStatistics);
+        long totalCartridgeHours = 0;
+        if(cartridgeStatistics!=null && cartridgeStatistics.length>0){
+            
+            for (CartridgeStatistics cs : cartridgeStatistics){
+                totalCartridgeHours += cs.getCartridgeHours();
+            }
+        }
+
+        CartridgeStatistics totalCS = new CartridgeStatistics();
+        totalCS.setCartridgeHours(totalCartridgeHours);
+
+        tenantUsage.setTotalCartridgeHours(totalCS);
+        return tenantUsage;
+    }
+
+    /**
+     * @param serviceURL
+     * @return service name
+     *         <p/>
+     *         Extract the stratos service part from URL; expecting the URL as
+     *         protocol://service.domain:port/tenant-domain/ or service.domain:port/tenant
+     *         We are interested in "service" part only
+     */
+    private String extractServiceNameFromUrl(String serviceURL) {
+        if (serviceURL == null || serviceURL.equals("")) {
+            //No service URL is given, so return a default value
+            return DEFAULT_SERVICE_NAME;
+        }
+
+        int startIndex = serviceURL.indexOf("://"); //exclude protocol:// part
+        if (startIndex != -1) {
+            // protocol://service.domain:port/tenant-domain/ case
+            startIndex += 3;
+        } else {
+            //service.domain:port/tenant case
+            startIndex = 0;
+        }
+
+        int endIndex = serviceURL.indexOf('.', startIndex); //take upto first "."
+        if (endIndex == -1) {
+            // "." is not there; search for ":"
+            endIndex = serviceURL.indexOf(':', startIndex);
+
+            if (endIndex == -1) {
+                //Still could not find ":", then search for "/"
+                endIndex = serviceURL.indexOf('/', startIndex);
+
+                if (endIndex == -1) {
+                    //Noting is there, so take the whole service URL
+                    endIndex = serviceURL.length();
+                }
+            }
+
+        }
+        return serviceURL.substring(startIndex, endIndex);
+    }
+
+    /**
+     * @return Instance Usages Statics Array that contains data
+     * @throws Exception when back end error occurs
+     */
+    public InstanceUsageStatics[] getInstanceUsages() throws Exception {
+
+        //TODO: implement
+        return null;
+        /*InstanceUsageStat[] instanceData = meteringStub.getInstanceUsageStats();
+        if (instanceData == null || instanceData.length == 0) {
+            return null;
+        }
+        InstanceUsageStatics[] returnValue = new InstanceUsageStatics[instanceData.length];
+        int elementID = 0;
+        for (InstanceUsageStat iu : instanceData) {
+            InstanceUsageStatics iu1 = new InstanceUsageStatics();
+            iu1.setInstanceID(iu.getInstanceId().intValue());
+            iu1.setInstanceURL(iu.getServerURL());
+            iu1.setStartTime(iu.getStartTimestamp());
+            iu1.setStopTime(iu.getStopTimestamp());
+            iu1.setRunning(iu.getIsRunning());
+            returnValue[elementID] = iu1;
+            elementID = elementID + 1;
+        }
+        return returnValue;
+        */
+    }
+
+
+    private BandwidthStatistics[] convertBWListToArray(List<BandwidthStatistics> bwsList) {
+        BandwidthStatistics[] bwsArray = new BandwidthStatistics[bwsList.size()];
+        bwsArray = bwsList.toArray(bwsArray);
+        return bwsArray;
+    }
+
+    private APIManagerUsageStats[] convertAPIStatListToArray(List<APIManagerUsageStats> bwsList) {
+        APIManagerUsageStats[] bwsArray = new APIManagerUsageStats[bwsList.size()];
+        bwsArray = bwsList.toArray(bwsArray);
+        return bwsArray;
+    }
+
+    private RequestStatistics[] convertRSListToArray(List<RequestStatistics> rsList) {
+        RequestStatistics[] rsArray = new RequestStatistics[rsList.size()];
+        rsArray = rsList.toArray(rsArray);
+        return rsArray;
+    }
+
+    private CartridgeStatistics[] convertCSListToArray(List<CartridgeStatistics> csList){
+        CartridgeStatistics[] csArray = new CartridgeStatistics[csList.size()];
+        csArray = csList.toArray(csArray);
+        return csArray;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/APIManagerUsageStats.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/APIManagerUsageStats.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/APIManagerUsageStats.java
new file mode 100644
index 0000000..bd47d8f
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/APIManagerUsageStats.java
@@ -0,0 +1,72 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+public class APIManagerUsageStats {
+    private String key;
+    private String serverUrl;
+    private long incomingBandwidth;
+    private long outgoingBandwidth;
+    private long requestCount;
+
+    public long getRequestCount() {
+        return requestCount;
+    }
+
+    public void setRequestCount(long requestCount) {
+        this.requestCount = requestCount;
+    }
+
+
+    public APIManagerUsageStats(String key) {
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public long getIncomingBandwidth() {
+        return incomingBandwidth;
+    }
+
+    public void setIncomingBandwidth(long incomingBandwidth) {
+        this.incomingBandwidth = incomingBandwidth;
+    }
+
+    public long getOutgoingBandwidth() {
+        return outgoingBandwidth;
+    }
+
+    public void setOutgoingBandwidth(long outgoingBandwidth) {
+        this.outgoingBandwidth = outgoingBandwidth;
+    }
+
+    public String getServerUrl() {
+        return serverUrl;
+    }
+
+    public void setServerUrl(String serverUrl) {
+        this.serverUrl = serverUrl;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/BandwidthStatistics.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/BandwidthStatistics.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/BandwidthStatistics.java
new file mode 100644
index 0000000..9e62626
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/BandwidthStatistics.java
@@ -0,0 +1,65 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+/**
+ * 
+ */
+public class BandwidthStatistics {
+    private String key;
+    private String serverUrl;
+    private long incomingBandwidth;
+    private long outgoingBandwidth;
+
+    public BandwidthStatistics(String key){
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public long getIncomingBandwidth() {
+        return incomingBandwidth;
+    }
+
+    public void setIncomingBandwidth(long incomingBandwidth) {
+        this.incomingBandwidth = incomingBandwidth;
+    }
+
+    public long getOutgoingBandwidth() {
+        return outgoingBandwidth;
+    }
+
+    public void setOutgoingBandwidth(long outgoingBandwidth) {
+        this.outgoingBandwidth = outgoingBandwidth;
+    }
+
+    public String getServerUrl() {
+        return serverUrl;
+    }
+
+    public void setServerUrl(String serverUrl) {
+        this.serverUrl = serverUrl;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/CartridgeStatistics.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/CartridgeStatistics.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/CartridgeStatistics.java
new file mode 100644
index 0000000..4568519
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/CartridgeStatistics.java
@@ -0,0 +1,59 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+
+public class CartridgeStatistics {
+    
+    private String key;
+    private String instanceId;
+    private long cartridgeHours;
+    
+    public CartridgeStatistics(){
+        //Default constructor
+    }
+
+    public CartridgeStatistics(String key){
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public long getCartridgeHours() {
+        return cartridgeHours;
+    }
+
+    public void setCartridgeHours(long cartridgeHours) {
+        this.cartridgeHours = cartridgeHours;
+    }
+
+    public String getInstanceId() {
+        return instanceId;
+    }
+
+    public void setInstanceId(String instanceId) {
+        this.instanceId = instanceId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/InstanceUsageStatics.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/InstanceUsageStatics.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/InstanceUsageStatics.java
new file mode 100644
index 0000000..b0877ef
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/InstanceUsageStatics.java
@@ -0,0 +1,91 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+import java.util.Calendar;
+
+public class InstanceUsageStatics {
+
+    private Calendar startTime;
+    private Calendar stopTime;
+    private String instanceURL;
+    private Integer instanceID;
+    private long usedTimeInSeconds;
+    private boolean running;
+
+    public boolean isRunning() {
+        return running;
+    }
+
+    public void setRunning(boolean running) {
+        this.running = running;
+    }
+
+    public Calendar getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Calendar startTime) {
+        this.startTime = startTime;
+    }
+
+    public Calendar getStopTime() {
+        return stopTime;
+    }
+
+    public void setStopTime(Calendar stopTime) {
+        //Check weather stop time is Default value in database in that case
+        //server should still running so set isRunning as true
+        Calendar fixedDate = Calendar.getInstance();
+        fixedDate.set(2001, 1, 1, 00, 00, 00);
+        if (stopTime.compareTo(fixedDate) == 0) {
+            this.running = true;
+        }
+        this.stopTime = stopTime;
+    }
+
+    public String getInstanceURL() {
+        return instanceURL;
+    }
+
+    public void setInstanceURL(String instanceURL) {
+        this.instanceURL = instanceURL;
+    }
+
+    public Integer getInstanceID() {
+        return instanceID;
+    }
+
+    public void setInstanceID(Integer instanceID) {
+        this.instanceID = instanceID;
+    }
+
+    public long getUsedTimeInSeconds() {
+        long returnValue = (this.stopTime.getTimeInMillis() -
+                this.startTime.getTimeInMillis()) / 1000;
+        if (returnValue < 0) {
+            running = true;
+        }
+        return usedTimeInSeconds;
+    }
+    public void setUsedTimeInSeconds(long value){
+        this.usedTimeInSeconds=value;
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedInstanceUsage.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedInstanceUsage.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedInstanceUsage.java
new file mode 100644
index 0000000..3af8b9d
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedInstanceUsage.java
@@ -0,0 +1,59 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+import java.util.Arrays;
+
+public class PaginatedInstanceUsage {
+    private InstanceUsageStatics[] instanceUsages;
+    private int pageNumber;
+    private int numberOfPages;
+
+    public InstanceUsageStatics[] getInstanceUsages() {
+        if(instanceUsages != null) {
+        return Arrays.copyOf(instanceUsages, instanceUsages.length);
+        }
+
+        return null;
+    }
+
+    public void setInstanceUsages(InstanceUsageStatics[] instanceUsages) {
+        if(instanceUsages != null) {
+            this.instanceUsages = Arrays.copyOf(instanceUsages, instanceUsages.length);
+        }
+    }
+
+    public int getPageNumber() {
+        return pageNumber;
+    }
+
+    public void setPageNumber(int pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+
+    public int getNumberOfPages() {
+        return numberOfPages;
+    }
+
+    public void setNumberOfPages(int numberOfPages) {
+        this.numberOfPages = numberOfPages;
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedTenantUsageInfo.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedTenantUsageInfo.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedTenantUsageInfo.java
new file mode 100644
index 0000000..e538807
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/PaginatedTenantUsageInfo.java
@@ -0,0 +1,47 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+import java.util.Arrays;
+
+public class PaginatedTenantUsageInfo {
+    private TenantUsage[] tenantUsages;
+    private int pageNumber;
+    private int numberOfPages;
+    
+    public TenantUsage[] getTenantUsages() {
+        return Arrays.copyOf(tenantUsages, tenantUsages.length);
+    }
+    public void setTenantUsages(TenantUsage[] tenantUsages) {
+        this.tenantUsages = Arrays.copyOf(tenantUsages, tenantUsages.length);
+    }
+    public int getPageNumber() {
+        return pageNumber;
+    }
+    public void setPageNumber(int pageNumber) {
+        this.pageNumber = pageNumber;
+    }
+    public int getNumberOfPages() {
+        return numberOfPages;
+    }
+    public void setNumberOfPages(int numberOfPages) {
+        this.numberOfPages = numberOfPages;
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/RequestStatistics.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/RequestStatistics.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/RequestStatistics.java
new file mode 100644
index 0000000..e703578
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/RequestStatistics.java
@@ -0,0 +1,63 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+public class RequestStatistics {
+    private String key;
+    private long requestCount;
+    private long responseCount;
+    private long faultCount;
+
+    public RequestStatistics(String key) {
+        this.key = key;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public long getRequestCount() {
+        return requestCount;
+    }
+
+    public void setRequestCount(long requestCount) {
+        this.requestCount = requestCount;
+    }
+
+    public long getResponseCount() {
+        return responseCount;
+    }
+
+    public void setResponseCount(long responseCount) {
+        this.responseCount = responseCount;
+    }
+
+    public long getFaultCount() {
+        return faultCount;
+    }
+
+    public void setFaultCount(long faultCount) {
+        this.faultCount = faultCount;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantDataCapacity.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantDataCapacity.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantDataCapacity.java
new file mode 100644
index 0000000..c0f2ea7
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantDataCapacity.java
@@ -0,0 +1,55 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+public class TenantDataCapacity {
+
+    private long registryContentCapacity;
+    private long registryContentHistoryCapacity;
+
+    public TenantDataCapacity() {
+    }
+    
+    /**
+     * @param registryContentCapacity
+     * @param registryContentHistoryCapacity
+     */
+    public TenantDataCapacity(
+            long registryContentCapacity, long registryContentHistoryCapacity) {
+        this.registryContentCapacity = registryContentCapacity;
+        this.registryContentHistoryCapacity = registryContentHistoryCapacity;
+    }
+
+    public long getRegistryContentCapacity() {
+        return registryContentCapacity;
+    }
+
+    public void setRegistryContentCapacity(long registryContentCapacity) {
+        this.registryContentCapacity = registryContentCapacity;
+    }
+
+    public long getRegistryContentHistoryCapacity() {
+        return registryContentHistoryCapacity;
+    }
+
+    public void setRegistryContentHistoryCapacity(long registryContentHistoryCapacity) {
+        this.registryContentHistoryCapacity = registryContentHistoryCapacity;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantUsage.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantUsage.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantUsage.java
new file mode 100644
index 0000000..8afd9af
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/TenantUsage.java
@@ -0,0 +1,219 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+public class TenantUsage {
+    private int tenantId;
+    private String domain;
+    private int numberOfUsers;
+    private UsageEntry[] usageEntries;
+    private BandwidthStatistics[] registryBandwidthStatistics;
+    private BandwidthStatistics[] serviceBandwidthStatistics;
+    private BandwidthStatistics[] webappBandwidthStatistics;
+    private CartridgeStatistics[] cartridgeStatistics;
+    private RequestStatistics[] requestStatistics;
+    private TenantDataCapacity registryCapacity;
+    private RequestStatistics totalRequestStatistics;
+    private BandwidthStatistics totalRegistryBandwidth;
+    private BandwidthStatistics totalServiceBandwidth;
+    private BandwidthStatistics totalWebappBandwidth;
+    private CartridgeStatistics totalCartridgeHours;
+    private APIManagerUsageStats[] apiManagerUsageStats;
+
+    public APIManagerUsageStats[] getApiManagerUsageStats() {
+        return apiManagerUsageStats;
+    }
+
+    public void setApiManagerUsageStats(APIManagerUsageStats[] apiManagerUsageStats) {
+        this.apiManagerUsageStats = apiManagerUsageStats;
+    }
+
+    public BandwidthStatistics[] getRegistryBandwidthStatistics() {
+        return registryBandwidthStatistics;
+    }
+
+    public void setRegistryBandwidthStatistics(BandwidthStatistics[] registryBandwidthStatistics) {
+        this.registryBandwidthStatistics = registryBandwidthStatistics;
+    }
+
+    public BandwidthStatistics[] getServiceBandwidthStatistics() {
+        return serviceBandwidthStatistics;
+    }
+
+    public void setServiceBandwidthStatistics(BandwidthStatistics[] serviceBandwidthStatistics) {
+        this.serviceBandwidthStatistics = serviceBandwidthStatistics;
+    }
+
+    public BandwidthStatistics[] getWebappBandwidthStatistics() {
+        return webappBandwidthStatistics;
+    }
+
+    public void setWebappBandwidthStatistics(BandwidthStatistics[] webappBandwidthStatistics) {
+        this.webappBandwidthStatistics = webappBandwidthStatistics;
+    }
+
+    public RequestStatistics getTotalRequestStatistics() {
+        return totalRequestStatistics;
+    }
+
+    public void setTotalRequestStatistics(RequestStatistics totalRequestStatistics) {
+        this.totalRequestStatistics = totalRequestStatistics;
+    }
+
+    public BandwidthStatistics getTotalRegistryBandwidth() {
+        return totalRegistryBandwidth;
+    }
+
+    public void setTotalRegistryBandwidth(BandwidthStatistics totalRegistryBandwidth) {
+        this.totalRegistryBandwidth = totalRegistryBandwidth;
+    }
+
+    public BandwidthStatistics getTotalServiceBandwidth() {
+        return totalServiceBandwidth;
+    }
+
+    public void setTotalServiceBandwidth(BandwidthStatistics totalServiceBandwidth) {
+        this.totalServiceBandwidth = totalServiceBandwidth;
+    }
+
+    public BandwidthStatistics getTotalWebappBandwidth() {
+        return totalWebappBandwidth;
+    }
+
+    public void setTotalWebappBandwidth(BandwidthStatistics totalWebappBandwidth) {
+        this.totalWebappBandwidth = totalWebappBandwidth;
+    }
+
+    public CartridgeStatistics[] getCartridgeStatistics() {
+        return cartridgeStatistics;
+    }
+
+    public void setCartridgeStatistics(CartridgeStatistics[] cartridgeStatistics) {
+        this.cartridgeStatistics = cartridgeStatistics;
+    }
+
+    public CartridgeStatistics getTotalCartridgeHours() {
+        return totalCartridgeHours;
+    }
+
+    public void setTotalCartridgeHours(CartridgeStatistics totalCartridgeHours) {
+        this.totalCartridgeHours = totalCartridgeHours;
+    }
+
+    public TenantUsage() {
+        // empty method required for used in web services
+    }
+
+    public TenantUsage(int tenantId, String domain) {
+        this.tenantId = tenantId;
+        this.domain = domain;
+    }
+
+    public int getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(int tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    public UsageEntry[] getUsageEntries() {
+        return usageEntries;
+    }
+
+    public void setUsageEntries(UsageEntry[] usageEntries) {
+        this.usageEntries = usageEntries;
+    }
+
+    public RequestStatistics[] getRequestStatistics() {
+        return requestStatistics;
+    }
+
+    public void setRequestStatistics(RequestStatistics[] requestStatistics) {
+        this.requestStatistics = requestStatistics;
+    }
+
+    public TenantDataCapacity getRegistryCapacity() {
+        return registryCapacity;
+    }
+
+    public void setRegistryCapacity(TenantDataCapacity registryCapacity) {
+        this.registryCapacity = registryCapacity;
+    }
+
+    public int getNumberOfUsers() {
+        return numberOfUsers;
+    }
+
+    public void setNumberOfUsers(int numberOfUsers) {
+        this.numberOfUsers = numberOfUsers;
+    }
+
+    public long getRegistryContentCapacity(){
+        long retValue = 0;
+        if (registryCapacity != null) {
+            retValue = registryCapacity.getRegistryContentCapacity();
+        }
+        return retValue;
+    }
+
+    public long getRegistryContentHistoryCapacity(){
+        long retValue = 0;
+        if (registryCapacity != null) {
+            retValue = registryCapacity.getRegistryContentHistoryCapacity();
+        }
+        return retValue;
+    }
+
+    public long getTotalIncomingBandwidth(){
+        long incomingBW =  0;
+        if(totalRegistryBandwidth != null){
+            incomingBW += totalRegistryBandwidth.getIncomingBandwidth();
+        }
+        if(totalServiceBandwidth != null){
+            incomingBW += totalServiceBandwidth.getIncomingBandwidth();
+        }
+        if(totalWebappBandwidth != null){
+            incomingBW += totalWebappBandwidth.getIncomingBandwidth();
+        }
+        return incomingBW;
+    }
+
+    public long getTotalOutgoingBandwidth(){
+        long outgoingBW =  0;
+        if(totalRegistryBandwidth != null){
+            outgoingBW += totalRegistryBandwidth.getOutgoingBandwidth();
+        }
+        if(totalServiceBandwidth != null){
+            outgoingBW += totalServiceBandwidth.getOutgoingBandwidth();
+        }
+        if(totalWebappBandwidth != null){
+            outgoingBW += totalWebappBandwidth.getOutgoingBandwidth();
+        }
+        return outgoingBW;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/UsageEntry.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/UsageEntry.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/UsageEntry.java
new file mode 100644
index 0000000..04e8be2
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/beans/UsageEntry.java
@@ -0,0 +1,49 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.beans;
+
+public class UsageEntry {
+    private String key;
+    private String value;
+
+    public UsageEntry() {
+        // empty constructor to used in web services
+    }
+
+    public UsageEntry(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/internal/UsageServiceComponent.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/internal/UsageServiceComponent.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/internal/UsageServiceComponent.java
new file mode 100644
index 0000000..2c3b133
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/internal/UsageServiceComponent.java
@@ -0,0 +1,101 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.internal;
+
+import org.apache.stratos.usage.util.Util;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.service.component.ComponentContext;
+import org.wso2.carbon.registry.core.service.RegistryService;
+import org.wso2.carbon.user.core.service.RealmService;
+import org.wso2.carbon.utils.ConfigurationContextService;
+import org.wso2.carbon.ndatasource.core.DataSourceService;
+
+/**
+ * @scr.component name="org.wso2.carbon.usage" immediate="true"
+ * @scr.reference name="registry.service"
+ * interface="org.wso2.carbon.registry.core.service.RegistryService" cardinality="1..1"
+ * policy="dynamic" bind="setRegistryService" unbind="unsetRegistryService"
+ * @scr.reference name="user.realmservice.default" 
+ * interface="org.wso2.carbon.user.core.service.RealmService" cardinality="1..1" 
+ * policy="dynamic" bind="setRealmService" unbind="unsetRealmService"
+ * @scr.reference name="config.context.service" 
+ * interface="org.wso2.carbon.utils.ConfigurationContextService" cardinality="1..1" 
+ * policy="dynamic" bind="setConfigurationContextService" unbind="unsetConfigurationContextService"
+ * @scr.reference name="datasources.service"
+ * interface="org.wso2.carbon.ndatasource.core.DataSourceService"
+ * cardinality="1..1" policy="dynamic"
+ * bind="setDataSourceService" unbind="unsetDataSourceService"
+ */
+public class UsageServiceComponent {
+    private static Log log = LogFactory.getLog(UsageServiceComponent.class);
+
+
+    protected void activate(ComponentContext context) {
+        try {
+            Util.registerRetrieverServices(context.getBundleContext());
+            log.debug("******* Usage bundle is activated ******* ");    
+        } catch (Exception e) {
+            log.error("******* Error in activating Usage bundle ******* ");
+        }
+    }
+
+    protected void deactivate(ComponentContext context) {
+        log.debug("******* Usage is deactivated ******* ");
+    }
+
+    protected void setRegistryService(RegistryService registryService) {
+        Util.setRegistryService(registryService);
+    }
+
+    protected void unsetRegistryService(RegistryService registryService) {
+        Util.setRegistryService(null);
+    }
+
+    protected void setRealmService(RealmService realmService) {
+        Util.setRealmService(realmService);
+    }
+
+    protected void unsetRealmService(RealmService realmService) {
+        Util.setRealmService(null);
+    }
+    
+    protected void setConfigurationContextService(ConfigurationContextService ccService) {
+        //commented to work with the local transport
+	/*ConfigurationContext serverCtx = ccService.getServerConfigContext();
+        AxisConfiguration serverConfig = serverCtx.getAxisConfiguration();
+        LocalTransportReceiver.CONFIG_CONTEXT = new ConfigurationContext(serverConfig);
+        LocalTransportReceiver.CONFIG_CONTEXT.setServicePath("services");
+        LocalTransportReceiver.CONFIG_CONTEXT.setContextRoot("local:/");
+	*/
+        Util.setConfigurationContextService(ccService);
+    }
+
+    protected void unsetConfigurationContextService(ConfigurationContextService ccService) {
+        Util.setConfigurationContextService(null);
+    }
+
+    protected void setDataSourceService(DataSourceService dataSourceService){
+        Util.setDataSourceService(dataSourceService);
+    }
+    
+    protected void unsetDataSourceService(DataSourceService dataSourceService){
+        Util.setDataSourceService(null);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/df3475cc/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/services/UsageService.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/services/UsageService.java b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/services/UsageService.java
new file mode 100644
index 0000000..c7714bb
--- /dev/null
+++ b/components/org.apache.stratos.usage/src/main/java/org/apache/stratos/usage/services/UsageService.java
@@ -0,0 +1,204 @@
+/*
+ *Licensed to the Apache Software Foundation (ASF) under one
+ *or more contributor license agreements.  See the NOTICE file
+ *distributed with this work for additional information
+ *regarding copyright ownership.  The ASF licenses this file
+ *to you 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.apache.stratos.usage.services;
+
+import org.apache.stratos.usage.beans.InstanceUsageStatics;
+import org.apache.stratos.usage.beans.PaginatedInstanceUsage;
+import org.apache.stratos.usage.beans.PaginatedTenantUsageInfo;
+import org.apache.stratos.usage.util.Util;
+import org.apache.stratos.common.util.CommonUtil;
+import org.wso2.carbon.core.AbstractAdmin;
+import org.wso2.carbon.registry.core.session.UserRegistry;
+import org.apache.stratos.usage.beans.TenantUsage;
+import org.wso2.carbon.user.core.tenant.Tenant;
+import org.wso2.carbon.user.core.tenant.TenantManager;
+
+import java.text.ParseException;
+import java.util.*;
+
+public class UsageService extends AbstractAdmin {
+    /**
+     * Return the usage of the current logged in tenant
+     *
+     * @param yearMonth year month
+     * @return the current usage of the tenant
+     * @throws Exception
+     */
+    public TenantUsage retrieveCurrentTenantUsage(String yearMonth) throws Exception {
+        UserRegistry registry = (UserRegistry) getConfigUserRegistry();
+        int tenantId = registry.getTenantId();
+        return Util.getTenantUsageRetriever().getTenantUsage(tenantId, yearMonth);
+    }
+
+    /**
+     * Return the all the tenant usages, requires super admin permissions
+     *
+     * @param yearMonth
+     * @return
+     * @throws Exception
+     */
+    public TenantUsage[] retrieveTenantUsages(String yearMonth) throws Exception {
+        TenantManager tenantManager = Util.getRealmService().getTenantManager();
+        Tenant[] tenants = (Tenant[]) tenantManager.getAllTenants();
+        List<TenantUsage> tenantUsages = new ArrayList<TenantUsage>();
+        for (Tenant tenant : tenants) {
+            if (tenant.isActive()) {
+                TenantUsage tenantUsage = Util.getTenantUsageRetriever().getTenantUsage(
+                        tenant.getId(), yearMonth);
+                tenantUsages.add(tenantUsage);
+            }
+        }
+        return tenantUsages.toArray(new TenantUsage[tenantUsages.size()]);
+    }
+
+    /**
+     * Return the all the tenant usages paginated, requires super admin permissions
+     *
+     * @param yearMonth
+     * @param pageNumber
+     * @param entriesPerPage
+     * @return PaginatedTenantUsageInfo
+     * @throws Exception
+     */
+    public PaginatedTenantUsageInfo retrievePaginatedTenantUsages(String yearMonth, int pageNumber,
+                                                                  int entriesPerPage) throws Exception {
+        TenantManager tenantManager = Util.getRealmService().getTenantManager();
+        Tenant[] tenants = (Tenant[]) tenantManager.getAllTenants();
+        List<TenantUsage> tenantUsages = new ArrayList<TenantUsage>();
+
+        int i = 0;
+        int numberOfPages = 0;
+        for (Tenant tenant : tenants) {
+            if (tenant.isActive()) {
+                if (i % entriesPerPage == 0) {
+                    numberOfPages++;
+                }
+                if (numberOfPages == pageNumber) {
+                    TenantUsage tenantUsage = Util.getTenantUsageRetriever().getTenantUsage(
+                            tenant.getId(), yearMonth);
+                    tenantUsages.add(tenantUsage);
+                }
+                i++;
+            }
+        }
+        PaginatedTenantUsageInfo paginatedTenantInfo = new PaginatedTenantUsageInfo();
+        paginatedTenantInfo.setTenantUsages(
+                tenantUsages.toArray(new TenantUsage[tenantUsages.size()]));
+        paginatedTenantInfo.setNumberOfPages(numberOfPages);
+        paginatedTenantInfo.setPageNumber(pageNumber);
+        return paginatedTenantInfo;
+    }
+
+    /**
+     * Returns usage of a particular tenant, requires super admin permissions
+     *
+     * @param yearMonth
+     * @param tenantId
+     * @return
+     * @throws Exception
+     */
+    public TenantUsage retrieveTenantUsage(String yearMonth, int tenantId) throws Exception {
+        return Util.getTenantUsageRetriever().getTenantUsage(tenantId, yearMonth);
+    }
+
+    public InstanceUsageStatics[] retrieveInstanceUsage() throws Exception {
+        return Util.getTenantUsageRetriever().getInstanceUsages();
+    }
+
+    /**
+     * @param yearMonth      year and month that used to retrieve data
+     * @param pageNumber
+     * @param entriesPerPage number of entries per page
+     * @return PaginatedInstanceUsage object that hold instance data and other parameters
+     * @throws Exception when retrieving Paginated Instance Usage error occurs
+     */
+    public PaginatedInstanceUsage retrievePaginatedInstanceUsage(String yearMonth, int pageNumber,
+                                                                 int entriesPerPage) throws Exception {
+        InstanceUsageStatics[] instanceUsages = retrieveInstanceUsage();
+        List<InstanceUsageStatics> instanceUsagesList = new ArrayList<InstanceUsageStatics>();
+        PaginatedInstanceUsage paginatedInstanceUsages = new PaginatedInstanceUsage();
+        int i = 0;
+        int numberOfPages = 0;
+        if (instanceUsages != null && instanceUsages.length > 0) {
+            for (InstanceUsageStatics usage : instanceUsages) {
+                InstanceUsageStatics instance = getValidUsageEntry(usage, yearMonth);
+                if (instance != null) {
+                    if (i % entriesPerPage == 0) {
+                        numberOfPages++;
+                    }
+                }
+            }
+
+            paginatedInstanceUsages.setInstanceUsages(
+                instanceUsagesList.toArray(new InstanceUsageStatics[instanceUsagesList.size()]));
+        } else {
+            paginatedInstanceUsages.setInstanceUsages(null);
+        }
+
+        paginatedInstanceUsages.setNumberOfPages(numberOfPages);
+        paginatedInstanceUsages.setPageNumber(pageNumber);
+        return paginatedInstanceUsages;
+    }
+
+    /**
+     * @param usage     is Instance usage Statics object that holds data
+     * @param yearMonth year and month that need to check with instance usage data
+     * @return instance static if instance usage data match with given year and month, else null
+     */
+    public InstanceUsageStatics getValidUsageEntry(InstanceUsageStatics usage, String yearMonth) {
+        Date date = Calendar.getInstance().getTime();
+        if (yearMonth != null) {
+            try {
+                date = CommonUtil.getDateFromMonthString(yearMonth);
+            } catch (ParseException e) {
+
+            }
+        }
+        Calendar startDate = Calendar.getInstance();
+        startDate.setTime(date);
+        Calendar endDate = (Calendar) startDate.clone();
+        endDate.add(Calendar.MONTH, 1);
+        if (usage.getStartTime().compareTo(startDate) <= 0 && usage.getStopTime().compareTo(endDate) >= 0) {
+            usage.setUsedTimeInSeconds((endDate.getTimeInMillis() -
+                    startDate.getTimeInMillis()) / 1000);
+            return usage;
+        }
+        if (usage.getStartTime().compareTo(startDate) > 0 && usage.getStartTime().compareTo(endDate) < 0) {
+            if (usage.getStopTime().compareTo(endDate) < 0) {
+                usage.setUsedTimeInSeconds((usage.getStopTime().getTimeInMillis() -
+                        usage.getStartTime().getTimeInMillis()) / 1000);
+                return usage;
+
+            } else if (usage.getStopTime().compareTo(endDate) > 0) {
+                usage.setUsedTimeInSeconds((endDate.getTimeInMillis() -
+                        usage.getStartTime().getTimeInMillis()) / 1000);
+                return usage;
+
+            }
+        }
+        if (usage.getStartTime().compareTo(startDate) < 0 && usage.getStopTime().compareTo(endDate) < 0) {
+            if (usage.getStopTime().compareTo(startDate) > 0) {
+                usage.setUsedTimeInSeconds((usage.getStopTime().getTimeInMillis() -
+                        startDate.getTimeInMillis()) / 1000);
+                return usage;
+            }
+        }
+        return null;
+    }
+}