2 * //******************************************************************
\r
4 * // Copyright 2015 Intel Corporation.
\r
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
8 * // Licensed under the Apache License, Version 2.0 (the "License");
\r
9 * // you may not use this file except in compliance with the License.
\r
10 * // You may obtain a copy of the License at
\r
12 * // http://www.apache.org/licenses/LICENSE-2.0
\r
14 * // Unless required by applicable law or agreed to in writing, software
\r
15 * // distributed under the License is distributed on an "AS IS" BASIS,
\r
16 * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
17 * // See the License for the specific language governing permissions and
\r
18 * // limitations under the License.
\r
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
\r
23 package org.iotivity.base.examples.simpleserver;
\r
25 import android.content.Context;
\r
26 import android.content.Intent;
\r
27 import android.util.Log;
\r
29 import org.iotivity.base.EntityHandlerResult;
\r
30 import org.iotivity.base.ObservationInfo;
\r
31 import org.iotivity.base.OcException;
\r
32 import org.iotivity.base.OcPlatform;
\r
33 import org.iotivity.base.OcRepresentation;
\r
34 import org.iotivity.base.OcResourceHandle;
\r
35 import org.iotivity.base.OcResourceRequest;
\r
36 import org.iotivity.base.OcResourceResponse;
\r
37 import org.iotivity.base.RequestHandlerFlag;
\r
38 import org.iotivity.base.RequestType;
\r
39 import org.iotivity.base.ResourceProperty;
\r
41 import java.util.EnumSet;
\r
42 import java.util.LinkedList;
\r
43 import java.util.List;
\r
45 import base.iotivity.org.examples.message.IMessageLogger;
\r
50 * class LightResource is the main class of the simpleServer. This creates resources and handles incoming requests from the client.
\r
52 public class LightResource implements IMessageLogger {
\r
53 private Context mContext;
\r
54 private static String TAG = "SimpleServer: ";
\r
56 private String mName;
\r
57 private Boolean mState;
\r
58 private Integer mPower;
\r
59 private OcRepresentation mLightRep;
\r
60 private OcResourceHandle mResourceHandle;
\r
61 private List<Byte> mObservationIds;
\r
62 private static boolean doOnce; // used in POST
\r
63 LightRepThread lightRepThread;
\r
66 LightResource(Context context) {
\r
68 mName = "John's light";
\r
71 mObservationIds = new LinkedList<>();
\r
72 mLightRep = new OcRepresentation();
\r
74 mLightRep.setValue(StringConstants.STATE, mState);
\r
75 mLightRep.setValue(StringConstants.POWER, mPower);
\r
76 mLightRep.setValue(StringConstants.NAME, mName);
\r
77 } catch (OcException e) {
\r
78 Log.e(TAG, e.getMessage());
\r
80 doOnce = true; // used in post
\r
81 lightRepThread = null;
\r
85 protected int getPower() {
\r
88 protected void setPower(int power) {
\r
91 protected OcResourceHandle getHandle() {
\r
92 return mResourceHandle;
\r
96 * creates a resource. this method internally calls registerResource
\r
97 * @return returns the OcResourceHandle after creating and registering the resource
\r
99 protected OcResourceHandle createResource0() {
\r
100 // entityhandler for registerResource
\r
101 OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {
\r
103 public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
\r
104 // this is where the main logic of simpleserver is handled as different requests (GET, PUT, POST, OBSERVE, DELETE) are handled
\r
105 return entityHandler(ocResourceRequest);
\r
110 mResourceHandle = OcPlatform.registerResource(StringConstants.RESOURCE_URI0, StringConstants.RESOURCE_TYPENAME,
\r
111 StringConstants.RESOURCE_INTERFACE, eh,
\r
112 EnumSet.of(ResourceProperty.DISCOVERABLE, ResourceProperty.OBSERVABLE));
\r
113 } catch (OcException e) {
\r
114 logMessage(TAG + "RegisterResource error. " + e.getMessage());
\r
115 Log.e(TAG, e.getMessage());
\r
117 logMessage(TAG + "Successfully registered resource");
\r
118 return mResourceHandle;
\r
122 * create another resource. this method internally calls registerResource
\r
124 private void createResource1() {
\r
125 // entityhandler for registerResource
\r
126 OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {
\r
128 public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
\r
129 // this is where the main logic of simpleserver is handled as different requests (GET, PUT, POST, OBSERVE, DELETE) are handled
\r
130 return entityHandler(ocResourceRequest);
\r
135 OcPlatform.registerResource(StringConstants.RESOURCE_URI1, StringConstants.RESOURCE_TYPENAME,
\r
136 StringConstants.RESOURCE_INTERFACE, eh,
\r
137 EnumSet.of(ResourceProperty.DISCOVERABLE, ResourceProperty.OBSERVABLE));
\r
138 } catch (OcException e) {
\r
139 logMessage(TAG + "RegisterResource1 error: " + e.getMessage());
\r
140 Log.e(TAG, e.getMessage());
\r
142 logMessage(TAG + "Successfully registered resource1");
\r
146 * post representation . Post can act like put or can create a new resource.
\r
147 * Gets value from the representation and updates the internal state
\r
148 * @param rep current OcRepresentation of the object
\r
149 * @return updated OcRepresentation
\r
151 private OcRepresentation post(OcRepresentation rep) {
\r
152 //create a resource the first time
\r
153 if (true == doOnce) {
\r
155 OcRepresentation representation = rep;
\r
157 representation.setValue(StringConstants.CREATED_URI, StringConstants.RESOURCE_URI1);
\r
158 } catch (OcException e) {
\r
159 Log.e(TAG, e.getMessage());
\r
162 return representation;
\r
164 // from second time onwards, put
\r
170 * puts representation . Gets value from the representation and updates the internal state
\r
171 * @param rep current OcRepresentation of the object
\r
173 private void put(OcRepresentation rep) {
\r
175 mState = rep.getValue(StringConstants.STATE);
\r
176 mPower = rep.getValue(StringConstants.POWER);
\r
177 } catch (OcException e) {
\r
178 Log.e(TAG, e.getMessage());
\r
180 logMessage(TAG + "Put State: " + mState + " Name: " + mName + " Power: " + mPower);
\r
184 * gets the updated representation. Updates the representation with internal state before sending out
\r
185 * @return OcRepresentation after updating the values of the lightRepresentation
\r
187 protected OcRepresentation get() {
\r
189 mLightRep.setValue(StringConstants.STATE, mState);
\r
190 mLightRep.setValue(StringConstants.POWER, mPower);
\r
191 mLightRep.setValue(StringConstants.NAME, mName);
\r
192 } catch (OcException e) {
\r
193 Log.e(TAG, e.getMessage());
\r
199 * this is the main method which handles different incoming requests appropriately.
\r
200 * Init is not supported currently.
\r
201 * @param request OcResourceRequest from the client
\r
202 * @return EntityHandlerResult depending on whether the request was handled successfully or not
\r
204 private EntityHandlerResult entityHandler(OcResourceRequest request) {
\r
205 EntityHandlerResult result = EntityHandlerResult.ERROR;
\r
206 if (null != request) {
\r
207 RequestType requestType = request.getRequestType();
\r
208 EnumSet<RequestHandlerFlag> requestFlag = request.getRequestHandlerFlagSet();
\r
210 if (requestFlag.contains(RequestHandlerFlag.INIT)) {
\r
211 logMessage(TAG + "Init");
\r
213 if (requestFlag.contains(RequestHandlerFlag.REQUEST)) {
\r
215 logMessage(TAG + "Request");
\r
216 OcResourceResponse ocResourceResponse = new OcResourceResponse();
\r
217 ocResourceResponse.setRequestHandle(request.getRequestHandle());
\r
218 ocResourceResponse.setResourceHandle(request.getResourceHandle());
\r
220 switch (requestType) {
\r
221 // handle GET request
\r
224 ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
\r
225 ocResourceResponse.setErrorCode(StringConstants.ERROR_CODE);
\r
226 ocResourceResponse.setResourceRepresentation(get());
\r
227 OcPlatform.sendResponse(ocResourceResponse);
\r
229 // handle PUT request
\r
231 OcRepresentation rep = request.getResourceRepresentation();
\r
233 ocResourceResponse.setErrorCode(StringConstants.ERROR_CODE);
\r
234 ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
\r
235 ocResourceResponse.setResourceRepresentation(get());
\r
236 OcPlatform.sendResponse(ocResourceResponse);
\r
238 // handle POST request
\r
240 rep = request.getResourceRepresentation();
\r
241 OcRepresentation rep_post = post(rep);
\r
242 ocResourceResponse.setResourceRepresentation(rep_post);
\r
243 ocResourceResponse.setErrorCode(StringConstants.ERROR_CODE);
\r
244 if (rep_post.hasAttribute(StringConstants.CREATED_URI)) {
\r
245 String createdUri = rep_post.getValue(StringConstants.CREATED_URI);
\r
246 if (createdUri.equals(StringConstants.RESOURCE_URI1)) {
\r
247 ocResourceResponse.setNewResourceUri(createdUri);
\r
248 ocResourceResponse.setResponseResult
\r
249 (EntityHandlerResult.RESOURCE_CREATED);
\r
251 ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
\r
254 OcPlatform.sendResponse(ocResourceResponse);
\r
256 // handle DELETE request
\r
258 logMessage(TAG + "DELETE");
\r
259 OcPlatform.unregisterResource(getHandle());
\r
260 OcPlatform.unregisterResource(getHandle());
\r
265 result = EntityHandlerResult.OK;
\r
266 } catch(OcException e) {
\r
267 logMessage(TAG + "Error in Request " + e.getMessage());
\r
268 Log.e(TAG, e.getMessage());
\r
271 // handle OBSERVER request
\r
272 if (requestFlag.contains(RequestHandlerFlag.OBSERVER)) {
\r
273 logMessage(TAG + "OBSERVER");
\r
274 ObservationInfo observationInfo = request.getObservationInfo();
\r
276 switch (observationInfo.getObserveAction()) {
\r
278 synchronized (mObservationIds) {
\r
279 mObservationIds.add(observationInfo.getOcObservationId());
\r
283 synchronized (mObservationIds) {
\r
284 mObservationIds.remove(observationInfo.getOcObservationId());
\r
288 if (null == lightRepThread) {
\r
289 lightRepThread = new LightRepThread(this, mObservationIds);
\r
290 lightRepThread.run();
\r
292 result = EntityHandlerResult.OK;
\r
299 public void logMessage(String msg) {
\r
303 public void logMsg(final String text) {
\r
304 Intent intent = new Intent("org.iotivity.base.examples.simpleserver");
\r
305 intent.putExtra(StringConstants.MESSAGE, text);
\r
306 mContext.sendBroadcast(intent);
\r