Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / android / examples / simpleserver / src / main / java / org / iotivity / base / examples / simpleserver / LightResource.java
1 /*\r
2  * //******************************************************************\r
3  * //\r
4  * // Copyright 2015 Intel Corporation.\r
5  * //\r
6  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
7  * //\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
11  * //\r
12  * //      http://www.apache.org/licenses/LICENSE-2.0\r
13  * //\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
19  * //\r
20  * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
21  */\r
22 \r
23 package org.iotivity.base.examples.simpleserver;\r
24 \r
25 import android.content.Context;\r
26 import android.content.Intent;\r
27 import android.util.Log;\r
28 \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
40 \r
41 import java.util.EnumSet;\r
42 import java.util.LinkedList;\r
43 import java.util.List;\r
44 \r
45 import base.iotivity.org.examples.message.IMessageLogger;\r
46 \r
47 /**\r
48  * LightResource\r
49  *\r
50  * class LightResource is the main class of the simpleServer. This creates resources and handles incoming requests from the client.\r
51  */\r
52 public class LightResource implements IMessageLogger {\r
53     private Context mContext;\r
54     private static String TAG = "SimpleServer: ";\r
55 \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
64 \r
65     // constructor\r
66     LightResource(Context context) {\r
67         mContext = context;\r
68         mName = "John's light";\r
69         mState = false;\r
70         mPower = 0;\r
71         mObservationIds = new LinkedList<>();\r
72         mLightRep = new OcRepresentation();\r
73         try {\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
79         }\r
80         doOnce = true; // used in post\r
81         lightRepThread = null;\r
82     }\r
83 \r
84     //accessor methods\r
85     protected int getPower() {\r
86         return mPower;\r
87     }\r
88     protected void setPower(int power) {\r
89         mPower = power;\r
90     }\r
91     protected OcResourceHandle getHandle() {\r
92         return mResourceHandle;\r
93     }\r
94 \r
95     /**\r
96      *  creates a resource. this method internally calls registerResource\r
97      * @return returns the OcResourceHandle after creating and registering the resource\r
98      */\r
99     protected OcResourceHandle createResource0() {\r
100         // entityhandler for registerResource\r
101         OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {\r
102             @Override\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
106             }\r
107         };\r
108 \r
109         try {\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
116         }\r
117         logMessage(TAG + "Successfully registered resource");\r
118         return mResourceHandle;\r
119     }\r
120 \r
121     /**\r
122      *  create another resource. this method internally calls registerResource\r
123      */\r
124     private void createResource1() {\r
125         // entityhandler for registerResource\r
126         OcPlatform.EntityHandler eh = new OcPlatform.EntityHandler() {\r
127             @Override\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
131             }\r
132         };\r
133 \r
134         try {\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
141         }\r
142         logMessage(TAG + "Successfully registered resource1");\r
143     }\r
144 \r
145     /**\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
150      */\r
151     private OcRepresentation post(OcRepresentation rep) {\r
152         //create a resource the first time\r
153         if (true == doOnce) {\r
154             createResource1();\r
155             OcRepresentation representation = rep;\r
156             try {\r
157                 representation.setValue(StringConstants.CREATED_URI, StringConstants.RESOURCE_URI1);\r
158             } catch (OcException e) {\r
159                 Log.e(TAG, e.getMessage());\r
160             }\r
161             doOnce = false;\r
162             return representation;\r
163         }\r
164         // from second time onwards, put\r
165         put(rep);\r
166         return get();\r
167     }\r
168 \r
169     /**\r
170      * puts representation . Gets value from the representation and updates the internal state\r
171      * @param rep current OcRepresentation of the object\r
172      */\r
173     private void put(OcRepresentation rep) {\r
174         try {\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
179         }\r
180         logMessage(TAG + "Put State: " +  mState + " Name: " + mName + " Power: " + mPower);\r
181     }\r
182 \r
183     /**\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
186      */\r
187     protected OcRepresentation get() {\r
188         try {\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
194         }\r
195         return mLightRep;\r
196     }\r
197 \r
198     /**\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
203      */\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
209 \r
210             if (requestFlag.contains(RequestHandlerFlag.INIT)) {\r
211                 logMessage(TAG + "Init");\r
212             }\r
213             if (requestFlag.contains(RequestHandlerFlag.REQUEST)) {\r
214                 try {\r
215                     logMessage(TAG + "Request");\r
216                     OcResourceResponse ocResourceResponse = new OcResourceResponse();\r
217                     ocResourceResponse.setRequestHandle(request.getRequestHandle());\r
218                     ocResourceResponse.setResourceHandle(request.getResourceHandle());\r
219 \r
220                     switch (requestType) {\r
221                         // handle GET request\r
222                         case GET:\r
223                             logMessage("GET");\r
224                             ocResourceResponse.setResponseResult(EntityHandlerResult.OK);\r
225                             ocResourceResponse.setErrorCode(StringConstants.ERROR_CODE);\r
226                             ocResourceResponse.setResourceRepresentation(get());\r
227                             OcPlatform.sendResponse(ocResourceResponse);\r
228                             break;\r
229                         // handle PUT request\r
230                         case PUT:\r
231                             OcRepresentation rep = request.getResourceRepresentation();\r
232                             put(rep);\r
233                             ocResourceResponse.setErrorCode(StringConstants.ERROR_CODE);\r
234                             ocResourceResponse.setResponseResult(EntityHandlerResult.OK);\r
235                             ocResourceResponse.setResourceRepresentation(get());\r
236                             OcPlatform.sendResponse(ocResourceResponse);\r
237                             break;\r
238                         // handle POST request\r
239                         case POST:\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
250                                 } else {\r
251                                     ocResourceResponse.setResponseResult(EntityHandlerResult.OK);\r
252                                 }\r
253                             }\r
254                             OcPlatform.sendResponse(ocResourceResponse);\r
255                             break;\r
256                         // handle DELETE request\r
257                         case DELETE:\r
258                             logMessage(TAG + "DELETE");\r
259                             OcPlatform.unregisterResource(getHandle());\r
260                             OcPlatform.unregisterResource(getHandle());\r
261                             break;\r
262 \r
263                     }\r
264 \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
269                 }\r
270             }\r
271             // handle OBSERVER request\r
272             if (requestFlag.contains(RequestHandlerFlag.OBSERVER)) {\r
273                 logMessage(TAG + "OBSERVER");\r
274                 ObservationInfo observationInfo = request.getObservationInfo();\r
275 \r
276                 switch (observationInfo.getObserveAction()) {\r
277                     case REGISTER:\r
278                         synchronized (mObservationIds) {\r
279                             mObservationIds.add(observationInfo.getOcObservationId());\r
280                         }\r
281                         break;\r
282                     case UNREGISTER:\r
283                         synchronized (mObservationIds) {\r
284                             mObservationIds.remove(observationInfo.getOcObservationId());\r
285                         }\r
286                         break;\r
287                 }\r
288                 if (null == lightRepThread) {\r
289                     lightRepThread = new LightRepThread(this, mObservationIds);\r
290                     lightRepThread.run();\r
291                 }\r
292                 result = EntityHandlerResult.OK;\r
293             }\r
294         }\r
295         return result;\r
296     }\r
297 \r
298     @Override\r
299     public void logMessage(String msg) {\r
300         logMsg(msg);\r
301     }\r
302 \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
307     }\r
308 }