Skip to content

Commit e1d3306

Browse files
committed
1.1.0
Switch from apache.cxf to okhttp
1 parent 8c6baf5 commit e1d3306

File tree

13 files changed

+400
-256
lines changed

13 files changed

+400
-256
lines changed

build.gradle

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,11 @@ dependencies {
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:+'

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.3",
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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package org.iot.dsa.dslink.restadapter;
22

3-
import javax.ws.rs.core.Response;
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);

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

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
import org.iot.dsa.node.action.ActionInvocation;
77
import org.iot.dsa.node.action.ActionResult;
88
import org.iot.dsa.node.action.DSAction;
9-
import org.iot.dsa.util.DSException;
109

11-
public class ConnectionNode extends DSNode {
10+
public class ConnectionNode extends DSNode implements CredentialProvider {
1211

1312
private DSMap parameters;
1413
private WebClientProxy clientProxy;
@@ -43,22 +42,7 @@ protected void onStarted() {
4342

4443
@Override
4544
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-
}
45+
clientProxy = new WebClientProxy(this);
6246
put(Constants.ACT_EDIT, makeEditAction()).setTransient(true);
6347
}
6448

@@ -128,7 +112,7 @@ public ActionResult invoke(DSInfo target, ActionInvocation invocation) {
128112
return null;
129113
}
130114
};
131-
AUTH_SCHEME scheme = AUTH_SCHEME.valueOf(getAuthScheme());
115+
AUTH_SCHEME scheme = getAuthScheme();
132116
if (!Util.AUTH_SCHEME.OAUTH2_CLIENT.equals(scheme)) {
133117
act.addDefaultParameter(Constants.USERNAME, DSString.valueOf(getUsername()), null);
134118
act.addDefaultParameter(Constants.PASSWORD, DSString.valueOf(getPassword()), null).setEditor("password");
@@ -149,28 +133,28 @@ private void edit(DSMap parameters) {
149133
onStable();
150134
}
151135

152-
private String getUsername() {
136+
public String getUsername() {
153137
return parameters.getString(Constants.USERNAME);
154138
}
155139

156-
private String getPassword() {
140+
public String getPassword() {
157141
return parameters.getString(Constants.PASSWORD);
158142
}
159143

160-
private String getClientId() {
144+
public String getClientId() {
161145
return parameters.getString(Constants.CLIENT_ID);
162146
}
163147

164-
private String getClientSecret() {
148+
public String getClientSecret() {
165149
return parameters.getString(Constants.CLIENT_SECRET);
166150
}
167151

168-
private String getTokenURL() {
152+
public String getTokenURL() {
169153
return parameters.getString(Constants.TOKEN_URL);
170154
}
171155

172-
private String getAuthScheme() {
173-
return parameters.getString(Constants.CONNTYPE);
156+
public AUTH_SCHEME getAuthScheme() {
157+
return AUTH_SCHEME.valueOf(parameters.getString(Constants.CONNTYPE));
174158
}
175159

176160
public WebClientProxy getWebClientProxy() {
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.iot.dsa.dslink.restadapter;
2+
3+
public interface CredentialProvider {
4+
5+
public String getUsername();
6+
7+
public String getPassword();
8+
9+
public String getClientId();
10+
11+
public String getClientSecret();
12+
13+
public String getTokenURL();
14+
15+
public Util.AUTH_SCHEME getAuthScheme();
16+
17+
}

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

Lines changed: 0 additions & 119 deletions
This file was deleted.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package org.iot.dsa.dslink.restadapter;
2+
3+
import okhttp3.Interceptor;
4+
import okhttp3.Request;
5+
import okhttp3.Response;
6+
import java.io.IOException;
7+
8+
/**
9+
* @author Daniel Shapiro
10+
*/
11+
12+
public class OAuthInterceptor implements Interceptor {
13+
14+
private final OAuthTokenUpdater updater;
15+
private final WebClientProxy home;
16+
17+
public OAuthInterceptor(WebClientProxy home) {
18+
this.home = home;
19+
this.updater = new OAuthTokenUpdater(home);
20+
}
21+
22+
private String constructAuthHeader(String token) {
23+
return token != null? String.format("Bearer %s", token) : null;
24+
}
25+
26+
private void setAuthHeader(Request.Builder builder, String header) {
27+
if (header != null) //Add Auth token to each request if authorized
28+
builder.header("Authorization", header);
29+
}
30+
31+
private int updateToken() {
32+
//Refresh token, synchronously, save it, and return result code
33+
//you might use retrofit here
34+
return updater.updateToken();
35+
}
36+
37+
private String getToken() {
38+
return updater.getToken();
39+
}
40+
41+
// private int responseCount(Response response) {
42+
// int result = 1;
43+
// while ((response = response.priorResponse()) != null) {
44+
// result++;
45+
// }
46+
// return result;
47+
// }
48+
49+
// @Override
50+
// public Request authenticate(Route route, Response response) throws IOException {
51+
// if (responseCount(response) >= 3) {
52+
// return null; // If we've failed 3 times, give up.
53+
// }
54+
// String token = getToken();
55+
// String authHeader = constructAuthHeader(token);
56+
// if (authHeader == null || authHeader.equals(response.request().header("Authorization"))) {
57+
// // If no token or if we already failed with this token, update the token
58+
// int code = updateToken() / 100; //refresh token
59+
// if (code != 2) { //if refresh token failed for some reason, give up
60+
// return null;
61+
// }
62+
// token = getToken();
63+
// authHeader = constructAuthHeader(token);
64+
// }
65+
// Request.Builder builder = response.request().newBuilder();
66+
// builder.header("Accept", "application/json"); //if necessary, say to consume JSON
67+
// setAuthHeader(builder, authHeader); //write current token to request
68+
// return builder.build();
69+
// }
70+
71+
private Request constructAuthRequest(Request originalRequest) {
72+
String token = getToken();
73+
String authHeader = constructAuthHeader(token);
74+
Request.Builder builder = originalRequest.newBuilder();
75+
builder.header("Accept", "application/json");
76+
setAuthHeader(builder, authHeader);
77+
return builder.build();
78+
}
79+
80+
@Override
81+
public Response intercept(Chain chain) throws IOException {
82+
Request originalRequest = chain.request();
83+
Request authRequest = constructAuthRequest(originalRequest);
84+
Response origResponse = chain.proceed(authRequest);
85+
if (origResponse.code() == 401 || origResponse.code() == 403) {
86+
synchronized (home.getClient()) {
87+
int code = updateToken() / 100; //refresh token
88+
if (code != 2) { //if refresh token failed for some reason, give up
89+
return origResponse;
90+
}
91+
Request newAuthRequest = constructAuthRequest(originalRequest);
92+
origResponse.close();
93+
Response newResponse = chain.proceed(newAuthRequest);
94+
return newResponse;
95+
}
96+
} else {
97+
return origResponse;
98+
}
99+
}
100+
101+
102+
}

0 commit comments

Comments
 (0)