1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.coap.resource;
21
22 import java.io.UnsupportedEncodingException;
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import org.apache.mina.api.IoSession;
27 import org.apache.mina.coap.CoapCode;
28 import org.apache.mina.coap.CoapMessage;
29 import org.apache.mina.coap.CoapOption;
30 import org.apache.mina.coap.CoapOptionType;
31 import org.apache.mina.coap.MessageType;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35
36
37
38
39
40
41 public class ResourceRegistry {
42
43 private static final Logger LOG = LoggerFactory.getLogger(ResourceRegistry.class);
44
45 private Map<String, ResourceHandler> handlers = new HashMap<String, ResourceHandler>();
46
47
48
49
50
51
52 public void register(ResourceHandler handler) {
53 handlers.put(handler.getPath(), handler);
54 }
55
56
57
58
59
60
61
62
63 public CoapMessage respond(CoapMessage request, IoSession session) {
64
65 StringBuilder urlBuilder = new StringBuilder("");
66 for (CoapOption opt : request.getOptions()) {
67 if (opt.getType() == CoapOptionType.URI_PATH) {
68 if (urlBuilder.length() > 0) {
69 urlBuilder.append("/");
70 }
71 urlBuilder.append(new String(opt.getData()));
72 }
73 }
74
75 String url = urlBuilder.toString();
76 LOG.debug("requested URL : {}", url);
77
78 if (url.length() < 1) {
79
80 return new CoapMessage(1, MessageType.ACK, CoapCode.BAD_REQUEST.getCode(), request.getId(),
81 request.getToken(), new CoapOption[] { new CoapOption(CoapOptionType.CONTENT_FORMAT,
82 new byte[] { 0 }) }, "no URL !".getBytes());
83 }
84 if (".well-known/core".equalsIgnoreCase(url)) {
85
86 return new CoapMessage(1, MessageType.ACK, CoapCode.CONTENT.getCode(), request.getId(), request.getToken(),
87 new CoapOption[] { new CoapOption(CoapOptionType.CONTENT_FORMAT, new byte[] { 40 }) },
88 getDiscovery());
89 } else {
90 ResourceHandler handler = handlers.get(url);
91 if (handler == null) {
92
93 return new CoapMessage(1, MessageType.ACK, CoapCode.NOT_FOUND.getCode(), request.getId(),
94 request.getToken(), new CoapOption[] { new CoapOption(CoapOptionType.CONTENT_FORMAT,
95 new byte[] { 0 }) }, "not found !".getBytes());
96 } else {
97 CoapResponse response = handler.handle(request, session);
98 return new CoapMessage(1, request.getType() == MessageType.CONFIRMABLE ? MessageType.ACK
99 : MessageType.NON_CONFIRMABLE, response.getCode(), request.getId(), request.getToken(),
100 response.getOptions(), response.getContent());
101 }
102 }
103 }
104
105 private byte[] getDiscovery() {
106 StringBuilder b = new StringBuilder();
107 boolean first = true;
108 for (Map.Entry<String, ResourceHandler> e : handlers.entrySet()) {
109
110 if (first) {
111 first = false;
112 } else {
113 b.append(",");
114 }
115 ResourceHandler h = e.getValue();
116 b.append("</").append(h.getPath()).append(">");
117 if (h.getInterface() != null) {
118 b.append(";if=\"").append(h.getInterface()).append("\"");
119 }
120 if (h.getResourceType() != null) {
121 b.append(";rt=\"").append(h.getResourceType()).append("\"");
122 }
123 if (h.getTittle() != null) {
124 b.append(";title=\"").append(h.getTittle()).append("\"");
125 }
126 }
127 try {
128 return b.toString().getBytes("UTF-8");
129 } catch (UnsupportedEncodingException e1) {
130 throw new IllegalStateException("no UTF-8 codec", e1);
131 }
132 }
133 }