Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
9118875
fix(license): update known dependencies for kotlin-stdlib-common
imbajin Jul 12, 2026
b24386a
feat(hubble): persist graph workspace context
imbajin Jul 11, 2026
4321897
feat(hubble): connect data preparation journey
imbajin Jul 11, 2026
f553522
feat(hubble): recover query task surfaces
imbajin Jul 11, 2026
8c39645
feat(hubble): improve dense graph navigation
imbajin Jul 12, 2026
814ad33
feat(hubble): unify workspace visual system
imbajin Jul 12, 2026
f66122f
fix(hubble): preserve hash on auth redirect
imbajin Jul 12, 2026
4832209
fix(hubble): add graph toolbar labels
imbajin Jul 12, 2026
4d5ffc3
fix(hubble): expose keyboard focus ring
imbajin Jul 12, 2026
f69f28a
fix(hubble): recover password submission
imbajin Jul 12, 2026
2cc6f9d
fix(hubble): guard account editor requests
imbajin Jul 12, 2026
b6293d2
refactor(hubble): unify low-frequency surfaces
imbajin Jul 12, 2026
c81d5bd
fix(hubble): refine desktop workbench shell
imbajin Jul 12, 2026
229149f
fix(hubble): preserve workbench language choice
imbajin Jul 12, 2026
fc3d6ae
fix(hubble): preserve integration contracts
imbajin Jul 12, 2026
6c6dd3d
fix(hubble): preserve recovery details
imbajin Jul 12, 2026
788f596
Apply suggestions from code review
imbajin Jul 12, 2026
3558f7b
feat(hubble): add Red Chamber demo
imbajin Jul 12, 2026
0bd38a6
fix(hubble-be): guard sample schema creation and edge parsing
imbajin Jul 12, 2026
905a9d9
fix(hubble): default oversized results to table
imbajin Jul 12, 2026
0b35d06
feat(hubble): surface safe demo workflows
imbajin Jul 12, 2026
7af60e8
fix(hubble): synchronize graph context
imbajin Jul 12, 2026
d992256
test(hubble): align integrated workflow fixtures
imbajin Jul 12, 2026
e49379c
fix(hubble): align demo and dashboard contracts
imbajin Jul 12, 2026
cd801bc
chore: merge master into Hubble UI branch
imbajin Jul 12, 2026
79e2fda
fix(hubble): restore CI quality gates
imbajin Jul 13, 2026
a4a222c
fix(hubble): verify radio language state
imbajin Jul 13, 2026
90f04fc
fix(hubble): secure PD space responses
imbajin Jul 13, 2026
3dcf24a
fix(hubble): improve workbench usability
imbajin Jul 13, 2026
e1b554b
fix(hubble): address review feedback
imbajin Jul 13, 2026
01640cd
fix(hubble): refine query execution controls
imbajin Jul 13, 2026
471e4fa
feat(hubble): add advanced monitoring entry
imbajin Jul 14, 2026
12baace
fix(hubble): localize default schema title
imbajin Jul 14, 2026
a2998b7
fix(hubble): address backend review findings
imbajin Jul 14, 2026
0e961e6
fix(hubble): enforce exact operations trust
imbajin Jul 14, 2026
d2fafc3
fix(hubble): use canonical user ids
imbajin Jul 14, 2026
fc28e26
fix(hubble): report bounded graph counts
imbajin Jul 14, 2026
b7c7e90
fix(hubble): polish operations interactions
imbajin Jul 14, 2026
accd19e
fix(hubble): address remaining review threads
imbajin Jul 14, 2026
fe227a3
fix(hubble): require explicit account passwords
imbajin Jul 14, 2026
952de13
fix(hubble): keep loader credentials out of metadata
imbajin Jul 14, 2026
ead75c3
fix(hubble): scope graphspace authorization
imbajin Jul 14, 2026
fe8ecfe
fix(hubble): support standalone graph profiles
imbajin Jul 14, 2026
4fa5802
fix(hubble): localize standalone monitoring state
imbajin Jul 14, 2026
8f12dab
fix(hubble): sanitize query failure diagnostics
imbajin Jul 14, 2026
795d3d6
fix(hubble): scope PD graphspace authorizations
imbajin Jul 14, 2026
cb829b2
fix(hubble): recover graph analysis context
imbajin Jul 15, 2026
e9a48ff
fix(hubble): sanitize route failure fallback
imbajin Jul 15, 2026
dd043fc
fix(hubble): close public error disclosure gaps
imbajin Jul 15, 2026
e510778
fix(hubble): improve UI guidance
imbajin Jul 15, 2026
0cb2fd2
fix(hubble): harden query behavior and tests
imbajin Jul 18, 2026
17439b7
fix(hubble): refine workspace journeys
imbajin Jul 19, 2026
5a8f1f9
chore(docs): remove UI screenshots
imbajin Jul 19, 2026
44ba693
fix(hubble): refine graphspace creation form
imbajin Jul 19, 2026
1787b19
fix(hubble): restore Apache license headers
imbajin Jul 19, 2026
18a9e44
fix(hubble): align UI smoke contracts
imbajin Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,16 @@ docker run --rm hugegraph/hugegraph-loader ./bin/hugegraph-loader.sh -f example.

