All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bdware.irp.client.InternalIrpClient Maven / Gradle / Ivy

There is a newer version: 1.5.4
Show newest version
package org.bdware.irp.client;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import com.nimbusds.jose.jwk.JWK;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bdware.irp.exception.IrpClientException;
import org.bdware.irp.irplib.core.IrpMessageSigner;
import org.bdware.irp.irplib.exception.IrpConnectException;
import org.bdware.irp.stateinfo.StateInfoBase;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class InternalIrpClient implements IrpClient {

    JWK clientKeyPair;
    String LHSUrl;
    static Logger logger = LogManager.getLogger(InternalIrpClient.class);
    String ClientID;

    public InternalIrpClient(JWK kp, String clientID, String LHSUrl) {
        this.clientKeyPair = kp;
        this.ClientID = clientID;
        this.LHSUrl = LHSUrl;
    }

    @Override
    public StateInfoBase resolve(String handle) throws IrpClientException {
        String response = resolveFromLHS(handle);
        JsonObject resp = new Gson().fromJson(response, JsonObject.class);
        StateInfoBase hr = new StateInfoBase();
        if (resp == null || !resp.has("identifier")
                || (resp.has("status"))) {
            throw new IrpClientException(response);
        }
        hr.identifier = resp.get("identifier").getAsString();
        if (resp.has("handleValues"))
            hr.handleValues = resp.getAsJsonObject("handleValues");
        else
            hr.handleValues = resp;
        return hr;
    }

    @Override
    public String register(StateInfoBase hr) throws IrpClientException {
        Map map = hrToMap(hr);
        map.remove("identifier");
        map.put("action", "register");
        String response = signAndSend(map);
        JsonObject resp = new Gson().fromJson(response, JsonObject.class);
        if (resp == null || !resp.has("identifier")) {
            throw new IrpClientException(response);
        }
        return resp.get("identifier").getAsString();
    }

    @Override
    public List batchRegister(StateInfoBase hr, int count) throws IrpClientException {
        Map map = hrToMap(hr);
        map.remove("identifier");
        map.put("action", "register");
        map.put("count", String.valueOf(count));
        String response = signAndSend(map);
        JsonObject resp = new Gson().fromJson(response, JsonObject.class);
        List idList = new Gson().fromJson(resp.get("identifier").getAsString(), new TypeToken>() {
        }.getType());
        if (idList == null) {
            throw new IrpClientException(response);
        }
        return idList;
    }

    @Override
    public void close() {

    }

    @Override
    public void connect(String url) {

    }

    @Override
    public void connect(String clientID, String LHSUrl, IrpMessageSigner signer) {

    }

    @Override
    public void reconnect() throws IrpConnectException {

    }

    @Override
    public boolean isConnected() {
        return false;
    }

    @Override
    public String reRegister(StateInfoBase hr) throws IrpClientException {
        if (hr.identifier == null) {
            logger.warn("handle need to be set.");
        }
        Map map = hrToMap(hr);
        map.put("identifier", hr.identifier);
        map.put("action", "reregister");
        String response = signAndSend(map);
        JsonObject resp = new Gson().fromJson(response, JsonObject.class);
        if (resp == null || !resp.has("identifier")) {
            throw new IrpClientException(response);
        }
        return resp.get("identifier").getAsString();
    }

    @Override
    public String unRegister(String handle) {
        Map map = new HashMap<>();
        map.put("identifier", handle);
        map.put("action", "unregister");
        return signAndSend(map);
    }


    private String signAndSend(Map map) {
//        map.put("dou",this.ClientID);
//        String reqMapStr = MapToString(map);
//        if(clientKeyPair != null){
//            try {
//                byte[] signature = CertUtils.Sign(reqMapStr.getBytes(), clientKeyPair.getPrivate());
//                map.put("signature",new String(signature));
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//        }
        return sendPost(map, LHSUrl + getSubUrl());
    }

    public String sendPost(Map reqMap, String url) {
        String result;
        HttpPost post = new HttpPost(url);
        try {
            CloseableHttpClient httpClient = HttpClients.createDefault();
            List params = new ArrayList<>();
            for (String keys : reqMap.keySet()) {
                params.add(new BasicNameValuePair(keys, reqMap.get(keys)));
            }
            UrlEncodedFormEntity postForm = new UrlEncodedFormEntity(params, "utf-8");
            post.setEntity(postForm);
            HttpResponse response = httpClient.execute(post);

            InputStream in = response.getEntity().getContent();
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));
            StringBuilder strber = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null) {
                strber.append(line + '\n');
            }
            br.close();
            in.close();
            result = strber.toString();
            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                result = "服务器异常";
            }
        } catch (Exception e) {
            System.out.println("请求异常");
            throw new RuntimeException(e);
        } finally {
            post.abort();
        }
        return result;
    }

    public String resolveFromLHS(String id) {
        String result;
        String resolveUrl = LHSUrl + "resolve?identifier=" + id;
        HttpGet httpGet = new HttpGet(resolveUrl);
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse response = null;
        InputStream in = null;
        BufferedReader br = null;
        try {
            httpClient = HttpClients.createDefault();
            response = httpClient.execute(httpGet);
            in = response.getEntity().getContent();
            br = new BufferedReader(new InputStreamReader(in, "utf-8"));
            StringBuilder strber = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null) {
                strber.append(line + '\n');
            }
            result = strber.toString();
            if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                result = "服务器异常";
            }
        } catch (Exception e) {
            System.out.println("请求异常");
            throw new RuntimeException(e);
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (response != null) {
                try {
                    response.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (httpClient != null) {
                try {
                    httpClient.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    private HashMap hrToMap(StateInfoBase handleRecord) {
        HashMap hrMap = new HashMap<>();
        for (String keys : handleRecord.handleValues.keySet()) {
            hrMap.put(keys, handleRecord.handleValues.get(keys).getAsString());
        }
        String className = handleRecord.getClass().getSimpleName();
        switch (className) {
            case "DoStateInfo":
                hrMap.put("hrType", "do");
                break;
            case "DoipServiceStateInfo":
                hrMap.put("hrType", "org/bdware/doip");
                break;
            case "UserStateInfo":
                hrMap.put("hrType", "dou");
                break;
            default:
                logger.error("use specific handle record class instead.");
                break;
        }
        return hrMap;
    }

    private String getSubUrl() {
        return "local/";
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy