org.wso2.carbon.oc.internal.OperationsCenterConnector.java Source code

Java tutorial

Introduction

Here is the source code for org.wso2.carbon.oc.internal.OperationsCenterConnector.java

Source

/*
 * 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.oc.internal;

import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.lang.StringUtils;
import org.wso2.carbon.core.ServerStatus;
import org.wso2.carbon.oc.asset.Machine;
import org.wso2.carbon.oc.asset.Server;

import javax.crypto.Mac;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

public class OperationsCenterConnector {
    private static Logger logger = LoggerFactory.getLogger(OperationsCenterConnector.class);

    /**
     * The http client used to connect Operations Center.
     */
    private HttpClient httpClient;

    boolean isRegistered = false;

    private String ocUrl;
    private static final String REGISTRATION_PATH = "/api/register";
    private static final String UPDATE_PATH = "/api/update";
    private static final String CONTENT_TYPE = "application/json";
    private static final String CHARACTER_SET = "UTF-8";

    //temp
    private JSONArray resJsonArray = new JSONArray();

    //private static  OperationsCenterAgentComponent operationsCenterAgentComponent = new OperationsCenterAgentComponent();

    public OperationsCenterConnector(String ocUrl, String username, String password) {

        this.ocUrl = ocUrl;
        if (StringUtils.isBlank(this.ocUrl)) {
            throw new IllegalArgumentException("Operations Center URL is unspecified.");
        }

        this.httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
        this.httpClient.getState().setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));
        this.httpClient.getParams().setAuthenticationPreemptive(true);
    }

    /**
     * @return
     */
    public HttpClient getHttpClient() {
        return httpClient;
    }

    public void report() {
        logger.info("=============reporting..");

        if (isRegistered) {
            logger.info("sending statistics....!");
            sendStatistic();
        } else {
            //logger.info("registering....!");
            register();
            //logger.info("registered.....!");
        }

    }

    private void sendStatistic() {
        JSONObject jsonObject = new JSONObject();

        //dynamic data [Machine]
        jsonObject.put("freeMemory", "" + Machine.getInstance().getFreeMemoryMB());
        jsonObject.put("usageIdle", "" + Machine.getInstance().getIdleCpuUsage());
        jsonObject.put("usageSystem", "" + Machine.getInstance().getSystemCpuUsage());
        jsonObject.put("usageUser", "" + Machine.getInstance().getUserCpuUsage());

        //dynamic data [Server]

        jsonObject.put("adminServiceUrl", Server.getInstance().getAdminServiceUrl());
        jsonObject.put("serverUpTime", "" + Server.getInstance().getServerUptime());
        jsonObject.put("threadCount", "" + Server.getInstance().getThreadcount());

        JSONObject request = new JSONObject();
        request.put("update", jsonObject);

        String jsonString = request.toJSONString();

        PostMethod postMethod = new PostMethod(ocUrl + UPDATE_PATH);
        try {

            RequestEntity entity = new StringRequestEntity(jsonString, CONTENT_TYPE, CHARACTER_SET);

            postMethod.setRequestEntity(entity);

            try {
                int statusCode = httpClient.executeMethod(postMethod);

                //json parser
                String responseMessage = postMethod.getResponseBodyAsString();

                if (isJsonPassed(responseMessage)) {

                    //add jackson

                    JSONParser parser = new JSONParser();
                    Object obj = parser.parse(responseMessage);
                    JSONObject resObj = (JSONObject) obj;

                    String status = (String) resObj.get("command");

                    if (status.equals(ServerStatus.STATUS_RESTARTING)) {

                        logger.info("[STATISTIC] Response : " + status);
                        try {
                            OperationsCenterAgentDataHolder.getInstance().getiServerAdmin().restart();
                        } catch (Exception e) {
                            logger.info("[STATISTIC] problem while restarting server ");
                        }
                    } else if (status.equals(ServerStatus.STATUS_SHUTTING_DOWN)) {

                        logger.info("[STATISTIC] Response : " + status);
                        try {
                            OperationsCenterAgentDataHolder.getInstance().getiServerAdmin().shutdown();
                        } catch (Exception e) {
                            logger.info("[STATISTIC] problem while shutting down server ");
                        }
                    }

                    else if (status.equals("G_" + ServerStatus.STATUS_RESTARTING)) {

                        logger.info("[STATISTIC] Response : " + status);
                        try {
                            OperationsCenterAgentDataHolder.getInstance().getiServerAdmin().restartGracefully();
                        } catch (Exception e) {
                            logger.info("[STATISTIC] problem while gracefull restart server ");
                        }
                    }

                    else if (status.equals("G_" + ServerStatus.STATUS_SHUTTING_DOWN)) {

                        logger.info("[STATISTIC] Response : " + status);
                        try {
                            OperationsCenterAgentDataHolder.getInstance().getiServerAdmin().shutdownGracefully();
                        } catch (Exception e) {
                            logger.info("[STATISTIC] problem while gracefull shutting down server ");
                        }
                    }

                }

                if (statusCode == HttpStatus.SC_OK) {
                    isRegistered = true;

                } else {
                    logger.error("[STATISTIC] Failed to send stats to the Operations Center, Status Code : "
                            + statusCode);
                }
            } catch (IOException e) {
                logger.error("[STATISTIC] Failed to Execute post method");
                isRegistered = false;
            } catch (ParseException e) {
                logger.error("[STATISTIC] Failed to parse json method");
            }

        } catch (UnsupportedEncodingException e) {
            logger.error("[STATISTIC] Failed to send stats to Operations Center");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            postMethod.releaseConnection();
        }
    }

    private boolean isJsonPassed(String strJson) {
        boolean passed = false;
        JSONParser parser = new JSONParser();
        try {
            parser.parse(strJson);
            passed = true;
        } catch (ParseException e) {
            passed = false;
        }

        return passed;
    }

    private boolean register() {
        JSONObject jsonObject = new JSONObject();

        //registering data [Server]
        jsonObject.put("domain", Server.getInstance().getDomain());
        jsonObject.put("subDomain", Server.getInstance().getSubDomain());
        jsonObject.put("serverName", "" + Server.getInstance().getServerName());
        jsonObject.put("adminServiceUrl", Server.getInstance().getAdminServiceUrl());
        jsonObject.put("startUpTime", "" + Server.getInstance().getServerStartTime());

        //registering data [Machine]
        jsonObject.put("ip", Machine.getInstance().getIp());
        jsonObject.put("osName", Machine.getInstance().getOsName());
        jsonObject.put("cpuCount", Machine.getInstance().getCpuCount());
        jsonObject.put("totalMemory", Machine.getInstance().getTotalMemoryMB());
        jsonObject.put("cpuSpeed", Machine.getInstance().getCpuSpeedGHz());

        JSONObject request = new JSONObject();
        request.put("register", jsonObject);

        String jsonString = request.toJSONString();

        PostMethod postMethod = new PostMethod(ocUrl + REGISTRATION_PATH);
        try {
            RequestEntity entity = new StringRequestEntity(jsonString, CONTENT_TYPE, CHARACTER_SET);
            postMethod.setRequestEntity(entity);

            try {
                int statusCode = httpClient.executeMethod(postMethod);
                if (statusCode == HttpStatus.SC_OK) {
                    isRegistered = true;
                    logger.info("[REGISTER] Registered in Operations Center successfully.");
                } else {
                    logger.error("[REGISTER] Failed to register in Operations Center, Status Code : " + statusCode);
                }
            } catch (IOException e) {
                logger.error("[REGISTER] Failed to Execute post method");
                return false;
            }

        } catch (UnsupportedEncodingException e) {
            logger.error("[REGISTER] Failed to register with Operations Center");
            isRegistered = false;
        } finally {
            postMethod.releaseConnection();
        }

        return true;
    }
}