package com.baidubce.services.ruleengine; import com.baidubce.AbstractBceClient; import com.baidubce.BceClientConfiguration; import com.baidubce.BceClientException; import com.baidubce.auth.DefaultBceCredentials; import com.baidubce.http.Headers; import com.baidubce.http.HttpMethodName; import com.baidubce.http.handler.BceErrorResponseHandler; import com.baidubce.http.handler.BceJsonResponseHandler; import com.baidubce.http.handler.BceMetadataResponseHandler; import com.baidubce.http.handler.HttpResponseHandler; import com.baidubce.internal.InternalRequest; import com.baidubce.internal.RestartableInputStream; import com.baidubce.model.AbstractBceRequest; import com.baidubce.model.AbstractBceResponse; import com.baidubce.model.GenericAccountRequest; import com.baidubce.services.ruleengine.model.CreateRuleRequest; import com.baidubce.services.ruleengine.model.DeleteRulesRequest; import com.baidubce.services.ruleengine.model.Destination; import com.baidubce.services.ruleengine.model.ListRuleRequest; import com.baidubce.services.ruleengine.model.ListRuleResponse; import com.baidubce.services.ruleengine.model.Rule; import com.baidubce.services.ruleengine.model.UpdateRuleRequest; import com.baidubce.util.HttpUtils; import com.baidubce.util.JsonUtils; import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.ArrayList; import java.util.List; /** * Created by yuanyoujun on 2016/10/9. * * Client to create/update/delete/list rules for IoT */ public class RuleEngineClient extends AbstractBceClient { private static final String CONTENT_TYPE = "application/json;charset=UTF-8"; private static final String VERSION = "v1"; private static final String RULES = "rules"; private static final String DISABLE = "disable"; private static final String ENABLE = "enable"; private static final String BATCH = "batch"; private static final String DELETE = "delete"; private static final String DESTINATIONS = "destinations"; private static final String ENDPOINT = "http://re.iot.gz.baidubce.com"; /** * Responsible for handling HttpResponse from all Tsdb service calls. */ private static final HttpResponseHandler[] HANDLERS = new HttpResponseHandler[] { new BceMetadataResponseHandler(), new BceErrorResponseHandler(), new BceJsonResponseHandler() }; public RuleEngineClient(BceClientConfiguration config) { super(config.getEndpoint() == null ? config.withEndpoint(ENDPOINT) : config, HANDLERS); } public RuleEngineClient(String accessKey, String secretKey) { this(new BceClientConfiguration() .withCredentials(new DefaultBceCredentials(accessKey, secretKey)) .withEndpoint(ENDPOINT)); } /** * list all the rules under this account * @param request: specify the pageNo, pageSize etc. * @return all or a subset of rules according to pageNo, and pageSize */ public ListRuleResponse listRules(ListRuleRequest request) { InternalRequest internalRequest = createRequest(request, HttpMethodName.GET, RULES); return this.invokeHttpClient(internalRequest, ListRuleResponse.class); } public Rule getRule(String uuid) { InternalRequest internalRequest = createRequest(new GenericAccountRequest(), HttpMethodName.GET, RULES, uuid); return this.invokeHttpClient(internalRequest, Rule.class); } public Rule createRule(CreateRuleRequest request) { InternalRequest internalRequest = createRequest(request, HttpMethodName.POST, RULES); return this.invokeHttpClient(internalRequest, Rule.class); } public Rule updateRule(UpdateRuleRequest request) { InternalRequest internalRequest = createRequest(request, HttpMethodName.PUT, RULES, request.getUuid()); return this.invokeHttpClient(internalRequest, Rule.class); } public void deleteRule(DeleteRulesRequest request) { InternalRequest internalRequest = createRequest(request, HttpMethodName.POST, RULES, BATCH, DELETE); this.invokeHttpClient(internalRequest, AbstractBceResponse.class); } public void disableRule(String ruleId) { InternalRequest internalRequest = createRequest(new GenericAccountRequest(), HttpMethodName.PUT, RULES, ruleId, DISABLE); this.invokeHttpClient(internalRequest, AbstractBceResponse.class); } public void enableRule(String ruleId) { InternalRequest internalRequest = createRequest(new GenericAccountRequest(), HttpMethodName.PUT, RULES, ruleId, ENABLE); this.invokeHttpClient(internalRequest, AbstractBceResponse.class); } public Rule createDestination(Destination request) { InternalRequest internalRequest = createRequest(request, HttpMethodName.POST, DESTINATIONS); return this.invokeHttpClient(internalRequest, Rule.class); } public void deleteDestination(String uuid) { InternalRequest internalRequest = createRequest(new GenericAccountRequest(), HttpMethodName.DELETE, DESTINATIONS, uuid); this.invokeHttpClient(internalRequest, AbstractBceResponse.class); } private InternalRequest createRequest(AbstractBceRequest bceRequest, HttpMethodName httpMethod, String... pathVariables) { List<String> path = new ArrayList<String>(); path.add(VERSION); if (pathVariables != null) { for (String pathVariable : pathVariables) { path.add(pathVariable); } } URI uri = HttpUtils.appendUri(this.getEndpoint(), path.toArray(new String[path.size()])); InternalRequest request = new InternalRequest(httpMethod, uri); request.setCredentials(bceRequest.getRequestCredentials()); if (httpMethod == HttpMethodName.POST || httpMethod == HttpMethodName.PUT) { fillInHeadAndBody(bceRequest, request); } return request; } private void fillInHeadAndBody(AbstractBceRequest bceRequest, InternalRequest request) { byte[] content = toJson(bceRequest); request.addHeader(Headers.CONTENT_LENGTH, Integer.toString(content.length)); request.addHeader(Headers.CONTENT_TYPE, CONTENT_TYPE); request.setContent(RestartableInputStream.wrap(content)); } private byte[] toJson(AbstractBceRequest bceRequest) { String jsonStr = JsonUtils.toJsonString(bceRequest); try { return jsonStr.getBytes(DEFAULT_ENCODING); } catch (UnsupportedEncodingException e) { throw new BceClientException("Fail to get UTF-8 bytes", e); } } }