## Module Overview

Before committing a new source or test file, run the same license-header check
used by CI (`license-eye` from `apache/skywalking-eyes` is required):

```bash
./tools/check-license-header.sh
```

Do not use shortened Apache headers: the complete header configured in
`.licenserc.yaml` is required.

### hugegraph-client

**Purpose**: Official Java SDK for HugeGraph Server
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ public GroupAPI(RestClient client) {
super(client);
}

public GroupAPI(RestClient client, String graphSpace) {
super(client, graphSpace);
}

@Override
protected String type() {
return HugeType.GROUP.string();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ public ManagerAPI(RestClient client, String graphSpace) {
}

public UserManager create(UserManager userManager) {
RestResult result = this.client.post(this.path(), userManager);
Map<String, Object> payload = new HashMap<>();
payload.put("user", userManager.user());
payload.put("type", userManager.type());
RestResult result = this.client.post(this.path(), payload);
return result.readObject(UserManager.class);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,10 @@

public class AuthManager {

private final RestClient client;
private final TargetAPI targetAPI;
private final GroupAPI groupAPI;
private final GroupAPI graphSpaceGroupAPI;
private final UserAPI userAPI;
private final AccessAPI accessAPI;
private final BelongAPI belongAPI;
Expand All @@ -60,8 +62,10 @@ public class AuthManager {
private final ManagerAPI managerAPI;

public AuthManager(RestClient client, String graphSpace, String graph) {
this.client = client;
this.targetAPI = new TargetAPI(client, graphSpace);
this.groupAPI = new GroupAPI(client);
this.graphSpaceGroupAPI = new GroupAPI(client, graphSpace);
this.userAPI = new UserAPI(client, graphSpace);
this.accessAPI = new AccessAPI(client, graphSpace);
this.projectAPI = new ProjectAPI(client, graphSpace);
Expand Down Expand Up @@ -120,6 +124,30 @@ public void deleteGroup(Object id) {
this.groupAPI.delete(id);
}

public List<Group> listGraphSpaceGroups() {
return this.listGraphSpaceGroups(-1);
}

public List<Group> listGraphSpaceGroups(int limit) {
return this.graphSpaceGroupAPI.list(limit);
}

public Group getGraphSpaceGroup(Object id) {
return this.graphSpaceGroupAPI.get(id);
}

public Group createGraphSpaceGroup(Group group) {
return this.graphSpaceGroupAPI.create(group);
}

public Group updateGraphSpaceGroup(Group group) {
return this.graphSpaceGroupAPI.update(group);
}

public void deleteGraphSpaceGroup(Object id) {
this.graphSpaceGroupAPI.delete(id);
}

public List<User> listUsers() {
return this.listUsers(-1);
}
Expand Down Expand Up @@ -305,19 +333,43 @@ public UserManager addSpaceAdmin(String user, String graphSpace) {
userManager.type(HugePermission.SPACE);
userManager.graphSpace(graphSpace);
userManager.user(user);
return this.managerAPI.create(userManager);
return this.managerAPI(graphSpace).create(userManager);
}

public UserManager addSpaceMember(String user, String graphSpace) {
UserManager userManager = new UserManager();
userManager.type(HugePermission.SPACE_MEMBER);
userManager.graphSpace(graphSpace);
userManager.user(user);
return this.managerAPI(graphSpace).create(userManager);
}

public void delSuperAdmin(String user) {
this.managerAPI.delete(user, HugePermission.ADMIN, null);
}

public void delSpaceAdmin(String user, String graphSpace) {
this.managerAPI.delete(user, HugePermission.SPACE, graphSpace);
this.managerAPI(graphSpace).delete(user, HugePermission.SPACE,
graphSpace);
}

public void delSpaceMember(String user, String graphSpace) {
this.managerAPI(graphSpace).delete(user, HugePermission.SPACE_MEMBER,
graphSpace);
}

public List<String> listSpaceAdmin(String graphSpace) {
return this.managerAPI.list(HugePermission.SPACE, graphSpace);
return this.managerAPI(graphSpace).list(HugePermission.SPACE,
graphSpace);
}

public List<String> listSpaceMember(String graphSpace) {
return this.managerAPI(graphSpace).list(HugePermission.SPACE_MEMBER,
graphSpace);
}

private ManagerAPI managerAPI(String graphSpace) {
return new ManagerAPI(this.client, graphSpace);
}

public List<String> listSuperAdmin() {
Expand All @@ -329,14 +381,17 @@ public boolean isSuperAdmin() {
}

public boolean isSpaceAdmin(String graphSpace) {
return this.managerAPI.checkPermission(HugePermission.SPACE, graphSpace);
return this.managerAPI(graphSpace)
.checkPermission(HugePermission.SPACE, graphSpace);
}

public boolean checkDefaultRole(String graphSpace, String role) {
return this.managerAPI.checkDefaultRole(graphSpace, role, "");
return this.managerAPI(graphSpace)
.checkDefaultRole(graphSpace, role, "");
}

public boolean checkDefaultRole(String graphSpace, String role, String graph) {
return this.managerAPI.checkDefaultRole(graphSpace, role, graph);
return this.managerAPI(graphSpace)
.checkDefaultRole(graphSpace, role, graph);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@
import org.apache.hugegraph.api.gremlin.GremlinRequest;
import org.apache.hugegraph.api.job.GremlinJobAPI;
import org.apache.hugegraph.client.RestClient;
import org.apache.hugegraph.exception.ServerException;
import org.apache.hugegraph.structure.gremlin.Response;
import org.apache.hugegraph.structure.gremlin.ResultSet;

public class GremlinManager {

public static final String IDEMPOTENT_TRAVERSAL_FALLBACK_MARKER =
"// hugegraph-client:idempotent-traversal-fallback\n";

private final GraphManager graphManager;

private final GremlinAPI gremlinAPI;
Expand All @@ -43,22 +47,49 @@ public GremlinManager(RestClient client, String graphSpace, String graph,
}

public ResultSet execute(GremlinRequest request) {
if (this.gremlinAPI.isSupportGs()) {
bindAliases(request, this.gremlinAPI.isSupportGs(), this.graphSpace,
this.graph);

Response response;
try {
response = this.gremlinAPI.post(request);
} catch (ServerException e) {
if (!this.gremlinAPI.isSupportGs() ||
!allowTraversalFallback(request, e.getMessage())) {
throw e;
}
prepareTraversalFallback(request);
response = this.gremlinAPI.post(request);
}
response.graphManager(this.graphManager);
// TODO: Can add some checks later
return response.result();
}

static void bindAliases(GremlinRequest request, boolean supportGraphSpace,
String graphSpace, String graph) {
if (supportGraphSpace) {
// Bind "graph" and graph space to all graphs
request.aliases.put("graph", this.graphSpace + "-" + this.graph);
request.aliases.put("graph", graphSpace + "-" + graph);
// Bind "g" and graph space to all graphs by custom rule which define in gremlin server.
request.aliases.put("g", "__g_" + this.graphSpace + "-" + this.graph);
request.aliases.put("g", "__g_" + graphSpace + "-" + graph);
} else {
// Bind "graph" to all graphs
request.aliases.put("graph", this.graph);
request.aliases.put("graph", graph);
// Bind "g" to all graphs by custom rule which define in gremlin server.
request.aliases.put("g", "__g_" + this.graph);
request.aliases.put("g", "__g_" + graph);
}
}

Response response = this.gremlinAPI.post(request);
response.graphManager(this.graphManager);
// TODO: Can add some checks later
return response.result();
static void prepareTraversalFallback(GremlinRequest request) {
request.aliases.remove("g");
request.gremlin = "g = graph.traversal();\n" + request.gremlin;
}

static boolean allowTraversalFallback(GremlinRequest request,
String message) {
return request.gremlin.startsWith(IDEMPOTENT_TRAVERSAL_FALLBACK_MARKER) &&
message != null && message.contains("Could not rebind [g]");
}

public long executeAsTask(GremlinRequest request) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.apache.hugegraph.driver.factory;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -185,6 +186,9 @@ public List<String> getURLs(String cluster, String graphSpace,
.build();

NodeInfos nodeInfos = client.getNodeInfos(query);
if (nodeInfos == null) {
return Collections.emptyList();
}
Comment thread
imbajin marked this conversation as resolved.

List<String> urls = nodeInfos.getInfoList().stream()
.map(nodeInfo -> nodeInfo.getAddress())
Expand All @@ -205,6 +209,9 @@ protected List<String> getURLsWithConfig(String cluster,
.build();

NodeInfos nodeInfos = client.getNodeInfos(query);
if (nodeInfos == null) {
return Collections.emptyList();
}
Comment thread
imbajin marked this conversation as resolved.

List<String> urls = nodeInfos.getInfoList().stream()
.map(nodeInfo -> nodeInfo.getAddress())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

public class Access extends AuthElement {

@JsonProperty(value = "graphspace", access = JsonProperty.Access.READ_ONLY)
@JsonProperty(value = "graphspace", access = JsonProperty.Access.WRITE_ONLY)
protected String graphSpace;
@JsonProperty("group")
private Object group;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@

public class Belong extends AuthElement {

@JsonProperty(value = "graphspace", access = JsonProperty.Access.READ_ONLY)
@JsonProperty(value = "graphspace", access = JsonProperty.Access.WRITE_ONLY)
protected String graphSpace;
@JsonProperty("user")
protected Object user;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public enum HugePermission {
EXECUTE(0x08),

SPACE(0x1f),
SPACE_MEMBER(0x2f),
ADMIN(0x7f);

private final byte code;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ public class Target extends AuthElement {

@JsonProperty("target_name")
protected String name;
@JsonProperty("graphspace")
@JsonProperty(value = "graphspace",
access = JsonProperty.Access.WRITE_ONLY)
protected String graphSpace;
@JsonProperty("target_graph")
protected String graph;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

package org.apache.hugegraph.structure.space;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

Expand Down Expand Up @@ -80,9 +79,9 @@ public class GraphSpace {
@JsonProperty("dp_password")
private String dpPassWord;

@JsonIgnore
@JsonProperty("create_time")
private String createTime;
@JsonIgnore
@JsonProperty("update_time")
private String updateTime;

@JsonProperty("configs")
Expand Down
Loading
Loading