org.openmeetings.app.sip.xmlrpc.OpenXGHttpClient.java Source code

Java tutorial

Introduction

Here is the source code for org.openmeetings.app.sip.xmlrpc.OpenXGHttpClient.java

Source

/*
 * 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.openmeetings.app.sip.xmlrpc;

import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Date;

import javax.net.ssl.SSLContext;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.openmeetings.app.OpenmeetingsVariables;
import org.openmeetings.app.data.basic.Configurationmanagement;
import org.openmeetings.app.persistence.beans.basic.Configuration;
import org.openmeetings.app.persistence.beans.sip.OpenXGReturnObject;
import org.openmeetings.app.persistence.beans.user.UserSipData;
import org.openmeetings.app.sip.xmlrpc.custom.OpenXGCustomXMLMarshall;
import org.openmeetings.app.sip.xmlrpc.custom.dao.OpenXGReturnObjectDaoImpl;
import org.openmeetings.utils.crypt.MD5;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class OpenXGHttpClient {

    private static final Logger log = Red5LoggerFactory.getLogger(OpenXGHttpClient.class,
            OpenmeetingsVariables.webAppRootKey);
    @Autowired
    private Configurationmanagement cfgManagement;
    @Autowired
    private OpenXGReturnObjectDaoImpl openXGReturnObjectDao;

    public String digest_calculate(Object[] params) throws Exception {
        String stringToMd5 = "";

        for (int i = 0; i < params.length; i++) {
            stringToMd5 += params[i];
        }

        return MD5.do_checksum(stringToMd5);

    }

    public void openSIPgUserCreateTest() {
        try {

            String first_name = "Matti";
            String middle_i = "X";
            String last_name = "Virtanen";
            String email = "test@test.de";
            String password = "password";

            this.openSIPgUserCreateUser(first_name, middle_i, last_name, email, password, "test");

        } catch (Exception err) {

            log.error("[openSIPgUserCreateTest]", err);

        }
    }

    /**
     * 
     * Creates a SIP User using the RPC Methods of openXG
     * 
     * @param first_name
     * @param middle_i
     * @param last_name
     * @param email
     * @param password
     * @return
     */
    public UserSipData openSIPgUserCreateUser(String first_name, String middle_i, String last_name, String email,
            String login, String password) {
        try {

            // Check if the OpenXG Gateway is enabled in general
            Configuration sip_openxg_enable = cfgManagement.getConfKey(3L, "sip.openxg.enable");

            if (sip_openxg_enable == null || !sip_openxg_enable.getConf_value().equals("yes")) {
                log.debug("SIP is disabled");
                return null;
            }

            // client_id and client_secret
            Configuration openxg_client_id = cfgManagement.getConfKey(3L, "openxg.client.id");
            Configuration openxg_client_secret = cfgManagement.getConfKey(3L, "openxg.client.secret");
            if (openxg_client_id == null || openxg_client_secret == null) {
                throw new Exception("openxg.client.id or openxg.client.secret missing in Configuration table");
            }
            String client_id = openxg_client_id.getConf_value();
            String client_secret = openxg_client_secret.getConf_value();

            // domain
            Configuration openxg_client_domain = cfgManagement.getConfKey(3L, "openxg.client.domain");
            if (openxg_client_domain == null) {
                throw new Exception("openxg.client.domain missing in Configuration table");
            }
            String domain = openxg_client_domain.getConf_value();

            // openxg_community_code
            Configuration openxg_community_code = cfgManagement.getConfKey(3L, "openxg.community.code");
            if (openxg_community_code == null) {
                throw new Exception("openxg.community.code missing in Configuration table");
            }
            String community_code = openxg_community_code.getConf_value();

            // language_code
            Configuration openxg_language_code = cfgManagement.getConfKey(3L, "openxg.language.code");
            if (openxg_language_code == null) {
                throw new Exception("openxg.language.code missing in Configuration table");
            }
            String language_code = openxg_language_code.getConf_value();

            // adminid
            Configuration openxg_adminid = cfgManagement.getConfKey(3L, "openxg.adminid");
            if (openxg_adminid == null) {
                throw new Exception("openxg.adminid missing in Configuration table");
            }
            String adminid = openxg_adminid.getConf_value();

            // sip_language_phonecode, for example +358, is important as port of
            // the
            // number/login for the SIP-User via the applet
            Configuration sip_language_phonecode = cfgManagement.getConfKey(3L, "sip.language.phonecode");

            if (sip_language_phonecode == null) {
                throw new Exception("No sip.language.phonecode set in Configuration");
            }

            // Calculate the number in national format
            Configuration sip_phonerange_start = cfgManagement.getConfKey(3L, "sip.phonerange.start");
            Configuration sip_phonerange = cfgManagement.getConfKey(3L, "sip.phonerange");
            Configuration sip_phonerange_currentindex = cfgManagement.getConfKey(3L, "sip.phonerange.currentindex");
            if (sip_phonerange_start == null || sip_phonerange == null || sip_phonerange_currentindex == null) {
                throw new Exception(
                        "sip.phonerange.start, sip.phonerange or sip.phonerange.currentindex missing in Configuration table");
            }

            // Long sipPhoneRangeStart =
            // Long.parseLong(sip_phonerange_start.getConf_value());
            // Long sipPhoneRange =
            // Long.parseLong(sip_phonerange.getConf_value());
            // Long sipPhoneRangeCurrentIndex =
            // Long.parseLong(sip_phonerange_currentindex.getConf_value());

            // Not sure anymore if this is really needed, we don't need a number
            // in national format
            // if (sipPhoneRangeCurrentIndex >= sipPhoneRange) {
            // throw new
            // Exception("You have no more numbers, you need to allocate more numbers and alter the Configuration value sip.phonerange");
            // }

            // Long useridAsNumber = sipPhoneRangeStart +
            // sipPhoneRangeCurrentIndex;
            //
            // log.debug("(sip_phonerange_start.getConf_value().length()) "+(sip_phonerange_start.getConf_value().length()+1));
            //
            // //The userid == the Number allocated in National Format!
            // //The userid is calculated on the number of available numbers in
            // the range
            // String userid =
            // String.format("%0"+(sip_phonerange_start.getConf_value().length())+"d",
            // useridAsNumber);

            String userid = login;

            // sipPhoneRangeCurrentIndex++;
            // sip_phonerange_currentindex.setConf_value(""+sipPhoneRangeCurrentIndex);

            // cfgManagement.updateConfig(sip_phonerange_currentindex);

            String digest = this.digest_calculate(new Object[] { client_id, userid, domain, first_name, middle_i,
                    last_name, password, community_code, language_code, email, adminid, client_secret });

            // Get the XML-String representative
            String stringToPost = OpenXGCustomXMLMarshall.getInstance().openSIPgUserCreate(client_id, digest,
                    userid, domain, first_name, middle_i, last_name, password, community_code, language_code, email,
                    adminid);

            OpenXGReturnObject openXGReturnObject = this.openSIPgPost(stringToPost);

            openXGReturnObject.setMethodName("OpenSIPg.UserCreate");

            openXGReturnObjectDao.addOpenXGReturnObject(openXGReturnObject);

            log.debug(" Status_code " + openXGReturnObject.getStatus_code());
            log.debug(" Status_string " + openXGReturnObject.getStatus_string());

            if (openXGReturnObject.getStatus_code().equals("200")) {

                // Add User URI
                String digestURI = this
                        .digest_calculate(new Object[] { client_id, userid, domain, adminid, client_secret });

                // Get the XML-String representative
                String stringToPostURI = OpenXGCustomXMLMarshall.getInstance().openSIPgURIUserIDAdd(client_id,
                        digestURI, userid, domain, adminid);

                OpenXGReturnObject openXGReturnObjectURI = this.openSIPgPost(stringToPostURI);

                openXGReturnObjectURI.setMethodName("OpenSIPg.URIUserIDAdd");

                openXGReturnObjectDao.addOpenXGReturnObject(openXGReturnObjectURI);

                log.debug(" openXGReturnObjectURI Status Code " + openXGReturnObjectURI.getStatus_code());
                log.debug(" openXGReturnObjectURI Status String " + openXGReturnObjectURI.getStatus_string());

                UserSipData userSipData = new UserSipData();

                // userSipData.setUsername(sip_language_phonecode.getConf_value()
                // + useridAsNumber);
                userSipData.setUsername(userid);
                userSipData.setUserpass(password);
                userSipData.setAuthId(userid);

                return userSipData;

            } else {

                throw new Exception("Could not add SIP User - Gateway response Error Code: "
                        + openXGReturnObject.getStatus_code() + " Message: "
                        + openXGReturnObject.getStatus_string());

            }

        } catch (Exception err) {

            log.error("[openSIPgUserCreateTest]", err);

        }

        return null;
    }

    public OpenXGReturnObject openSIPgCreateConference() {
        try {

            // Check if the OpenXG Gateway is enabled in general
            Configuration sip_openxg_enable = cfgManagement.getConfKey(3L, "sip.openxg.enable");

            if (sip_openxg_enable == null || !sip_openxg_enable.getConf_value().equals("yes")) {
                log.debug("SIP is disabled");
                return null;
            }

            // client_id and client_secret
            Configuration openxg_client_id = cfgManagement.getConfKey(3L, "openxg.client.id");
            Configuration openxg_client_secret = cfgManagement.getConfKey(3L, "openxg.client.secret");
            if (openxg_client_id == null || openxg_client_secret == null) {
                throw new Exception("openxg.client.id or openxg.client.secret missing in Configuration table");
            }
            String client_id = openxg_client_id.getConf_value();
            String client_secret = openxg_client_secret.getConf_value();

            // domain
            Configuration openxg_client_domain = cfgManagement.getConfKey(3L, "openxg.client.domain");
            if (openxg_client_domain == null) {
                throw new Exception("openxg.client.domain missing in Configuration table");
            }
            String domain = openxg_client_domain.getConf_value();

            // language_code
            Configuration openxg_language_code = cfgManagement.getConfKey(3L, "openxg.language.code");
            if (openxg_language_code == null) {
                throw new Exception("openxg.language.code missing in Configuration table");
            }
            String language_code = openxg_language_code.getConf_value();

            // adminid
            Configuration openxg_adminid = cfgManagement.getConfKey(3L, "openxg.adminid");
            if (openxg_adminid == null) {
                throw new Exception("openxg.adminid missing in Configuration table");
            }
            String adminid = openxg_adminid.getConf_value();

            Date d = new Date();
            long starttime = d.getTime() / 1000;

            long endTime = (d.getTime() / 1000) + (60 * 60);

            // "0", "2147483647",

            // permanent conferences
            starttime = 0;
            endTime = 2147483647;

            String digest = this.digest_calculate(new Object[] { client_id, "067201101", domain, "" + starttime,
                    "" + endTime, language_code, adminid, client_secret });

            Configuration openxg_wrapper_url = cfgManagement.getConfKey(3L, "openxg.wrapper.url");

            if (openxg_wrapper_url == null) {
                throw new Exception("No openxg.wrapper.url set in Configuration");
            }

            String strURL = openxg_wrapper_url.getConf_value();

            // Prepare HTTP post
            HttpPost post = new HttpPost(strURL);
            post.addHeader("User-Agent", "OpenSIPg XML_RPC Client");

            // Get the XML-String representative
            String stringToPost = OpenXGCustomXMLMarshall.getInstance().openSIPgCreateConference(client_id, digest,
                    "067201101", domain, "" + starttime, "" + endTime, language_code, adminid);

            OpenXGReturnObject openXGReturnObject = this.openSIPgPost(stringToPost);

            openXGReturnObject.setMethodName("OpenSIPg.UserConferenceAdd");

            openXGReturnObjectDao.addOpenXGReturnObject(openXGReturnObject);

            return openXGReturnObject;

        } catch (Exception err) {

            log.error("[openSIPgUserCreate]", err);

        }

        return null;
    }

    public OpenXGReturnObject openSIPgPost(String stringToPost) {
        try {

            Configuration openxg_wrapper_url = cfgManagement.getConfKey(3L, "openxg.wrapper.url");

            if (openxg_wrapper_url == null) {
                throw new Exception("No openxg.wrapper.url set in Configuration");
            }

            String strURL = openxg_wrapper_url.getConf_value();

            // Prepare HTTP post
            HttpPost post = new HttpPost(strURL);
            post.addHeader("User-Agent", "OpenSIPg XML_RPC Client");

            // log.debug(stringToPost);

            AbstractHttpEntity entity = new ByteArrayEntity(stringToPost.getBytes(Charset.forName("ISO-8859-1")));

            // Prepare HTTP post
            HttpParams params = post.getParams();
            HttpProtocolParams.setContentCharset(params, "utf-8");
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            post.setParams(params);

            // Request content will be retrieved directly
            // from the input stream
            post.setEntity(entity);

            // Get HTTP client
            HttpClient httpclient = getHttpClient();

            // Execute request
            HttpResponse response = httpclient.execute(post);
            int resCode = response.getStatusLine().getStatusCode();

            // Display status code
            log.debug("Response status code: " + response);

            if (resCode == 200) {
                HttpEntity ent = response.getEntity();
                String responseBody = (ent != null) ? EntityUtils.toString(ent) : "";
                log.debug("parseReturnBody " + responseBody);

                OpenXGReturnObject oIG = this.parseOpenXGReturnBody(ent.getContent());

                log.debug("oIG 1 " + oIG.getStatus_code());
                log.debug("oIG 2 " + oIG.getStatus_string());

                return oIG;

            } else {

                throw new Exception("Could not connect to OpenXG, check the URL for the Configuration");

            }

        } catch (Exception err) {

            log.error("[openSIPgUserCreate]", err);

        }

        return null;
    }

    /**
     * 
     * @param inputStream
     * @return
     */
    public OpenXGReturnObject parseOpenXGReturnBody(InputStream inputStream) {
        try {

            OpenXGReturnObject openXGReturnObject = new OpenXGReturnObject();

            // log.debug("parseReturnBody "+inputStream);

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(false);
            factory.setNamespaceAware(false);

            // get a builder to create a DOM document
            DocumentBuilder builder = factory.newDocumentBuilder();

            Document document = builder.parse(inputStream);

            NodeList members = document.getElementsByTagName("member");

            // log.debug("members LENGTH "+members.getLength());

            for (int i = 0; i < members.getLength(); i++) {
                Element member = (Element) members.item(i);

                NodeList name = member.getElementsByTagName("name");

                // log.debug("Name "+name.item(0).getNodeName());

                Node nameTextNode = name.item(0).getFirstChild();

                log.debug("getNodeValue " + nameTextNode.getNodeValue());

                if (nameTextNode.getNodeValue().equals("status_code")) {

                    NodeList string = member.getElementsByTagName("string");

                    // log.debug("Value "+string.item(0).getNodeName());

                    Node valueTextNode = string.item(0).getFirstChild();

                    // log.debug("Value "+valueTextNode.getNodeValue());

                    openXGReturnObject.setStatus_code(valueTextNode.getNodeValue());

                } else if (nameTextNode.getNodeValue().equals("status_string")) {

                    NodeList string = member.getElementsByTagName("string");

                    // log.debug("Value "+string.item(0).getNodeName());

                    Node valueTextNode = string.item(0).getFirstChild();

                    // log.debug("Value "+valueTextNode.getNodeValue());

                    openXGReturnObject.setStatus_string(valueTextNode.getNodeValue());

                } else if (nameTextNode.getNodeValue().equals("conference_number")) {

                    NodeList string = member.getElementsByTagName("string");

                    // log.debug("Value "+string.item(0).getNodeName());

                    Node valueTextNode = string.item(0).getFirstChild();

                    // log.debug("Value "+valueTextNode.getNodeValue());

                    openXGReturnObject.setConferenceNumber(valueTextNode.getNodeValue());

                } else if (nameTextNode.getNodeValue().equals("conference_pin")) {

                    NodeList string = member.getElementsByTagName("string");

                    // log.debug("Value "+string.item(0).getNodeName());

                    Node valueTextNode = string.item(0).getFirstChild();

                    // log.debug("Value "+valueTextNode.getNodeValue());

                    openXGReturnObject.setConferencePin(valueTextNode.getNodeValue());

                }

            }

            return openXGReturnObject;

        } catch (Exception err) {

            log.error("[parseOpenXGReturnBody]", err);

        }
        return null;
    }

    public HttpClient getHttpClient() {
        try {
            SSLSocketFactory sf = new SSLSocketFactory(SSLContext.getInstance("TLS"),
                    SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
            registry.register(new Scheme("https", 443, sf));

            ClientConnectionManager ccm = new ThreadSafeClientConnManager(registry);

            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            return new DefaultHttpClient();
        }
    }
}