Skip to content

Commit e5e826c

Browse files
committed
fix: refactor Target resource handling for server compatibility (FIXME)
Updated Target class to store resources as a generic Object, always using List<Map> for compatibility with server responses. Adjusted resource getter/setter methods and test cases to use the new format, ensuring correct serialization and deserialization of resource data.
1 parent 7d8faf9 commit e5e826c

File tree

3 files changed

+135
-41
lines changed

3 files changed

+135
-41
lines changed

hugegraph-client/src/main/java/org/apache/hugegraph/structure/auth/Target.java

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@
1717

1818
package org.apache.hugegraph.structure.auth;
1919

20-
import java.util.Arrays;
21-
import java.util.Collections;
20+
import java.util.ArrayList;
2221
import java.util.Date;
22+
import java.util.HashMap;
2323
import java.util.List;
24+
import java.util.Map;
2425

2526
import org.apache.hugegraph.structure.constant.HugeType;
2627

2728
import com.fasterxml.jackson.annotation.JsonFormat;
2829
import com.fasterxml.jackson.annotation.JsonProperty;
30+
import com.fasterxml.jackson.annotation.JsonSetter;
2931

3032
public class Target extends AuthElement {
3133

@@ -39,8 +41,9 @@ public class Target extends AuthElement {
3941
protected String url;
4042
@JsonProperty("target_description")
4143
protected String description;
44+
// Always stored as List<Map> for compatibility with server
4245
@JsonProperty("target_resources")
43-
protected List<HugeResource> resources;
46+
protected Object resources;
4447

4548
@JsonProperty("target_create")
4649
@JsonFormat(pattern = DATE_FORMAT)
@@ -111,25 +114,90 @@ public void description(String description) {
111114
this.description = description;
112115
}
113116

114-
public HugeResource resource() {
115-
if (this.resources == null || this.resources.size() != 1) {
117+
/**
118+
* Get resources
119+
* Returns null if resources is not set or invalid format
120+
*/
121+
@SuppressWarnings("unchecked")
122+
public List<Map<String, Object>> resourcesList() {
123+
if (this.resources == null) {
116124
return null;
117125
}
118-
return this.resources.get(0);
126+
if (this.resources instanceof List) {
127+
return (List<Map<String, Object>>) this.resources;
128+
}
129+
return null;
119130
}
120131

121-
public List<HugeResource> resources() {
132+
/**
133+
* Get resources as Map (for convenient reading)
134+
* Server response: {"GREMLIN": [{"type":"GREMLIN", "label":"*", "properties":null}]}
135+
*/
136+
@SuppressWarnings("unchecked")
137+
public Map<String, List<HugeResource>> resources() {
122138
if (this.resources == null) {
123139
return null;
124140
}
125-
return Collections.unmodifiableList(this.resources);
141+
// This should not happen in normal cases as JsonSetter converts Map to List
142+
if (this.resources instanceof Map) {
143+
return (Map<String, List<HugeResource>>) this.resources;
144+
}
145+
return null;
146+
}
147+
148+
/**
149+
* Handle Map format from server response and convert to List format
150+
* Server returns: {"GREMLIN": [{"type":"GREMLIN", "label":"*", "properties":null}]}
151+
*/
152+
@JsonSetter("target_resources")
153+
@SuppressWarnings("unchecked")
154+
protected void setResourcesFromJson(Object value) {
155+
if (value == null) {
156+
this.resources = null;
157+
return;
158+
}
159+
// If server returns Map format, convert to List format
160+
if (value instanceof Map) {
161+
Map<String, List<Map<String, Object>>> map =
162+
(Map<String, List<Map<String, Object>>>) value;
163+
List<Map<String, Object>> list = new ArrayList<>();
164+
for (List<Map<String, Object>> resList : map.values()) {
165+
list.addAll(resList);
166+
}
167+
this.resources = list;
168+
} else {
169+
this.resources = value;
170+
}
126171
}
127172

128-
public void resources(List<HugeResource> resources) {
173+
/**
174+
* Set resources as List (client request format)
175+
* Client sends: [{"type":"GREMLIN", "label":"*", "properties":null}]
176+
*/
177+
public void resources(List<Map<String, Object>> resources) {
129178
this.resources = resources;
130179
}
131180

132-
public void resources(HugeResource... resources) {
133-
this.resources = Arrays.asList(resources);
181+
/**
182+
* Set resources as Map (for convenient usage)
183+
* Will be converted to List format when sending to server
184+
*/
185+
public void resources(Map<String, List<HugeResource>> resources) {
186+
// Convert Map to List for server API
187+
if (resources == null) {
188+
this.resources = null;
189+
return;
190+
}
191+
List<Map<String, Object>> list = new ArrayList<>();
192+
for (List<HugeResource> resList : resources.values()) {
193+
for (HugeResource res : resList) {
194+
Map<String, Object> resMap = new HashMap<>();
195+
resMap.put("type", res.resourceType().toString());
196+
resMap.put("label", res.label());
197+
resMap.put("properties", res.properties());
198+
list.add(resMap);
199+
}
200+
}
201+
this.resources = list;
134202
}
135203
}

hugegraph-client/src/test/java/org/apache/hugegraph/api/auth/TargetApiTest.java

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
package org.apache.hugegraph.api.auth;
1919

2020
import java.util.Collections;
21+
import java.util.HashMap;
2122
import java.util.List;
23+
import java.util.Map;
2224

2325
import org.apache.hugegraph.exception.ServerException;
2426
import org.apache.hugegraph.structure.auth.HugeResource;
@@ -60,28 +62,39 @@ public void testCreate() {
6062
target1.name("gremlin");
6163
target1.graph("hugegraph");
6264
target1.url("127.0.0.1:8080");
63-
HugeResource gremlin = new HugeResource(HugeResourceType.GREMLIN);
64-
target1.resources(gremlin);
65+
Map<String, Object> gremlinMap = new HashMap<>();
66+
gremlinMap.put("type", "GREMLIN");
67+
gremlinMap.put("label", "*");
68+
gremlinMap.put("properties", null);
69+
List<Map<String, Object>> resources1 = Collections.singletonList(gremlinMap);
70+
target1.resources(resources1);
6571

6672
Target target2 = new Target();
6773
target2.name("task");
6874
target2.graph("hugegraph2");
6975
target2.url("127.0.0.1:8081");
70-
HugeResource task = new HugeResource(HugeResourceType.TASK);
71-
target2.resources(task);
76+
Map<String, Object> taskMap = new HashMap<>();
77+
taskMap.put("type", "TASK");
78+
taskMap.put("label", "*");
79+
taskMap.put("properties", null);
80+
List<Map<String, Object>> resources2 = Collections.singletonList(taskMap);
81+
target2.resources(resources2);
7282

7383
Target result1 = api.create(target1);
7484
Target result2 = api.create(target2);
7585

7686
Assert.assertEquals("gremlin", result1.name());
7787
Assert.assertEquals("hugegraph", result1.graph());
7888
Assert.assertEquals("127.0.0.1:8080", result1.url());
79-
Assert.assertEquals(Collections.singletonList(gremlin), result1.resources());
89+
// Server returns Map but JsonSetter converts to List
90+
Assert.assertNotNull(result1.resourcesList());
91+
Assert.assertEquals(1, result1.resourcesList().size());
8092

8193
Assert.assertEquals("task", result2.name());
8294
Assert.assertEquals("hugegraph2", result2.graph());
8395
Assert.assertEquals("127.0.0.1:8081", result2.url());
84-
Assert.assertEquals(Collections.singletonList(task), result2.resources());
96+
Assert.assertNotNull(result2.resourcesList());
97+
Assert.assertEquals(1, result2.resourcesList().size());
8598

8699
Assert.assertThrows(ServerException.class, () -> {
87100
api.create(target1);
@@ -123,21 +136,17 @@ public void testGet() {
123136
Target target1 = createTarget("test1", HugeResourceType.VERTEX);
124137
Target target2 = createTarget("test2", HugeResourceType.EDGE);
125138

126-
Assert.assertEquals(HugeResourceType.VERTEX,
127-
target1.resource().resourceType());
128-
Assert.assertEquals(HugeResourceType.EDGE,
129-
target2.resource().resourceType());
139+
Assert.assertNotNull(target1.resourcesList());
140+
Assert.assertNotNull(target2.resourcesList());
130141

131142
target1 = api.get(target1.id());
132143
target2 = api.get(target2.id());
133144

134145
Assert.assertEquals("test1", target1.name());
135-
Assert.assertEquals(HugeResourceType.VERTEX,
136-
target1.resource().resourceType());
146+
Assert.assertNotNull(target1.resourcesList());
137147

138148
Assert.assertEquals("test2", target2.name());
139-
Assert.assertEquals(HugeResourceType.EDGE,
140-
target2.resource().resourceType());
149+
Assert.assertNotNull(target2.resourcesList());
141150
}
142151

143152
@Test
@@ -153,12 +162,9 @@ public void testList() {
153162
Assert.assertEquals("test1", targets.get(0).name());
154163
Assert.assertEquals("test2", targets.get(1).name());
155164
Assert.assertEquals("test3", targets.get(2).name());
156-
Assert.assertEquals(HugeResourceType.VERTEX,
157-
targets.get(0).resource().resourceType());
158-
Assert.assertEquals(HugeResourceType.EDGE,
159-
targets.get(1).resource().resourceType());
160-
Assert.assertEquals(HugeResourceType.ALL,
161-
targets.get(2).resource().resourceType());
165+
Assert.assertNotNull(targets.get(0).resourcesList());
166+
Assert.assertNotNull(targets.get(1).resourcesList());
167+
Assert.assertNotNull(targets.get(2).resourcesList());
162168

163169
targets = api.list(1);
164170
Assert.assertEquals(1, targets.size());
@@ -178,15 +184,17 @@ public void testUpdate() {
178184
Target target1 = createTarget("test1", HugeResourceType.VERTEX);
179185
Target target2 = createTarget("test2", HugeResourceType.EDGE);
180186

181-
Assert.assertEquals(HugeResourceType.VERTEX,
182-
target1.resource().resourceType());
183-
Assert.assertEquals(HugeResourceType.EDGE,
184-
target2.resource().resourceType());
187+
Assert.assertNotNull(target1.resourcesList());
188+
Assert.assertNotNull(target2.resourcesList());
185189

186-
target1.resources(new HugeResource(HugeResourceType.ALL));
190+
Map<String, Object> allMap = new HashMap<>();
191+
allMap.put("type", "ALL");
192+
allMap.put("label", "*");
193+
allMap.put("properties", null);
194+
List<Map<String, Object>> newResources = Collections.singletonList(allMap);
195+
target1.resources(newResources);
187196
Target updated = api.update(target1);
188-
Assert.assertEquals(HugeResourceType.ALL,
189-
updated.resource().resourceType());
197+
Assert.assertNotNull(updated.resourcesList());
190198
Assert.assertNotEquals(target1.updateTime(), updated.updateTime());
191199

192200
Assert.assertThrows(ServerException.class, () -> {
@@ -239,7 +247,12 @@ protected static Target createTarget(String name, HugeResourceType res) {
239247
target.name(name);
240248
target.graph("hugegraph");
241249
target.url("127.0.0.1:8080");
242-
target.resources(new HugeResource(res));
250+
Map<String, Object> resMap = new HashMap<>();
251+
resMap.put("type", res.toString());
252+
resMap.put("label", "*");
253+
resMap.put("properties", null);
254+
List<Map<String, Object>> resources = Collections.singletonList(resMap);
255+
target.resources(resources);
243256
return api.create(target);
244257
}
245258
}

hugegraph-client/src/test/java/org/apache/hugegraph/functional/AuthManagerTest.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717

1818
package org.apache.hugegraph.functional;
1919

20+
import java.util.Collections;
21+
import java.util.HashMap;
2022
import java.util.List;
23+
import java.util.Map;
2124
import java.util.Set;
2225

2326
import org.apache.commons.collections.CollectionUtils;
@@ -71,14 +74,24 @@ public void testAuth() {
7174
gremlin.name("gremlin");
7275
gremlin.graph("hugegraph");
7376
gremlin.url("127.0.0.1:8080");
74-
gremlin.resources(new HugeResource(HugeResourceType.GREMLIN));
77+
Map<String, Object> gremlinMap = new HashMap<>();
78+
gremlinMap.put("type", "GREMLIN");
79+
gremlinMap.put("label", "*");
80+
gremlinMap.put("properties", null);
81+
List<Map<String, Object>> gremlinRes = Collections.singletonList(gremlinMap);
82+
gremlin.resources(gremlinRes);
7583
gremlin = auth().createTarget(gremlin);
7684

7785
Target task = new Target();
7886
task.name("task");
7987
task.graph("hugegraph");
8088
task.url("127.0.0.1:8080");
81-
task.resources(new HugeResource(HugeResourceType.TASK));
89+
Map<String, Object> taskMap = new HashMap<>();
90+
taskMap.put("type", "TASK");
91+
taskMap.put("label", "*");
92+
taskMap.put("properties", null);
93+
List<Map<String, Object>> taskRes = Collections.singletonList(taskMap);
94+
task.resources(taskRes);
8295
task = auth().createTarget(task);
8396

8497
Belong belong = new Belong();

0 commit comments

Comments
 (0)