Skip to content

Commit 64554de

Browse files
authored
0.24.0
Status change. Fix handshake with token. Fix max string size in msgpack. Profiler Fix U16 and U32 handling in MsgPack Add DSAbstractAction to simplify anonymous actions. Support secure broker connections in v1.
2 parents 3ea6eaa + 61dbe9a commit 64554de

30 files changed

+1490
-377
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apply plugin: 'java'
22
apply plugin: 'maven'
33

44
group 'org.iot.dsa'
5-
version '0.21.0'
5+
version '0.24.0'
66

77
sourceCompatibility = 1.6
88
targetCompatibility = 1.6

dslink-core/src/main/java/com/acuity/iot/dsa/dslink/io/DSByteBuffer.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,39 @@ public DSByteBuffer putShort(short v, boolean bigEndian) {
392392
return put((byte) ((v >>> 0) & 0xFF), (byte) ((v >>> 8) & 0xFF));
393393
}
394394

395+
/**
396+
* Encodes the primitive into buffer.
397+
*
398+
* @param v The value to encode.
399+
* @param bigEndian Whether to encode in big or little endian byte ordering.
400+
*/
401+
public DSByteBuffer putU16(int v, boolean bigEndian) {
402+
if (bigEndian) {
403+
return put((byte) ((v >>> 8) & 0xFF),
404+
(byte) ((v >>> 0) & 0xFF));
405+
}
406+
return put((byte) ((v >>> 0) & 0xFF),
407+
(byte) ((v >>> 8) & 0xFF));
408+
}
409+
410+
/**
411+
* Encodes the primitive into the buffer.
412+
*
413+
* @param v The value to encode.
414+
* @param bigEndian Whether to encode in big or little endian byte ordering.
415+
*/
416+
public DSByteBuffer putU32(long v, boolean bigEndian) {
417+
if (bigEndian) {
418+
return put((byte) (v >>> 24),
419+
(byte) (v >>> 16),
420+
(byte) (v >>> 8),
421+
(byte) (v >>> 0));
422+
}
423+
return put((byte) (v >>> 0),
424+
(byte) (v >>> 8),
425+
(byte) (v >>> 16),
426+
(byte) (v >>> 24));
427+
}
395428
/**
396429
* Returns the next byte in the buffer, or -1 when nothing is available.
397430
*/

dslink-core/src/main/java/com/acuity/iot/dsa/dslink/io/msgpack/MsgpackReader.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,13 @@ private Token readNumber(byte b) throws IOException {
286286
case UINT8:
287287
return setNextValue((short) in.read() & 0xFF);
288288
case INT16:
289-
case UINT16:
290289
return setNextValue(DSBytes.readShort(in, true));
290+
case UINT16:
291+
return setNextValue(DSBytes.readU16(in, true));
291292
case INT32:
292-
case UINT32:
293293
return setNextValue(DSBytes.readInt(in, true));
294+
case UINT32:
295+
return setNextValue(DSBytes.readU32(in, true));
294296
default: //INT64
295297
return setNextValue(DSBytes.readLong(in, true));
296298
}

