Skip to content

Commit 3718b85

Browse files
authored
1.1.0 (#14)
* adding a buffer feature that uses etsdb to store failed-to-send updates * update usage guide to include info on batchable requests * implement serializer. The buffer feature is now functional. * implement automatic purging of buffer * bump version * 1.1.0 Switch from apache.cxf to okhttp
1 parent fb76bf4 commit 3718b85

16 files changed

+1283
-1139
lines changed

build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ repositories {
2424

2525
dependencies {
2626
//implementation 'org.iot-dsa:dslink-v2-websocket:+' //for a locally installed sdk
27-
implementation 'com.github.iot-dsa-v2.sdk-dslink-java-v2:dslink-v2-websocket:0.54.0'
27+
implementation 'com.github.iot-dsa-v2.sdk-dslink-java-v2:dslink-v2-websocket:+'
2828
implementation 'commons-logging:commons-logging:+'
2929
implementation 'org.apache.commons:commons-lang3:3.6'
3030
implementation 'commons-io:commons-io:2.6'
31-
implementation 'org.apache.cxf:cxf-rt-rs-security-oauth2:3.1.7'
32-
implementation 'org.apache.cxf:cxf-rt-rs-client:3.0.0-milestone1'
33-
implementation 'javax.xml.bind:jaxb-api:2.3.0'
34-
implementation 'javax.activation:activation:+'
31+
implementation 'com.squareup.okhttp3:okhttp:3.14.0'
32+
//implementation 'org.apache.cxf:cxf-rt-rs-security-oauth2:3.1.7'
33+
//implementation 'org.apache.cxf:cxf-rt-rs-client:3.0.0-milestone1'
34+
//implementation 'javax.xml.bind:jaxb-api:2.3.0'
35+
//implementation 'javax.activation:activation:+'
3536

3637
testImplementation 'junit:junit:+'
3738
testImplementation 'org.mockito:mockito-all:+'
38-
3939
}
4040

4141
applicationDistribution.from(new File(project.projectDir, "/dslink.json"))

dslink.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "dslink-java-v2-restadapter",
3-
"version": "1.0.6",
3+
"version": "1.1.0",
44
"description": "Java DSA to REST adpater DSLink",
55
"main": "bin/dslink-java-v2-restadapter",
66
"configs": {

src/main/java/org/iot/dsa/dslink/restadapter/AbstractRuleNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package org.iot.dsa.dslink.restadapter;
2-
3-
import javax.ws.rs.core.Response;
2+
43
import org.apache.commons.lang3.RandomStringUtils;
54
import org.iot.dsa.node.DSBool;
65
import org.iot.dsa.node.DSIObject;
76
import org.iot.dsa.node.DSIValue;
87
import org.iot.dsa.node.DSInfo;
98
import org.iot.dsa.node.DSLong;
109
import org.iot.dsa.node.DSNode;
10+
import okhttp3.Response;
1111

1212
public abstract class AbstractRuleNode extends DSNode {
1313
private DSInfo bufferEnabled = getInfo(Constants.USE_BUFFER);
Lines changed: 163 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -1,180 +1,164 @@
1-
package org.iot.dsa.dslink.restadapter;
2-
3-
import org.iot.dsa.dslink.restadapter.Util.AUTH_SCHEME;
4-
import org.iot.dsa.node.*;
5-
import org.iot.dsa.node.DSMap.Entry;
6-
import org.iot.dsa.node.action.ActionInvocation;
7-
import org.iot.dsa.node.action.ActionResult;
8-
import org.iot.dsa.node.action.DSAction;
9-
import org.iot.dsa.util.DSException;
10-
11-
public class ConnectionNode extends DSNode {
12-
13-
private DSMap parameters;
14-
private WebClientProxy clientProxy;
15-
16-
public ConnectionNode() {
17-
18-
}
19-
20-
ConnectionNode(DSMap parameters) {
21-
this.parameters = parameters;
22-
}
23-
24-
@Override
25-
protected void declareDefaults() {
26-
super.declareDefaults();
27-
declareDefault(Constants.ACT_REMOVE, makeRemoveAction());
28-
declareDefault(Constants.ACT_ADD_RULE, makeAddRuleAction());
29-
declareDefault(Constants.ACT_ADD_RULE_TABLE, makeAddRuleTableAction());
30-
}
31-
32-
@Override
33-
protected void onStarted() {
34-
if (this.parameters == null) {
35-
DSIObject o = get(Constants.PARAMS);
36-
if (o instanceof DSMap) {
37-
this.parameters = (DSMap) o;
38-
}
39-
} else {
40-
put(Constants.PARAMS, parameters.copy()).setPrivate(true);
41-
}
42-
}
43-
44-
@Override
45-
protected void onStable() {
46-
switch (AUTH_SCHEME.valueOf(getAuthScheme())) {
47-
case NO_AUTH:
48-
clientProxy = WebClientProxy.buildNoAuthClient();
49-
break;
50-
case BASIC_USR_PASS:
51-
clientProxy = WebClientProxy.buildBasicUserPassClient(getUsername(), getPassword());
52-
break;
53-
case OAUTH2_CLIENT:
54-
clientProxy = WebClientProxy.buildClientFlowOAuth2Client(getClientId(), getClientSecret(), getTokenURL());
55-
break;
56-
case OAUTH2_USR_PASS:
57-
clientProxy = WebClientProxy.buildPasswordFlowOAuth2Client(getUsername(), getPassword(), getClientId(), getClientSecret(), getTokenURL());
58-
break;
59-
default:
60-
DSException.throwRuntime(new RuntimeException("Unsupported AuthScheme: " + getAuthScheme()));
61-
}
62-
put(Constants.ACT_EDIT, makeEditAction()).setTransient(true);
63-
}
64-
65-
private DSAction makeAddRuleAction() {
66-
DSAction act = new DSAction.Parameterless() {
67-
@Override
68-
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
69-
((ConnectionNode) target.get()).addRule(invocation.getParameters());
70-
return null;
71-
}
72-
};
73-
act.addParameter(Constants.NAME, DSValueType.STRING, null);
74-
act.addParameter(Constants.SUB_PATH, DSValueType.STRING, null);
75-
act.addParameter(Constants.REST_URL, DSValueType.STRING, null);
76-
act.addDefaultParameter(Constants.REST_METHOD, DSString.valueOf("POST"), null);
77-
act.addDefaultParameter(Constants.URL_PARAMETERS, new DSMap(), null);
78-
act.addParameter(Constants.REQUEST_BODY, DSValueType.STRING, null);
79-
act.addParameter(Constants.MIN_REFRESH_RATE, DSValueType.NUMBER, "Optional, ensures at least this many seconds between updates");
80-
act.addParameter(Constants.MAX_REFRESH_RATE, DSValueType.NUMBER, "Optional, ensures an update gets sent every this many seconds");
81-
return act;
82-
}
83-
84-
85-
private void addRule(DSMap parameters) {
86-
String name = parameters.getString(Constants.NAME);
87-
put(name, new RuleNode(parameters));
88-
}
89-
90-
private DSAction makeAddRuleTableAction() {
91-
DSAction act = new DSAction.Parameterless() {
92-
@Override
93-
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
94-
((ConnectionNode) target.get()).addRuleTable(invocation.getParameters());
95-
return null;
96-
}
97-
};
98-
act.addParameter(Constants.NAME, DSValueType.STRING, null);
99-
act.addDefaultParameter(Constants.RULE_TABLE, new DSList(), null);
100-
return act;
101-
}
102-
103-
private void addRuleTable(DSMap parameters) {
104-
String name = parameters.getString(Constants.NAME);
105-
DSList table = parameters.getList(Constants.RULE_TABLE);
106-
put(name, new RuleTableNode(table));
107-
}
108-
109-
private DSAction makeRemoveAction() {
110-
return new DSAction.Parameterless() {
111-
@Override
112-
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
113-
((ConnectionNode) target.get()).delete();
114-
return null;
115-
}
116-
};
117-
}
118-
119-
private void delete() {
120-
getParent().remove(getInfo());
121-
}
122-
123-
private DSIObject makeEditAction() {
124-
DSAction act = new DSAction.Parameterless() {
125-
@Override
126-
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
127-
((ConnectionNode) target.get()).edit(invocation.getParameters());
128-
return null;
129-
}
130-
};
131-
AUTH_SCHEME scheme = AUTH_SCHEME.valueOf(getAuthScheme());
132-
if (!Util.AUTH_SCHEME.OAUTH2_CLIENT.equals(scheme)) {
133-
act.addDefaultParameter(Constants.USERNAME, DSString.valueOf(getUsername()), null);
134-
act.addDefaultParameter(Constants.PASSWORD, DSString.valueOf(getPassword()), null).setEditor("password");
135-
}
136-
if (Util.AUTH_SCHEME.OAUTH2_CLIENT.equals(scheme) || Util.AUTH_SCHEME.OAUTH2_USR_PASS.equals(scheme)) {
137-
act.addDefaultParameter(Constants.CLIENT_ID, DSString.valueOf(getClientId()), null);
138-
act.addDefaultParameter(Constants.CLIENT_SECRET, DSString.valueOf(getClientSecret()), null).setEditor("password");
139-
act.addDefaultParameter(Constants.TOKEN_URL, DSString.valueOf(getTokenURL()), null);
140-
}
141-
return act;
142-
}
143-
144-
private void edit(DSMap parameters) {
145-
for (Entry entry : parameters) {
146-
this.parameters.put(entry.getKey(), entry.getValue().copy());
147-
}
148-
put(Constants.PARAMS, parameters.copy());
149-
onStable();
150-
}
151-
152-
private String getUsername() {
153-
return parameters.getString(Constants.USERNAME);
154-
}
155-
156-
private String getPassword() {
157-
return parameters.getString(Constants.PASSWORD);
158-
}
159-
160-
private String getClientId() {
161-
return parameters.getString(Constants.CLIENT_ID);
162-
}
163-
164-
private String getClientSecret() {
165-
return parameters.getString(Constants.CLIENT_SECRET);
166-
}
167-
168-
private String getTokenURL() {
169-
return parameters.getString(Constants.TOKEN_URL);
170-
}
171-
172-
private String getAuthScheme() {
173-
return parameters.getString(Constants.CONNTYPE);
174-
}
175-
176-
public WebClientProxy getWebClientProxy() {
177-
return clientProxy;
178-
}
179-
1+
package org.iot.dsa.dslink.restadapter;
2+
3+
import org.iot.dsa.dslink.restadapter.Util.AUTH_SCHEME;
4+
import org.iot.dsa.node.*;
5+
import org.iot.dsa.node.DSMap.Entry;
6+
import org.iot.dsa.node.action.ActionInvocation;
7+
import org.iot.dsa.node.action.ActionResult;
8+
import org.iot.dsa.node.action.DSAction;
9+
10+
public class ConnectionNode extends DSNode implements CredentialProvider {
11+
12+
private DSMap parameters;
13+
private WebClientProxy clientProxy;
14+
15+
public ConnectionNode() {
16+
17+
}
18+
19+
ConnectionNode(DSMap parameters) {
20+
this.parameters = parameters;
21+
}
22+
23+
@Override
24+
protected void declareDefaults() {
25+
super.declareDefaults();
26+
declareDefault(Constants.ACT_REMOVE, makeRemoveAction());
27+
declareDefault(Constants.ACT_ADD_RULE, makeAddRuleAction());
28+
declareDefault(Constants.ACT_ADD_RULE_TABLE, makeAddRuleTableAction());
29+
}
30+
31+
@Override
32+
protected void onStarted() {
33+
if (this.parameters == null) {
34+
DSIObject o = get(Constants.PARAMS);
35+
if (o instanceof DSMap) {
36+
this.parameters = (DSMap) o;
37+
}
38+
} else {
39+
put(Constants.PARAMS, parameters.copy()).setPrivate(true);
40+
}
41+
}
42+
43+
@Override
44+
protected void onStable() {
45+
clientProxy = new WebClientProxy(this);
46+
put(Constants.ACT_EDIT, makeEditAction()).setTransient(true);
47+
}
48+
49+
private DSAction makeAddRuleAction() {
50+
DSAction act = new DSAction.Parameterless() {
51+
@Override
52+
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
53+
((ConnectionNode) target.get()).addRule(invocation.getParameters());
54+
return null;
55+
}
56+
};
57+
act.addParameter(Constants.NAME, DSValueType.STRING, null);
58+
act.addParameter(Constants.SUB_PATH, DSValueType.STRING, null);
59+
act.addParameter(Constants.REST_URL, DSValueType.STRING, null);
60+
act.addDefaultParameter(Constants.REST_METHOD, DSString.valueOf("POST"), null);
61+
act.addDefaultParameter(Constants.URL_PARAMETERS, new DSMap(), null);
62+
act.addParameter(Constants.REQUEST_BODY, DSValueType.STRING, null);
63+
act.addParameter(Constants.MIN_REFRESH_RATE, DSValueType.NUMBER, "Optional, ensures at least this many seconds between updates");
64+
act.addParameter(Constants.MAX_REFRESH_RATE, DSValueType.NUMBER, "Optional, ensures an update gets sent every this many seconds");
65+
return act;
66+
}
67+
68+
69+
private void addRule(DSMap parameters) {
70+
String name = parameters.getString(Constants.NAME);
71+
put(name, new RuleNode(parameters));
72+
}
73+
74+
private DSAction makeAddRuleTableAction() {
75+
DSAction act = new DSAction.Parameterless() {
76+
@Override
77+
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
78+
((ConnectionNode) target.get()).addRuleTable(invocation.getParameters());
79+
return null;
80+
}
81+
};
82+
act.addParameter(Constants.NAME, DSValueType.STRING, null);
83+
act.addDefaultParameter(Constants.RULE_TABLE, new DSList(), null);
84+
return act;
85+
}
86+
87+
private void addRuleTable(DSMap parameters) {
88+
String name = parameters.getString(Constants.NAME);
89+
DSList table = parameters.getList(Constants.RULE_TABLE);
90+
put(name, new RuleTableNode(table));
91+
}
92+
93+
private DSAction makeRemoveAction() {
94+
return new DSAction.Parameterless() {
95+
@Override
96+
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
97+
((ConnectionNode) target.get()).delete();
98+
return null;
99+
}
100+
};
101+
}
102+
103+
private void delete() {
104+
getParent().remove(getInfo());
105+
}
106+
107+
private DSIObject makeEditAction() {
108+
DSAction act = new DSAction.Parameterless() {
109+
@Override
110+
public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
111+
((ConnectionNode) target.get()).edit(invocation.getParameters());
112+
return null;
113+
}
114+
};
115+
AUTH_SCHEME scheme = getAuthScheme();
116+
if (!Util.AUTH_SCHEME.OAUTH2_CLIENT.equals(scheme)) {
117+
act.addDefaultParameter(Constants.USERNAME, DSString.valueOf(getUsername()), null);
118+
act.addDefaultParameter(Constants.PASSWORD, DSString.valueOf(getPassword()), null).setEditor("password");
119+
}
120+
if (Util.AUTH_SCHEME.OAUTH2_CLIENT.equals(scheme) || Util.AUTH_SCHEME.OAUTH2_USR_PASS.equals(scheme)) {
121+
act.addDefaultParameter(Constants.CLIENT_ID, DSString.valueOf(getClientId()), null);
122+
act.addDefaultParameter(Constants.CLIENT_SECRET, DSString.valueOf(getClientSecret()), null).setEditor("password");
123+
act.addDefaultParameter(Constants.TOKEN_URL, DSString.valueOf(getTokenURL()), null);
124+
}
125+
return act;
126+
}
127+
128+
private void edit(DSMap parameters) {
129+
for (Entry entry : parameters) {
130+
this.parameters.put(entry.getKey(), entry.getValue().copy());
131+
}
132+
put(Constants.PARAMS, parameters.copy());
133+
onStable();
134+
}
135+
136+
public String getUsername() {
137+
return parameters.getString(Constants.USERNAME);
138+
}
139+
140+
public String getPassword() {
141+
return parameters.getString(Constants.PASSWORD);
142+
}
143+
144+
public String getClientId() {
145+
return parameters.getString(Constants.CLIENT_ID);
146+
}
147+
148+
public String getClientSecret() {
149+
return parameters.getString(Constants.CLIENT_SECRET);
150+
}
151+
152+
public String getTokenURL() {
153+
return parameters.getString(Constants.TOKEN_URL);
154+
}
155+
156+
public AUTH_SCHEME getAuthScheme() {
157+
return AUTH_SCHEME.valueOf(parameters.getString(Constants.CONNTYPE));
158+
}
159+
160+
public WebClientProxy getWebClientProxy() {
161+
return clientProxy;
162+
}
163+
180164
}

0 commit comments

Comments
 (0)