2 * //******************************************************************
4 * // Copyright 2016 Samsung Electronics All Rights Reserved.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
8 * // Licensed under the Apache License, Version 2.0 (the "License");
9 * // you may not use this file except in compliance with the License.
10 * // You may obtain a copy of the License at
12 * // http://www.apache.org/licenses/LICENSE-2.0
14 * // Unless required by applicable law or agreed to in writing, software
15 * // distributed under the License is distributed on an "AS IS" BASIS,
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * // See the License for the specific language governing permissions and
18 * // limitations under the License.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 package org.iotivity.cloud.ciserver.resources.proxy;
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.HashMap;
28 import org.iotivity.cloud.base.connector.ConnectorPool;
29 import org.iotivity.cloud.base.device.CoapDevice;
30 import org.iotivity.cloud.base.device.Device;
31 import org.iotivity.cloud.base.device.IRequestChannel;
32 import org.iotivity.cloud.base.device.IResponseEventHandler;
33 import org.iotivity.cloud.base.exception.ClientException;
34 import org.iotivity.cloud.base.exception.ClientException.BadResponseException;
35 import org.iotivity.cloud.base.exception.ServerException;
36 import org.iotivity.cloud.base.protocols.IRequest;
37 import org.iotivity.cloud.base.protocols.IResponse;
38 import org.iotivity.cloud.base.protocols.MessageBuilder;
39 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
40 import org.iotivity.cloud.base.resource.Resource;
41 import org.iotivity.cloud.ciserver.Constants;
42 import org.iotivity.cloud.util.Cbor;
44 public class ResourceFind extends Resource {
45 IRequestChannel mASServer = null;
47 public ResourceFind() {
48 super(Arrays.asList(Constants.PREFIX_OIC, Constants.WELL_KNOWN_URI));
50 mASServer = ConnectorPool.getConnection("account");
53 class AccountReceiveHandler implements IResponseEventHandler {
55 IRequestChannel mRDServer = null;
56 private Device mSrcDevice;
57 private IRequest mRequest;
59 public AccountReceiveHandler(IRequest request, Device srcDevice) {
60 mRDServer = ConnectorPool.getConnection("rd");
61 mSrcDevice = srcDevice;
66 public void onResponseReceived(IResponse response)
67 throws ClientException {
69 switch (response.getStatus()) {
71 mRDServer.sendRequest(mRequest, mSrcDevice);
75 StringBuilder additionalQuery = new StringBuilder();
77 Cbor<HashMap<String, ArrayList<String>>> responsePayload = new Cbor<>();
79 ArrayList<String> deviceList = responsePayload
80 .parsePayloadFromCbor(response.getPayload(),
84 int index = deviceList.size();
86 for (String deviceId : deviceList) {
87 if (!deviceId.equals(mSrcDevice.getDeviceId())) {
88 additionalQuery.append("di=");
89 additionalQuery.append(deviceId);
91 additionalQuery.append("&");
95 String uriQuery = (mRequest.getUriQuery() == null ? ""
96 : mRequest.getUriQuery() + "&")
97 + additionalQuery.toString();
98 IRequest requestToAS = MessageBuilder.modifyRequest(
99 mRequest, null, uriQuery, null, null);
101 mRDServer.sendRequest(requestToAS, mSrcDevice);
105 throw new BadResponseException(
106 response.getStatus().toString()
107 + " response type is not supported");
113 public void onDefaultRequestReceived(Device srcDevice, IRequest request)
114 throws ServerException {
115 // Token exchange is done by CoapClient
116 CoapDevice coapDevice = (CoapDevice) srcDevice;
117 StringBuffer uriQuery = new StringBuffer();
118 uriQuery.append(Constants.SEARCH_ACCESS_TOKEN + "=");
119 uriQuery.append(coapDevice.getAccessToken());
121 if (request.getUriQueryMap().get("di") != null) {
122 String di = request.getUriQueryMap().get("di").get(0);
124 uriQuery.append("&");
125 uriQuery.append("di" + "=");
130 StringBuffer uriPath = new StringBuffer();
131 uriPath.append(Constants.PREFIX_WELL_KNOWN + "/");
132 uriPath.append(Constants.PREFIX_OCF + "/");
133 uriPath.append(Constants.ACCOUNT_URI + "/");
134 uriPath.append(Constants.DEVICE_URI);
136 IRequest requestToAS = MessageBuilder.createRequest(RequestMethod.GET,
137 uriPath.toString(), uriQuery.toString());
139 mASServer.sendRequest(requestToAS,
140 new AccountReceiveHandler(request, srcDevice));