dslink-core/src/main/java/com/acuity/iot/dsa/dslink/io/msgpack/MsgpackWriter.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ private CharBuffer getCharBuffer(CharSequence arg) {
6565
tmp += 1024;
6666
}
6767
charBuffer = CharBuffer.allocate(tmp);
68-
} else if (charBuffer.length() < len) {
69-
int tmp = charBuffer.length();
68+
} else if (charBuffer.capacity() < len) {
69+
int tmp = charBuffer.capacity();
7070
while (tmp < len) {
7171
tmp += 1024;
7272
}
@@ -199,14 +199,14 @@ protected void write(long arg) throws IOException {
199199
byteBuffer.put((byte) arg);
200200
} else {
201201
byteBuffer.put(UINT16);
202-
byteBuffer.putShort((short) arg);
202+
byteBuffer.putU16((int) arg, true);
203203
}
204204
} else {
205205
if (arg < (1L << 32)) {
206206
byteBuffer.put(UINT32);
207-
byteBuffer.putInt((int) arg);
207+
byteBuffer.putU32((int) arg, true);
208208
} else {
209-
byteBuffer.put(UINT64);
209+
byteBuffer.put(INT64);
210210
byteBuffer.putLong(arg);
211211
}
212212
}
@@ -298,7 +298,8 @@ protected void writeNull() throws IOException {
298298

299299
private void writeString(CharSequence arg) throws IOException {
300300
CharBuffer chars = getCharBuffer(arg);
301-
ByteBuffer strBuffer = getStringBuffer(chars.position() * (int) encoder.maxBytesPerChar());
301+
ByteBuffer strBuffer = getStringBuffer(
302+
chars.length() * (int) encoder.maxBytesPerChar());
302303
encoder.encode(chars, strBuffer, false);
303304
int len = strBuffer.position();
304305
if (len < (1 << 5)) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.ClassLoadingMXBean;
4+
import java.lang.management.ManagementFactory;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
public class ClassLoadingNode extends MXBeanNode {
10+
11+
private ClassLoadingMXBean mxbean;
12+
13+
@Override
14+
public void setupMXBean() {
15+
mxbean = ManagementFactory.getClassLoadingMXBean();
16+
}
17+
18+
@Override
19+
public void refreshImpl() {}
20+
21+
@Override
22+
public PlatformManagedObject getMXBean() {
23+
return mxbean;
24+
}
25+
26+
@Override
27+
public Class<? extends PlatformManagedObject> getMXInterface() {
28+
return ClassLoadingMXBean.class;
29+
}
30+
31+
private static List<String> overriden = new ArrayList<String>();
32+
33+
@Override
34+
public List<String> getOverriden() {
35+
return overriden;
36+
}
37+
38+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.CompilationMXBean;
4+
import java.lang.management.ManagementFactory;
5+
import java.lang.management.PlatformManagedObject;
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
import org.iot.dsa.node.DSString;
9+
10+
public class CompilationNode extends MXBeanNode {
11+
12+
private CompilationMXBean mxbean;
13+
14+
@Override
15+
public void setupMXBean() {
16+
mxbean = ManagementFactory.getCompilationMXBean();
17+
}
18+
19+
@Override
20+
public void refreshImpl() {
21+
putProp("TotalCompilationTime",
22+
DSString.valueOf(ProfilerUtils.millisToString(mxbean.getTotalCompilationTime())));
23+
}
24+
25+
@Override
26+
public PlatformManagedObject getMXBean() {
27+
return mxbean;
28+
}
29+
30+
@Override
31+
public Class<? extends PlatformManagedObject> getMXInterface() {
32+
return CompilationMXBean.class;
33+
}
34+
35+
private static List<String> overriden = new ArrayList<String>();
36+
static {
37+
overriden.add("TotalCompilationTime");
38+
}
39+
40+
@Override
41+
public List<String> getOverriden() {
42+
return overriden;
43+
}
44+
45+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.GarbageCollectorMXBean;
4+
import java.lang.management.PlatformManagedObject;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import org.iot.dsa.node.DSString;
8+
9+
public class GarbageCollectorNode extends MXBeanNode {
10+
11+
private GarbageCollectorMXBean mxbean;
12+
13+
public GarbageCollectorNode() {}
14+
15+
public GarbageCollectorNode(GarbageCollectorMXBean mxbean) {
16+
this.mxbean = mxbean;
17+
}
18+
19+
@Override
20+
public void setupMXBean() {
21+
if (mxbean == null) {
22+
getParent().remove(getInfo());
23+
}
24+
}
25+
26+
@Override
27+
public void refreshImpl() {
28+
putProp("CollectionTime",
29+
DSString.valueOf(ProfilerUtils.millisToString(mxbean.getCollectionTime())));
30+
}
31+
32+
@Override
33+
public PlatformManagedObject getMXBean() {
34+
return mxbean;
35+
}
36+
37+
@Override
38+
public Class<? extends PlatformManagedObject> getMXInterface() {
39+
return GarbageCollectorMXBean.class;
40+
}
41+
42+
private static List<String> overriden = new ArrayList<String>();
43+
static {
44+
overriden.add("CollectionTime");
45+
}
46+
47+
@Override
48+
public List<String> getOverriden() {
49+
return overriden;
50+
}
51+
52+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.PlatformManagedObject;
4+
import java.lang.reflect.InvocationTargetException;
5+
import java.lang.reflect.Method;
6+
import java.util.List;
7+
import org.iot.dsa.node.DSIObject;
8+
import org.iot.dsa.node.DSInfo;
9+
import org.iot.dsa.node.DSNode;
10+
import org.iot.dsa.node.DSString;
11+
import org.iot.dsa.node.action.ActionInvocation;
12+
import org.iot.dsa.node.action.ActionResult;
13+
import org.iot.dsa.node.action.DSAction;
14+
15+
public abstract class MXBeanNode extends DSNode {
16+
17+
private static DSAction refreshAction = new DSAction() {
18+
@Override
19+
public ActionResult invoke(DSInfo info, ActionInvocation invocation) {
20+
((MXBeanNode) info.getParent()).refresh();
21+
return null;
22+
}
23+
};
24+
25+
@Override
26+
protected void declareDefaults() {
27+
super.declareDefaults();
28+
declareDefault("Refresh", refreshAction);
29+
}
30+
31+
@Override
32+
protected void onStable() {
33+
setupMXBean();
34+
refresh();
35+
}
36+
37+
private void refresh() {
38+
refreshImpl();
39+
discover();
40+
}
41+
42+
public abstract void setupMXBean();
43+
44+
public abstract void refreshImpl();
45+
46+
public abstract PlatformManagedObject getMXBean();
47+
48+
public abstract Class<? extends PlatformManagedObject> getMXInterface();
49+
50+
public abstract List<String> getOverriden();
51+
52+
public void discover() {
53+
PlatformManagedObject bean = getMXBean();
54+
Class<? extends PlatformManagedObject> clazz = getMXInterface();
55+
for (Method meth : clazz.getMethods()) {
56+
String methName = meth.getName();
57+
if (meth.getParameterCount() == 0 && meth.getReturnType() != Void.TYPE) {
58+
String name;
59+
if (methName.startsWith("get")) {
60+
name = methName.substring(3);
61+
} else if (methName.startsWith("is")) {
62+
name = methName.substring(2);
63+
} else {
64+
continue;
65+
}
66+
if (!name.isEmpty() && !getOverriden().contains(name)) {
67+
try {
68+
Object o = meth.invoke(bean);
69+
putProp(name,
70+
o != null ? ProfilerUtils.objectToDSIValue(o) : DSString.EMPTY);
71+
} catch (Exception e) {
72+
warn(e);
73+
}
74+
}
75+
}
76+
}
77+
}
78+
79+
protected void putProp(String name, DSIObject obj) {
80+
put(name, obj).setReadOnly(true).setTransient(true);
81+
}
82+
83+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.acuity.iot.dsa.dslink.profiler;
2+
3+
import java.lang.management.MemoryManagerMXBean;
4+
import java.lang.management.PlatformManagedObject;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class MemoryManagerNode extends MXBeanNode {
9+
10+
private MemoryManagerMXBean mxbean;
11+
12+
public MemoryManagerNode() {}
13+
14+
public MemoryManagerNode(MemoryManagerMXBean mxbean) {
15+
this.mxbean = mxbean;
16+
}
17+
18+
@Override
19+
public void setupMXBean() {
20+
if (mxbean == null) {
21+
getParent().remove(getInfo());
22+
}
23+
}
24+
25+
@Override
26+
public void refreshImpl() {
27+
// TODO Auto-generated method stub
28+
29+
}
30+
31+
@Override
32+
public PlatformManagedObject getMXBean() {
33+
return mxbean;
34+
}
35+
36+
@Override
37+
public Class<? extends PlatformManagedObject> getMXInterface() {
38+
return MemoryManagerMXBean.class;
39+
}
40+
41+
private static List<String> overriden = new ArrayList<String>();
42+
43+
@Override
44+
public List<String> getOverriden() {
45+
return overriden;
46+
}
47+
48+
}

0 commit comments

Comments
 (0)