diff --git a/.asf.yaml b/.asf.yaml
index 3f53bf5883..2cc4b1d1b4 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -18,9 +18,8 @@
github:
features:
issues: true
- # Enable wiki for documentation
wiki: true
- # Enable projects for project management boards
+ # Enable projects for project (task)management boards
projects: true
discussions: true
description: A graph database that supports more than 100+ billion data, high performance and scalability (Include OLTP Engine & REST-API & Backends)
@@ -46,11 +45,12 @@ github:
required_pull_request_reviews:
dismiss_stale_reviews: true
require_code_owner_reviews: false
- required_approving_review_count: 2
+ required_approving_review_count: 1
# (for non-committer): assign/edit/close issues & PR, without write access to the code
collaborators:
- - Pengzna
- haohao0103
+ - kenssa4eedfd
+ - Tsukilc
# refer https://cwiki.apache.org/confluence/display/INFRA/Git+-+.asf.yaml+features#Git.asf.yamlfeatures-Notificationsettingsforrepositories
notifications:
diff --git a/hugegraph-commons/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh b/.dockerignore
similarity index 57%
rename from hugegraph-commons/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh
rename to .dockerignore
index 91f8b986ad..ee61478a15 100644
--- a/hugegraph-commons/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh
+++ b/.dockerignore
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -16,18 +15,46 @@
# limitations under the License.
#
-BASE_PATH=$(cd "$(dirname "$0")" || exit; pwd)
-DEP_PATH=$BASE_PATH/all_dependencies
-FILE_NAME=${1:-known-dependencies.txt}
+# IMPORTANT: .dockerignore does NOT inherit .gitignore — patterns must be restated.
-if [[ -d $DEP_PATH ]]; then
- echo "rm -r -f DEP_PATH"
- rm -r -f "$DEP_PATH"
-fi
+# Build output
+**/target/
-cd "$BASE_PATH"/../../../ || exit
+# Pre-extracted release dirs / archives
+apache-hugegraph-*/
+**/*.tar
+**/*.tar.gz
+**/*.zip
+**/*.war
-mvn dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory="$DEP_PATH"
+# IDE / OS
+.idea/
+.vscode/
+**/*.iml
+**/*.iws
+**/.DS_Store
-ls "$DEP_PATH" | egrep -v "^hugegraph|hubble" | sort -n > "$BASE_PATH"/"$FILE_NAME"
-rm -r -f "$DEP_PATH"
+# Build / runtime artifacts
+**/logs/
+**/*.log
+**/*.class
+**/gen-java/
+**/upload-files/
+**/build/
+**/node_modules/
+
+# Env files
+.env.local
+.env.*.local
+
+# Git internals
+.git
+.gitignore
+.gitattributes
+.github
+
+# Compose / docs not needed in build context
+**/docker-compose*.yml
+**/docker-compose*.yaml
+**/*.md
+docs/
diff --git a/hugegraph-commons/hugegraph-dist/scripts/dependency/check_dependencies.sh b/.github/workflows/docker-build-ci.yml
similarity index 55%
rename from hugegraph-commons/hugegraph-dist/scripts/dependency/check_dependencies.sh
rename to .github/workflows/docker-build-ci.yml
index 642c455aa9..2d88b72e7a 100644
--- a/hugegraph-commons/hugegraph-dist/scripts/dependency/check_dependencies.sh
+++ b/.github/workflows/docker-build-ci.yml
@@ -1,4 +1,3 @@
-#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -16,17 +15,34 @@
# limitations under the License.
#
-BASE_PATH=$(cd "$(dirname "$0")" || exit; pwd)
+name: "Docker Build CI"
-# check whether there are new third-party dependencies by diff command,
-# diff generated 'current-dependencies.txt' file with 'known-dependencies.txt' file.
-diff -w -B -U0 <(sort < "${BASE_PATH}"/known-dependencies.txt) \
- <(sort < "${BASE_PATH}"/current-dependencies.txt) > "${BASE_PATH}"/result.txt
+on:
+ push:
+ branches:
+ - master
+ - 'release-*'
+ pull_request:
+ paths:
+ - '**/Dockerfile*'
+ - '.dockerignore'
-# if has new third-party,the Action will fail and print diff
-if [ -s "${BASE_PATH}"/result.txt ]; then
- cat "${BASE_PATH}"/result.txt
- exit 1
-else
- echo 'All third dependencies is known!'
-fi
+jobs:
+ docker-build:
+ runs-on: ubuntu-24.04
+ strategy:
+ fail-fast: false
+ matrix:
+ dockerfile:
+ - hugegraph-pd/Dockerfile
+ - hugegraph-store/Dockerfile
+ - hugegraph-server/Dockerfile
+ - hugegraph-server/Dockerfile-hstore
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Build ${{ matrix.dockerfile }}
+ run: |
+ docker build -f ${{ matrix.dockerfile }} .
diff --git a/.github/workflows/pd-store-ci.yml b/.github/workflows/pd-store-ci.yml
index d4f2ea382f..29ac9c3ac8 100644
--- a/.github/workflows/pd-store-ci.yml
+++ b/.github/workflows/pd-store-ci.yml
@@ -52,6 +52,11 @@ jobs:
mvn -U -ntp dependency:get -Dartifact=org.apache.hugegraph:hugegraph-struct:$REVISION
fi
+ - name: Run hugegraph-struct test
+ if: ${{ hashFiles('hugegraph-struct/pom.xml') != '' }}
+ run: |
+ mvn -U -ntp -pl hugegraph-struct test
+
pd:
needs: struct
runs-on: ubuntu-latest
@@ -102,6 +107,12 @@ jobs:
run: |
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp --fail-at-end
+ - name: Run start-hugegraph-pd.sh foreground mode tests
+ run: |
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ PD_DIR=hugegraph-pd/apache-hugegraph-pd-$VERSION/
+ $TRAVIS_DIR/test-start-hugegraph-pd.sh $PD_DIR
+
- name: Prepare env and service
run: |
$TRAVIS_DIR/start-pd.sh
@@ -158,6 +169,12 @@ jobs:
run: |
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp --fail-at-end
+ - name: Run start-hugegraph-store.sh foreground mode tests
+ run: |
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ STORE_DIR=hugegraph-store/apache-hugegraph-store-$VERSION/
+ $TRAVIS_DIR/test-start-hugegraph-store.sh $STORE_DIR
+
- name: Prepare env and service
run: |
$TRAVIS_DIR/start-pd.sh
diff --git a/.github/workflows/rerun-ci.yml b/.github/workflows/rerun-ci.yml
new file mode 100644
index 0000000000..3fdd4c0f56
--- /dev/null
+++ b/.github/workflows/rerun-ci.yml
@@ -0,0 +1,85 @@
+name: "Rerun CI"
+
+on:
+ workflow_run:
+ workflows:
+ - "HugeGraph-Server CI"
+ - "HugeGraph-Commons CI"
+ - "HugeGraph-PD & Store & Hstore CI"
+ - "Cluster Test CI"
+ types:
+ - completed
+
+permissions: {}
+
+env:
+ MAX_RERUNS: '2'
+ RETRY_DELAY_SECONDS: '180'
+
+jobs:
+ decide-rerun-action:
+ if: ${{ github.event.workflow_run.conclusion == 'failure' }}
+ runs-on: ubuntu-latest
+ outputs:
+ action: ${{ steps.decision.outputs.action }}
+ steps:
+ - name: Decide rerun action
+ id: decision
+ env:
+ WORKFLOW_NAME: ${{ github.event.workflow_run.name }}
+ RUN_ID: ${{ github.event.workflow_run.id }}
+ RUN_ATTEMPT: ${{ github.event.workflow_run.run_attempt }}
+ EVENT_NAME: ${{ github.event.workflow_run.event }}
+ HEAD_BRANCH: ${{ github.event.workflow_run.head_branch }}
+ run: |
+ set -euo pipefail
+
+ action="skip"
+ reason="unsupported event: $EVENT_NAME"
+
+ if [[ "$EVENT_NAME" == "push" || "$EVENT_NAME" == "pull_request" ]]; then
+ if (( RUN_ATTEMPT > MAX_RERUNS )); then
+ reason="retry limit reached"
+ else
+ action="rerun"
+ reason="within retry limit"
+ fi
+ fi
+
+ {
+ echo "action=$action"
+ echo "reason=$reason"
+ } >> "$GITHUB_OUTPUT"
+
+ {
+ echo "### Rerun CI decision"
+ echo ""
+ echo "- Workflow: $WORKFLOW_NAME"
+ echo "- Source event: $EVENT_NAME"
+ echo "- Head branch: $HEAD_BRANCH"
+ echo "- Run ID: $RUN_ID"
+ echo "- Current attempt: $RUN_ATTEMPT"
+ echo "- Max automatic reruns: $MAX_RERUNS"
+ echo "- Delay seconds: $RETRY_DELAY_SECONDS"
+ echo "- Action: $action"
+ echo "- Reason: $reason"
+ } >> "$GITHUB_STEP_SUMMARY"
+
+ rerun-failed-jobs:
+ needs: decide-rerun-action
+ if: needs.decide-rerun-action.outputs.action == 'rerun'
+ permissions:
+ actions: write
+ contents: read
+ runs-on: ubuntu-latest
+ steps:
+ - name: Wait before rerun
+ run: |
+ sleep "$RETRY_DELAY_SECONDS"
+
+ - name: Rerun failed jobs
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GH_REPO: ${{ github.repository }}
+ run: |
+ gh run rerun ${{ github.event.workflow_run.id }} --failed
diff --git a/.github/workflows/server-ci.yml b/.github/workflows/server-ci.yml
index f91bd809a3..20619797cc 100644
--- a/.github/workflows/server-ci.yml
+++ b/.github/workflows/server-ci.yml
@@ -70,6 +70,14 @@ jobs:
run: |
mvn clean compile -U -Dmaven.javadoc.skip=true -ntp
+ - name: Run start-hugegraph.sh foreground mode tests
+ if: ${{ env.BACKEND == 'rocksdb' }}
+ run: |
+ mvn package -Dmaven.test.skip=true -pl hugegraph-server/hugegraph-dist -am -ntp
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ SERVER_DIR=hugegraph-server/apache-hugegraph-server-$VERSION/
+ $TRAVIS_DIR/test-start-hugegraph.sh $SERVER_DIR
+
- name: Run unit test
run: |
$TRAVIS_DIR/run-unit-test.sh $BACKEND
@@ -100,3 +108,76 @@ jobs:
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ${{ env.REPORT_DIR }}/*.xml
+
+ build-server-macos-rocksdb:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - os: macos-15-intel
+ server_java_options: ''
+ - os: macos-15
+ server_java_options: '-Xms512m -Xmx2g'
+ env:
+ USE_STAGE: 'false' # Whether to include the stage repository.
+ TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
+ REPORT_DIR: target/site/jacoco
+ BACKEND: rocksdb
+ JAVA_VERSION: '11'
+ SERVER_JAVA_OPTIONS: ${{ matrix.server_java_options }}
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 5
+
+ - name: Install Java ${{ env.JAVA_VERSION }}
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ env.JAVA_VERSION }}
+ distribution: 'zulu'
+
+ - name: Cache Maven packages
+ uses: actions/cache@v4
+ with:
+ path: ~/.m2
+ key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+ restore-keys: ${{ runner.os }}-m2
+
+ - name: Use staged maven repo settings
+ if: ${{ env.USE_STAGE == 'true' }}
+ run: |
+ cp $HOME/.m2/settings.xml /tmp/settings.xml
+ cp -vf .github/configs/settings.xml $HOME/.m2/settings.xml && cat $HOME/.m2/settings.xml
+
+ - name: Compile
+ run: |
+ mvn clean compile -pl hugegraph-server/hugegraph-test -am -U -Dmaven.javadoc.skip=true -ntp
+
+ - name: Run RocksDB core test
+ run: |
+ $TRAVIS_DIR/run-core-test.sh $BACKEND
+
+ - name: Run RocksDB API test
+ run: |
+ $TRAVIS_DIR/run-api-test.sh $BACKEND $REPORT_DIR
+
+ - name: Show server log on failure
+ if: failure()
+ run: |
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ SERVER_DIR=hugegraph-server/apache-hugegraph-server-$VERSION/
+ if [ -f "$SERVER_DIR/logs/hugegraph-server.log" ]; then
+ tail -n 200 "$SERVER_DIR/logs/hugegraph-server.log"
+ fi
+
+ - name: Stop RocksDB server
+ if: always()
+ run: |
+ VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
+ SERVER_DIR=hugegraph-server/apache-hugegraph-server-$VERSION/
+ if [ -f "$SERVER_DIR/bin/pid" ]; then
+ $TRAVIS_DIR/stop-server.sh $SERVER_DIR || true
+ fi
diff --git a/.gitignore b/.gitignore
index f9670e332f..e27322b73a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -91,6 +91,11 @@ hs_err_pid*
hugegraph-server/hugegraph-dist/docker/data/
# AI-IDE prompt files (We only keep AGENTS.md, other files could soft-linked it when needed)
+# Serena MCP memories
+.serena/*
+!.serena/project.yml
+!.serena/memories/
+.mcp.json
# Claude Projects
CLAUDE.md
CLAUDE_*.md
@@ -112,3 +117,4 @@ codeium-instructions.md
.ai-instructions.md
*.ai-prompt.md
WARP.md
+.mcp.json
diff --git a/.licenserc.yaml b/.licenserc.yaml
index 3ebf89162d..8da741f65a 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -59,6 +59,7 @@ header: # `header` section is configurations for source codes license header.
- 'LICENSE'
- 'NOTICE'
- 'DISCLAIMER'
+ - '.serena/**'
- '**/*.versionsBackup'
- '**/*.versionsBackup'
- '**/*.proto'
diff --git a/.serena/.gitignore b/.serena/.gitignore
new file mode 100644
index 0000000000..14d86ad623
--- /dev/null
+++ b/.serena/.gitignore
@@ -0,0 +1 @@
+/cache
diff --git a/.serena/memories/architecture_and_modules.md b/.serena/memories/architecture_and_modules.md
new file mode 100644
index 0000000000..8d6c85888e
--- /dev/null
+++ b/.serena/memories/architecture_and_modules.md
@@ -0,0 +1,35 @@
+# Architecture and Module Structure
+
+## Three-Tier Architecture
+
+### 1. Client Layer
+- Gremlin/Cypher queries, REST APIs, Swagger UI
+
+### 2. Server Layer (hugegraph-server, 13 submodules)
+- **REST API** (hugegraph-api): GraphAPI, SchemaAPI, GremlinAPI, CypherAPI, AuthAPI, GraphSpaceAPI (distributed only), ManagerAPI (distributed only)
+- **Graph Engine** (hugegraph-core): Schema (with TTL update), traversal, task scheduling, GraphSpace multi-tenancy
+- **Backend Interface**: Pluggable via `BackendStore`
+
+### 3. Storage Layer
+- RocksDB (default/embedded), HStore (distributed/production)
+- Legacy (≤1.5.0, deprecated, excluded from context): MySQL, PostgreSQL, Cassandra, ScyllaDB, HBase, Palo
+
+## Module Structure (7 top-level modules)
+
+### hugegraph-server (13 submodules)
+`hugegraph-core`, `hugegraph-api` (includes `opencypher/`, `space/`), `hugegraph-dist`, `hugegraph-test`, `hugegraph-example`, plus backends: `hugegraph-rocksdb`, `hugegraph-hstore`, `hugegraph-hbase`, `hugegraph-mysql`, `hugegraph-postgresql`, `hugegraph-cassandra`, `hugegraph-scylladb`, `hugegraph-palo`
+
+### hugegraph-pd (8 submodules)
+Placement Driver: `hg-pd-core`, `hg-pd-service`, `hg-pd-client`, `hg-pd-common`, `hg-pd-grpc`, `hg-pd-cli`, `hg-pd-dist`, `hg-pd-test`
+
+### hugegraph-store (9 submodules)
+Distributed storage + Raft: `hg-store-core`, `hg-store-node`, `hg-store-client`, `hg-store-common`, `hg-store-grpc`, `hg-store-rocksdb`, `hg-store-cli`, `hg-store-dist`, `hg-store-test`
+
+### Others
+- **hugegraph-commons**: Shared utilities, RPC framework
+- **hugegraph-struct**: Data structures (must build before PD/Store)
+- **install-dist**: Distribution packaging, license files
+- **hugegraph-cluster-test**: Cluster integration tests
+
+## Distributed Deployment (BETA)
+PD + Store + Server (3+ nodes each), all gRPC. Docker compose configs in `docker/` directory, using bridge networking (migrated from host mode).
diff --git a/.serena/memories/code_style_and_conventions.md b/.serena/memories/code_style_and_conventions.md
new file mode 100644
index 0000000000..159920cd3b
--- /dev/null
+++ b/.serena/memories/code_style_and_conventions.md
@@ -0,0 +1,28 @@
+# Code Style and Conventions
+
+## Style Tools
+- `.editorconfig` — Primary style definition
+- `style/checkstyle.xml` — Enforcement (note: `hugegraph-style.xml` was removed)
+- `.licenserc.yaml` + apache-rat-plugin + skywalking-eyes — License header validation
+
+## Core Rules
+- **Line length**: 100 chars (120 for XML)
+- **Indent**: 4 spaces, continuation 8 spaces
+- **Charset**: UTF-8, LF line endings, final newline
+- **Imports**: Sorted `$*` → `java` → `javax` → `org` → `com` → `*`, no star imports (threshold 100)
+- **Braces**: `if`/`while`/`for` forced if multiline, `do-while` always
+- **Blank lines**: Max 1 in code/declarations
+- **JavaDoc**: `
` on empty lines, no wrap if one line
+
+## Naming
+- Packages: `org.apache.hugegraph.*` (lowercase dot-separated)
+- Classes: PascalCase, Methods/Variables: camelCase, Constants: UPPER_SNAKE_CASE
+
+## License
+- All source files require Apache 2.0 header
+- gRPC generated code excluded from checks
+- Validate: `mvn apache-rat:check -ntp` + `mvn editorconfig:check`
+
+## Build
+- Java 11 target, `-Xlint:unchecked`, Lombok 1.18.30 (provided/optional)
+- Swagger: `io.swagger.core.v3:swagger-jaxrs2-jakarta` for REST API docs
diff --git a/.serena/memories/ecosystem_and_related_projects.md b/.serena/memories/ecosystem_and_related_projects.md
new file mode 100644
index 0000000000..6bb1344d66
--- /dev/null
+++ b/.serena/memories/ecosystem_and_related_projects.md
@@ -0,0 +1,23 @@
+# HugeGraph Ecosystem and Related Projects
+
+## This Repo: apache/hugegraph (server, OLTP)
+
+## Ecosystem
+| Repo | Purpose |
+|------|---------|
+| hugegraph-toolchain | Loader, Hubble (visualization), Tools CLI, Java Client |
+| hugegraph-computer | OLAP: PageRank, Connected Components, Shortest Path |
+| incubator-hugegraph-ai | Graph RAG, KG construction, NL→Gremlin/Cypher |
+| hugegraph-doc | Docs & website (hugegraph.apache.org) |
+
+## Data Flow
+```
+Sources → hugegraph-loader → hugegraph-server → Hubble / Computer / AI
+```
+
+## Integrations
+- Big Data: Flink, Spark, HDFS
+- Queries: Gremlin (TinkerPop 3.5.1), OpenCypher, REST API + Swagger UI
+- Storage: RocksDB (default), HStore (distributed)
+
+## Version: Server 1.7.0, TinkerPop 3.5.1, Java 11+
diff --git a/.serena/memories/implementation_patterns_and_guidelines.md b/.serena/memories/implementation_patterns_and_guidelines.md
new file mode 100644
index 0000000000..c2b98313e2
--- /dev/null
+++ b/.serena/memories/implementation_patterns_and_guidelines.md
@@ -0,0 +1,50 @@
+# Implementation Patterns and Guidelines
+
+## Backend Architecture
+- Backends implement `BackendStore` interface from `hugegraph-core`
+- Each backend = separate Maven module under `hugegraph-server/`
+- Configured via `hugegraph.properties` → `backend` property
+- **Active backends (focus here)**: RocksDB (default/embedded), HStore (distributed)
+- **Legacy backends** (deprecated, excluded from Serena context): MySQL, PostgreSQL, Cassandra, ScyllaDB, HBase, Palo
+
+## GraphSpace Multi-Tenancy
+- Core: `hugegraph-core/.../space/` (GraphSpace, SchemaTemplate, Service, register/)
+- API: `hugegraph-api/.../api/space/GraphSpaceAPI.java` (includes GS profile endpoints)
+- **Standalone mode**: GraphSpaceAPI and ManagerAPI are disabled
+
+## Auth System
+- Disabled by default, enable via `bin/enable-auth.sh`
+- ConfigAuthenticator was removed, use standard auth
+- Multi-level: Users, Groups, Projects, Targets, Access control
+- Location: `hugegraph-api/.../api/auth/`
+
+## gRPC Protocol
+- PD protos: `hugegraph-pd/hg-pd-grpc/src/main/proto/`
+- Store protos: `hugegraph-store/hg-store-grpc/src/main/proto/`
+- After `.proto` changes: `mvn clean compile` → `target/generated-sources/protobuf/`
+
+## Query Languages
+- **Gremlin**: Native TinkerPop 3.5.1
+- **OpenCypher**: `hugegraph-api/opencypher/`
+- TinkerPop exceptions are passed through in Gremlin responses
+
+## Schema
+- Labels support TTL with runtime update
+- Edge label conflicting conditions are handled safely
+
+## Testing
+- **Profiles**: `unit-test`, `core-test`, `api-test`, `tinkerpop-structure-test`, `tinkerpop-process-test`
+- **Backends in CI**: memory, rocksdb, hbase (matrix)
+- **Single test class**: `mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,memory -Dtest=ClassName`
+- TinkerPop tests: only on `release-*`/`test-*` branches
+- Raft tests: only on `test*`/`raft*` branches
+
+## Docker
+- Single-node: `docker/docker-compose.yml` (bridge network, pd+store+server)
+- Cluster: `docker/docker-compose-3pd-3store-3server.yml`
+- Container logs: stdout-based
+
+## CI Pipelines
+- `server-ci.yml`: compile + unit/core/API tests (memory/rocksdb/hbase × Java 11)
+- `rerun-ci.yml`: auto-rerun flaky failures (max 2 reruns, 180s delay)
+- `auto-pr-review.yml`: auto-comment on new PRs
diff --git a/.serena/memories/key_file_locations.md b/.serena/memories/key_file_locations.md
new file mode 100644
index 0000000000..3f2a60dee0
--- /dev/null
+++ b/.serena/memories/key_file_locations.md
@@ -0,0 +1,44 @@
+# Key File and Directory Locations
+
+## Build & Config
+- `pom.xml` — Root multi-module POM
+- `.editorconfig` — Code style rules
+- `style/checkstyle.xml` — Checkstyle enforcement (hugegraph-style.xml was removed)
+- `.licenserc.yaml` — License checker config
+
+## Server (hugegraph-server)
+- Core engine: `hugegraph-core/src/main/java/org/apache/hugegraph/` → `backend/`, `schema/`, `traversal/`, `task/`
+- GraphSpace: `hugegraph-core/.../space/` → `GraphSpace.java`, `SchemaTemplate.java`, `Service.java`, `register/`
+- REST APIs: `hugegraph-api/src/main/java/org/apache/hugegraph/api/` → `graph/`, `schema/`, `gremlin/`, `cypher/`, `auth/`, `space/` (GraphSpaceAPI), `metrics/`, `arthas/`
+- OpenCypher: `hugegraph-api/.../opencypher/`
+- Backend interface: `hugegraph-core/.../backend/store/BackendStore.java`
+- Distribution: `hugegraph-dist/src/assembly/static/` → `bin/`, `conf/`, `lib/`, `logs/`
+- Tests: `hugegraph-test/src/main/java/.../` → `unit/`, `core/`, `api/`, `tinkerpop/`
+
+## Docker
+- `docker/docker-compose.yml` — Single-node (bridge network, pd+store+server)
+- `docker/docker-compose-3pd-3store-3server.yml` — 3-node cluster
+- `docker/docker-compose.dev.yml` — Dev mode
+
+## PD Module
+- Proto: `hugegraph-pd/hg-pd-grpc/src/main/proto/`
+- Dist: `hugegraph-pd/hg-pd-dist/src/assembly/static/`
+
+## Store Module
+- Proto: `hugegraph-store/hg-store-grpc/src/main/proto/`
+- Dist: `hugegraph-store/hg-store-dist/src/assembly/static/`
+
+## CI Workflows (.github/workflows/)
+- `server-ci.yml` — Server tests (matrix: memory/rocksdb/hbase × Java 11)
+- `pd-store-ci.yml` — PD, Store & HStore tests
+- `commons-ci.yml` — Commons tests
+- `cluster-test-ci.yml` — Cluster integration
+- `licence-checker.yml` — License headers
+- `rerun-ci.yml` — Auto-rerun for flaky workflows
+- `auto-pr-review.yml` — Auto-comment on new PRs
+- `check-dependencies.yml` — Dependency checks
+- `codeql-analysis.yml` — CodeQL security scanning
+- `stale.yml` — Stale issue/PR cleanup
+
+## Docs
+- `README.md`, `BUILDING.md`, `CONTRIBUTING.md`, `AGENTS.md`, `CLAUDE.md`
diff --git a/.serena/memories/project_overview.md b/.serena/memories/project_overview.md
new file mode 100644
index 0000000000..c494aaed44
--- /dev/null
+++ b/.serena/memories/project_overview.md
@@ -0,0 +1,27 @@
+# Apache HugeGraph Project Overview
+
+## Project Purpose
+Apache HugeGraph is a fast-speed, highly-scalable graph database supporting 10+ billion vertices/edges for OLTP workloads. Graduated from Apache Incubator (incubating branding removed).
+
+## Key Capabilities
+- Apache TinkerPop 3 compliant graph database
+- Gremlin + OpenCypher query languages
+- Schema metadata management (VertexLabel, EdgeLabel, PropertyKey, IndexLabel) with TTL update support
+- Multi-type indexes (exact, range, complex conditions)
+- Pluggable backend storage (RocksDB default, HStore distributed)
+- GraphSpace multi-tenancy (standalone mode disables GraphSpaceAPI/ManagerAPI)
+- Swagger UI for REST API documentation
+- Integration with Flink/Spark/HDFS
+
+## Technology Stack
+- **Language**: Java 11+ (required)
+- **Build**: Maven 3.5+
+- **Graph Framework**: Apache TinkerPop 3.5.1
+- **RPC**: gRPC + Protocol Buffers
+- **API Docs**: Swagger (io.swagger.core.v3)
+- **Storage**: RocksDB (default/embedded), HStore (distributed/production)
+- **Legacy backends** (≤1.5.0): MySQL, PostgreSQL, Cassandra, ScyllaDB, HBase, Palo
+
+## Version
+- Current: 1.7.0 (`${revision}` property, Maven flatten plugin)
+- License: Apache License 2.0
diff --git a/.serena/memories/suggested_commands.md b/.serena/memories/suggested_commands.md
new file mode 100644
index 0000000000..346304432f
--- /dev/null
+++ b/.serena/memories/suggested_commands.md
@@ -0,0 +1,58 @@
+# Suggested Development Commands
+
+## Build
+```bash
+mvn clean install -DskipTests # Full build
+mvn clean install -pl hugegraph-server -am -DskipTests # Server only
+mvn clean compile -U -Dmaven.javadoc.skip=true -ntp # Compile only
+mvn clean package -DskipTests # Distribution → install-dist/target/
+```
+
+## Test
+```bash
+# Server tests (memory/rocksdb/hbase backends)
+mvn test -pl hugegraph-server/hugegraph-test -am -P unit-test
+mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,memory
+mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,rocksdb
+mvn test -pl hugegraph-server/hugegraph-test -am -P api-test,rocksdb
+
+# Single test class
+mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,memory -Dtest=YourTestClass
+
+# TinkerPop compliance (release/test branches only)
+mvn test -pl hugegraph-server/hugegraph-test -am -P tinkerpop-structure-test,memory
+
+# PD/Store (build struct first)
+mvn install -pl hugegraph-struct -am -DskipTests
+mvn test -pl hugegraph-pd/hg-pd-test -am
+mvn test -pl hugegraph-store/hg-store-test -am
+```
+
+## Validation
+```bash
+mvn apache-rat:check -ntp # License headers
+mvn editorconfig:check # Code style (.editorconfig)
+mvn checkstyle:check # Code style (style/checkstyle.xml)
+mvn clean compile -Dmaven.javadoc.skip=true # Compile warnings
+```
+
+## Server Ops
+Scripts in `hugegraph-server/hugegraph-dist/src/assembly/static/bin/` (or extracted distribution `bin/`):
+```bash
+bin/init-store.sh && bin/start-hugegraph.sh # Init + start
+bin/stop-hugegraph.sh # Stop
+bin/enable-auth.sh # Enable auth
+```
+
+## Docker
+```bash
+cd docker && docker compose up -d # Single-node (bridge network)
+cd docker && docker compose -f docker-compose-3pd-3store-3server.yml up -d # Cluster
+```
+
+## Distributed Build (BETA)
+```bash
+mvn install -pl hugegraph-struct -am -DskipTests # 1. Struct first
+mvn clean package -pl hugegraph-pd -am -DskipTests # 2. PD
+mvn clean package -pl hugegraph-store -am -DskipTests # 3. Store
+```
diff --git a/.serena/memories/task_completion_checklist.md b/.serena/memories/task_completion_checklist.md
new file mode 100644
index 0000000000..5e8ec4d82e
--- /dev/null
+++ b/.serena/memories/task_completion_checklist.md
@@ -0,0 +1,32 @@
+# Task Completion Checklist
+
+## 1. Code Quality (MANDATORY)
+```bash
+mvn apache-rat:check -ntp # License headers
+mvn editorconfig:check # Style (.editorconfig)
+mvn checkstyle:check # Style (style/checkstyle.xml)
+mvn clean compile -Dmaven.javadoc.skip=true # Compile warnings
+```
+
+## 2. Testing
+- Choose backend: `memory` (fast), `rocksdb` (realistic), `hbase` (distributed)
+- Single test: `-Dtest=ClassName` works with all profiles
+- Bug fix → existing tests; New feature → write tests; Refactor → affected module tests
+
+## 3. Dependencies (if adding new)
+1. License file → `install-dist/release-docs/licenses/`
+2. Declare in `install-dist/release-docs/LICENSE`
+3. Append NOTICE → `install-dist/release-docs/NOTICE`
+4. Run `./install-dist/scripts/dependency/regenerate_known_dependencies.sh`
+
+## 4. CI Awareness
+- `server-ci.yml`: memory/rocksdb/hbase × Java 11
+- `rerun-ci.yml`: auto-retries flaky failures
+- `licence-checker.yml`: header validation
+- Raft tests: only `test*`/`raft*` branches
+- TinkerPop tests: only `release-*`/`test-*` branches
+
+## 5. Commit
+- NEVER commit unless explicitly asked
+- Format: `feat|fix|refactor(module): msg`
+- Include issue ID if available
diff --git a/.serena/project.yml b/.serena/project.yml
new file mode 100644
index 0000000000..3329e5b5af
--- /dev/null
+++ b/.serena/project.yml
@@ -0,0 +1,168 @@
+# list of languages for which language servers are started; choose from:
+# al bash clojure cpp csharp
+# csharp_omnisharp dart elixir elm erlang
+# fortran fsharp go groovy haskell
+# java julia kotlin lua markdown
+# matlab nix pascal perl php
+# php_phpactor powershell python python_jedi r
+# rego ruby ruby_solargraph rust scala
+# swift terraform toml typescript typescript_vts
+# vue yaml zig
+# (This list may be outdated. For the current list, see values of Language enum here:
+# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
+# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
+# Note:
+# - For C, use cpp
+# - For JavaScript, use typescript
+# - For Free Pascal/Lazarus, use pascal
+# Special requirements:
+# Some languages require additional setup/installations.
+# See here for details: https://oraios.github.io/serena/01-about/020_programming-languages.html#language-servers
+# When using multiple languages, the first language server that supports a given file will be used for that file.
+# The first language is the default language and the respective language server will be used as a fallback.
+# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
+languages:
+- java
+
+# the encoding used by text files in the project
+# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
+encoding: "utf-8"
+
+# whether to use project's .gitignore files to ignore files
+ignore_all_files_in_gitignore: true
+
+# list of additional paths to ignore in this project.
+# Same syntax as gitignore, so you can use * and **.
+# Note: global ignored_paths from serena_config.yml are also applied additively.
+ignored_paths:
+ # --- Deprecated backends (focus on RocksDB/HStore only) ---
+ - "hugegraph-server/hugegraph-cassandra/**"
+ - "hugegraph-server/hugegraph-scylladb/**"
+ - "hugegraph-server/hugegraph-mysql/**"
+ - "hugegraph-server/hugegraph-postgresql/**"
+ - "hugegraph-server/hugegraph-palo/**"
+ - "hugegraph-server/hugegraph-hbase/**"
+ # --- gRPC generated Java (235k lines, never hand-edited, regenerated by mvn compile) ---
+ - "hugegraph-pd/hg-pd-grpc/src/main/java/**"
+ - "hugegraph-store/hg-store-grpc/src/main/java/**"
+ # --- License/legal files (585 txt files, only touched when adding dependencies) ---
+ - "install-dist/release-docs/licenses/**"
+ - "install-dist/scripts/dependency/known-dependencies.txt"
+ # --- Rarely modified tests/examples ---
+ - "hugegraph-server/hugegraph-test/**/tinkerpop/**"
+ - "hugegraph-server/hugegraph-example/**"
+ - "hugegraph-cluster-test/**"
+ # --- Note: target/, .flattened-pom.xml, .idea/*, apache-hugegraph-*/ already covered by .gitignore ---
+
+# whether the project is in read-only mode
+# If set to true, all editing tools will be disabled and attempts to use them will result in an error
+# Added on 2025-04-18
+read_only: false
+
+# list of tool names to exclude.
+# This extends the existing exclusions (e.g. from the global configuration)
+#
+# Below is the complete list of tools for convenience.
+# To make sure you have the latest list of tools, and to view their descriptions,
+# execute `uv run scripts/print_tool_overview.py`.
+#
+# * `activate_project`: Activates a project by name.
+# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
+# * `create_text_file`: Creates/overwrites a file in the project directory.
+# * `delete_lines`: Deletes a range of lines within a file.
+# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
+# * `execute_shell_command`: Executes a shell command.
+# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
+# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
+# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
+# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
+# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
+# * `initial_instructions`: Gets the initial instructions for the current project.
+# Should only be used in settings where the system prompt cannot be set,
+# e.g. in clients you have no control over, like Claude Desktop.
+# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
+# * `insert_at_line`: Inserts content at a given line in a file.
+# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
+# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
+# * `list_memories`: Lists memories in Serena's project-specific memory store.
+# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
+# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
+# * `read_file`: Reads a file within the project directory.
+# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
+# * `remove_project`: Removes a project from the Serena configuration.
+# * `replace_lines`: Replaces a range of lines within a file with new content.
+# * `replace_symbol_body`: Replaces the full definition of a symbol.
+# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
+# * `search_for_pattern`: Performs a search for a pattern in the project.
+# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
+# * `switch_modes`: Activates modes by providing a list of their names
+# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
+# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
+# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
+# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
+excluded_tools: []
+
+# initial prompt for the project. It will always be given to the LLM upon activating the project
+# (contrary to the memories, which are loaded on demand).
+initial_prompt: ""
+# the name by which the project can be referenced within Serena
+project_name: "server"
+
+# list of tools to include that would otherwise be disabled (particularly optional tools that are disabled by default).
+# This extends the existing inclusions (e.g. from the global configuration).
+included_optional_tools: []
+
+# list of mode names to that are always to be included in the set of active modes
+# The full set of modes to be activated is base_modes + default_modes.
+# If the setting is undefined, the base_modes from the global configuration (serena_config.yml) apply.
+# Otherwise, this setting overrides the global configuration.
+# Set this to [] to disable base modes for this project.
+# Set this to a list of mode names to always include the respective modes for this project.
+base_modes:
+
+# list of mode names that are to be activated by default.
+# The full set of modes to be activated is base_modes + default_modes.
+# If the setting is undefined, the default_modes from the global configuration (serena_config.yml) apply.
+# Otherwise, this overrides the setting from the global configuration (serena_config.yml).
+# This setting can, in turn, be overridden by CLI parameters (--mode).
+default_modes:
+
+# fixed set of tools to use as the base tool set (if non-empty), replacing Serena's default set of tools.
+# This cannot be combined with non-empty excluded_tools or included_optional_tools.
+fixed_tools: []
+
+# time budget (seconds) per tool call for the retrieval of additional symbol information
+# such as docstrings or parameter information.
+# This overrides the corresponding setting in the global configuration; see the documentation there.
+# If null or missing, use the setting from the global configuration.
+symbol_info_budget:
+
+# The language backend to use for this project.
+# If not set, the global setting from serena_config.yml is used.
+# Valid values: LSP, JetBrains
+# Note: the backend is fixed at startup. If a project with a different backend
+# is activated post-init, an error will be returned.
+language_backend:
+
+# list of regex patterns which, when matched, mark a memory entry as read‑only.
+# Extends the list from the global configuration, merging the two lists.
+read_only_memory_patterns: []
+
+# line ending convention to use when writing source files.
+# Possible values: unset (use global setting), "lf", "crlf", or "native" (platform default)
+# This does not affect Serena's own files (e.g. memories and configuration files), which always use native line endings.
+line_ending:
+
+# list of regex patterns for memories to completely ignore.
+# Matching memories will not appear in list_memories or activate_project output
+# and cannot be accessed via read_memory or write_memory.
+# To access ignored memory files, use the read_file tool on the raw file path.
+# Extends the list from the global configuration, merging the two lists.
+# Example: ["_archive/.*", "_episodes/.*"]
+ignored_memory_patterns: []
+
+# advanced configuration option allowing to configure language server-specific options.
+# Maps the language key to the options.
+# Have a look at the docstring of the constructors of the LS implementations within solidlsp (e.g., for C# or PHP) to see which options are available.
+# No documentation on options means no options are available.
+ls_specific_settings: {}
diff --git a/AGENTS.md b/AGENTS.md
index a868739d84..2d6e81b15b 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,261 +1,108 @@
# AGENTS.md
-This file provides guidance to an AI coding tool when working with code in this repository.
+Single source of truth for AI coding agents.
+README.md covers human-facing deployment/ecosystem context; only consult it on demand.
-## Project Overview
+## Stack & Modules
-Apache HugeGraph is a fast-speed and highly-scalable graph database that supports billions of vertices and edges. It is compliant with Apache TinkerPop 3 and supports both Gremlin and Cypher query languages.
+Apache HugeGraph — Apache TinkerPop 3 compliant graph database.
+Java 11+, Maven 3.5+. Version managed via `${revision}` (currently `1.8.0`).
-**Technology Stack**:
-- Java 11+ (required)
-- Apache Maven 3.5+
-- Apache TinkerPop 3.5.1
-- gRPC for distributed communication
-- RocksDB as default storage backend
-
-## Architecture
-
-### Multi-Module Structure
-
-This is a Maven multi-module project with 7 main modules:
-
-1. **hugegraph-server**: Core graph engine, REST APIs, and backend implementations (13 submodules)
-2. **hugegraph-pd**: Placement Driver (meta server) for distributed deployments (8 submodules)
-3. **hugegraph-store**: Distributed storage backend with RocksDB and Raft (9 submodules)
-4. **hugegraph-commons**: Shared utilities (locks, configs, RPC framework)
-5. **hugegraph-struct**: Data structure definitions
-6. **install-dist**: Distribution packaging
-7. **hugegraph-cluster-test**: Cluster integration tests
-
-### Three-Tier Architecture
-
-```bash
-Client Layer (Gremlin/Cypher queries, REST APIs)
- ↓
-Server Layer (hugegraph-server)
- ├─ REST API Layer (hugegraph-api): GraphAPI, SchemaAPI, GremlinAPI, CypherAPI, AuthAPI
- ├─ Graph Engine Layer (hugegraph-core): Schema management, traversal optimization, task scheduling
- └─ Backend Interface: Abstraction over storage backends
- ↓
-Storage Layer (pluggable backends)
- ├─ RocksDB (default, embedded)
- ├─ HStore (distributed, production)
- └─ Legacy: MySQL, PostgreSQL, Cassandra, ScyllaDB, HBase, Palo
+```
+Client (Gremlin / Cypher / REST)
+ │
+Server = hugegraph-server
+ ├─ hugegraph-api REST, Gremlin/Cypher, auth
+ ├─ hugegraph-core engine, schema, traversal, BackendStore interface
+ └─ Backend impls rocksdb (default, embedded) │ hstore (distributed)
+ ▼
+ hugegraph-pd (placement) + hugegraph-store (Raft)
```
-### Distributed Components (Optional)
-
-For production distributed deployments:
-- **hugegraph-pd**: Service discovery, partition management, metadata coordination
-- **hugegraph-store**: Distributed storage with Raft consensus (typically 3+ nodes)
-- **hugegraph-server**: Multiple server instances (typically 3+)
-
-All inter-service communication uses gRPC with Protocol Buffers.
+Top-level modules: `hugegraph-server` · `hugegraph-pd` · `hugegraph-store` ·
+`hugegraph-commons` (shared utils & RPC) · `hugegraph-struct` (data types; dep of PD/Store).
-### Key Architectural Patterns
+Server submodules worth knowing: `hugegraph-core`, `hugegraph-api`,
+`hugegraph-rocksdb`, `hugegraph-hstore`, `hugegraph-test`, `hugegraph-dist`.
-1. **Pluggable Backend Architecture**: Storage backends implement the `BackendStore` interface, allowing new backends without modifying core code
-2. **TinkerPop Compliance**: Full Apache TinkerPop 3 implementation with custom optimization strategies
-3. **gRPC Communication**: All distributed components communicate via gRPC (proto definitions in `*/grpc/` directories)
-4. **Multi-Language Queries**: Native Gremlin support + OpenCypher implementation in `hugegraph-api/opencypher`
+## Code Search Anchors
-## Build & Development Commands
+| Area | Path |
+|---|---|
+| Graph engine | `hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/` |
+| REST APIs | `hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/` |
+| Backend interface | `hugegraph-server/hugegraph-core/.../backend/store/BackendStore.java` |
+| Auth | `hugegraph-server/hugegraph-api/.../api/auth/` |
+| gRPC protos | `hugegraph-{pd,store}/hg-{pd,store}-grpc/src/main/proto/` |
-### Prerequisites Check
-```bash
-# Verify Java version (11+ required)
-java -version
+Config roots (under each dist module's `src/assembly/static/conf/`):
+- Server — `hugegraph.properties`, `rest-server.properties`, `gremlin-server.yaml`
+- PD / Store — `application.yml`
-# Verify Maven version (3.5+ required)
-mvn -version
-```
+## Build
-### Full Build
```bash
-# Clean build with all modules
+# All modules
mvn clean install -DskipTests
-# Build with tests
-mvn clean install
-
-# Build specific module (e.g., server only)
+# Single module
mvn clean install -pl hugegraph-server -am -DskipTests
```
-### Testing
+Distributed build order (for HStore-enabled dev):
-#### Server Module Tests
```bash
-# Unit tests (memory backend)
-mvn test -pl hugegraph-server/hugegraph-test -am -P unit-test
-
-# Core tests with specific backend
-mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,memory
-mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,rocksdb
-mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,hbase
-
-# API tests with backend
-mvn test -pl hugegraph-server/hugegraph-test -am -P api-test,rocksdb
-
-# TinkerPop compliance tests (for release branches)
-mvn test -pl hugegraph-server/hugegraph-test -am -P tinkerpop-structure-test,memory
-mvn test -pl hugegraph-server/hugegraph-test -am -P tinkerpop-process-test,memory
+mvn install -pl hugegraph-struct -am -DskipTests # 1. shared data types
+mvn clean package -pl hugegraph-pd -am -DskipTests # 2. placement driver
+mvn clean package -pl hugegraph-store -am -DskipTests # 3. distributed storage
+mvn clean package -pl hugegraph-server -am -DskipTests # 4. server
```
-#### PD & Store Module Tests
-```bash
-# Build and test hugegraph-struct first (dependency)
-mvn install -pl hugegraph-struct -am -DskipTests
-
-# Test PD module
-mvn test -pl hugegraph-pd/hg-pd-test -am
+Runtime scripts (human-run) live in `hugegraph-server/hugegraph-dist/src/assembly/static/bin/`:
+`init-store.sh`, `start-hugegraph.sh`, `stop-hugegraph.sh`.
-# Test Store module
-mvn test -pl hugegraph-store/hg-store-test -am
-```
+## Testing
-### Code Quality & Validation
+Server tests implicitly prefix `mvn test -pl hugegraph-server/hugegraph-test -am`:
-```bash
-# License header check (Apache RAT)
-mvn apache-rat:check
+| Profile | Suffix |
+|---|---|
+| Unit | `-P unit-test` |
+| Core | `-P core-test,rocksdb` (swap `rocksdb` for `memory`) |
+| API | `-P api-test,rocksdb` |
+| TinkerPop structure / process | `-P tinkerpop-{structure,process}-test,memory` |
+| Single class | `-P core-test,rocksdb -Dtest=YourTestClass` |
-# Code style check (EditorConfig)
-mvn editorconfig:check
-
-# Compile with warnings
-mvn clean compile -Dmaven.javadoc.skip=true
-```
-
-### Running the Server
-
-Scripts are located in `hugegraph-server/hugegraph-dist/src/assembly/static/bin/`:
+PD / Store tests (need `hugegraph-struct` installed first):
```bash
-# Initialize storage backend
-bin/init-store.sh
-
-# Start server
-bin/start-hugegraph.sh
-
-# Stop server
-bin/stop-hugegraph.sh
-
-# Gremlin console
-bin/gremlin-console.sh
-
-# Enable authentication
-bin/enable-auth.sh
-```
-
-### Creating Distribution Package
-
-```bash
-# Build distribution tarball (auto-enabled by default)
-mvn clean package -DskipTests
-
-# Skip assembly creation (if needed)
-mvn clean package -DskipTests -Dskip-assembly-hugegraph
-
-# Output: install-dist/target/hugegraph-.tar.gz
-```
-
-## Important File Locations
-
-### Configuration Files
-- Server configs: `hugegraph-server/hugegraph-dist/src/assembly/static/conf/`
- - `hugegraph.properties` - Main server configuration
- - `rest-server.properties` - REST API settings
- - `gremlin-server.yaml` - Gremlin server configuration
-- PD configs: `hugegraph-pd/hg-pd-dist/src/assembly/static/conf/`
-- Store configs: `hugegraph-store/hg-store-dist/src/assembly/static/conf/`
-
-### Proto Definitions (gRPC)
-- PD protos: `hugegraph-pd/hg-pd-grpc/src/main/proto/`
-- Store protos: `hugegraph-store/hg-store-grpc/src/main/proto/`
-
-### Core Implementation Paths
-- Graph engine: `hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/`
-- REST APIs: `hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/`
-- Backend implementations: `hugegraph-server/hugegraph-{backend}/` (e.g., `hugegraph-rocksdb`)
-
-## Development Workflow
-
-### Code Style
-Import the code style configuration from `hugegraph-style.xml` in your IDE (IntelliJ IDEA recommended).
-
-### Adding Dependencies
-
-When adding third-party dependencies:
-1. Add license files to `install-dist/release-docs/licenses/`
-2. Declare dependency in `install-dist/release-docs/LICENSE`
-3. Append NOTICE info to `install-dist/release-docs/NOTICE` (if upstream has NOTICE)
-4. Update `install-dist/scripts/dependency/known-dependencies.txt` (run `regenerate_known_dependencies.sh`)
-
-### Backend Development
-
-When working on storage backends:
-- All backends extend `hugegraph-server/hugegraph-core` abstractions
-- Implement the `BackendStore` interface
-- Each backend is a separate Maven module in `hugegraph-server/`
-- Backend selection is configured in `hugegraph.properties` via the `backend` property
-
-### gRPC Protocol Changes
-
-When modifying `.proto` files:
-- Generated Java code goes to `*/grpc/` packages (excluded from Apache RAT checks)
-- Run `mvn clean compile` to regenerate gRPC stubs
-- Generated files are in `target/generated-sources/protobuf/`
-
-### Authentication System
-
-Authentication is optional and disabled by default:
-- Enable via `bin/enable-auth.sh` or configuration
-- Auth implementation: `hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/`
-- Multi-level: Users, Groups, Projects, Targets, Access control
-- Required for production deployments
-
-## Common Workflows
-
-### Running a Single Test Class
-```bash
-# Use Maven's -Dtest parameter
-mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,memory -Dtest=YourTestClass
+mvn install -pl hugegraph-struct -am -DskipTests
+mvn test -pl hugegraph-pd/hg-pd-test -am
+mvn test -pl hugegraph-store/hg-store-test -am
```
-### Working with Distributed Components
-
-The distributed architecture (PD + Store) is in BETA. For distributed development:
-1. Build struct module first: `mvn install -pl hugegraph-struct -am -DskipTests`
-2. Build PD: `mvn clean package -pl hugegraph-pd -am -DskipTests`
-3. Build Store: `mvn clean package -pl hugegraph-store -am -DskipTests`
-4. Build Server with HStore backend: `mvn clean package -pl hugegraph-server -am -DskipTests`
-
-See Docker Compose example: `hugegraph-server/hugegraph-dist/docker/example/`
-
-### Debugging Tips
+Before writing new tests, check existing suites under `hugegraph-server/hugegraph-test/`.
-- Enable detailed logging in `hugegraph-server/hugegraph-dist/src/assembly/static/conf/log4j2.xml`
-- Use `bin/dump-conf.sh` to view effective configuration
-- Arthas diagnostics tool is included (version 3.7.1)
-- Monitor with `bin/monitor-hugegraph.sh`
+## Style & Pre-commit
-## CI/CD Profiles
+- Line 100, 4-space indent, LF, UTF-8, **no star imports**
+- Commit format: `feat|fix|refactor(module): msg`
+- Run before pushing:
+ ```bash
+ mvn editorconfig:format # enforce code style
+ mvn clean compile -Dmaven.javadoc.skip=true # surface warnings
+ ```
-The project uses multiple GitHub Actions workflows:
-- `server-ci.yml`: Server module tests (memory, rocksdb, hbase backends)
-- `pd-store-ci.yml`: PD and Store module tests
-- `commons-ci.yml`: Commons module tests
-- `cluster-test-ci.yml`: Distributed cluster integration tests
-- `licence-checker.yml`: Apache RAT license validation
+## Cross-module notes
-## Special Notes
+- `.proto` edits: `mvn clean compile` regenerates gRPC stubs under
+ `target/generated-sources/protobuf/` (output packages `*/grpc/` are excluded from Apache RAT).
+- Adding a third-party dep: update `install-dist/release-docs/{LICENSE,NOTICE,licenses/}`
+ and `install-dist/scripts/dependency/known-dependencies.txt`.
+- `hugegraph-commons` is shared by every module; `hugegraph-struct` must precede PD/Store;
+ server backends depend on `hugegraph-core`.
-### Cross-Module Dependencies
-- `hugegraph-commons` is a shared dependency for all modules
-- `hugegraph-struct` must be built before PD and Store
-- Server backends depend on `hugegraph-core`
+## Additional context files
-### Version Management
-- Version is managed via `${revision}` property (currently `1.7.0`)
-- Flatten Maven plugin used for CI-friendly versioning
+`.serena/memories/` — notably `suggested_commands.md` and `task_completion_checklist.md`
+when a task needs depth beyond this file.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1ee0499bb7..7056afd978 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,13 +19,13 @@ Before submitting the code, we need to do some preparation:
1. Sign up or login to GitHub: [https://github.com](https://github.com)
-2. Fork HugeGraph repo from GitHub: [https://github.com/apache/incubator-hugegraph/fork](https://github.com/apache/incubator-hugegraph/fork)
+2. Fork HugeGraph repo from GitHub: [https://github.com/apache/hugegraph/fork](https://github.com/apache/hugegraph/fork)
-3. Clone code from fork repo to local: [https://github.com/${GITHUB_USER_NAME}/incubator-hugegraph](https://github.com/${GITHUB_USER_NAME}/incubator-hugegraph)
+3. Clone code from fork repo to local: [https://github.com/${GITHUB_USER_NAME}/hugegraph](https://github.com/${GITHUB_USER_NAME}/hugegraph)
```shell
# clone code from remote to local repo
- git clone https://github.com/${GITHUB_USER_NAME}/incubator-hugegraph.git hugegraph
+ git clone https://github.com/${GITHUB_USER_NAME}/hugegraph.git hugegraph
```
4. Configure local HugeGraph repo
@@ -34,7 +34,7 @@ Before submitting the code, we need to do some preparation:
cd hugegraph
# add upstream to synchronize the latest code
- git remote add hugegraph https://github.com/apache/incubator-hugegraph
+ git remote add hugegraph https://github.com/apache/hugegraph
# set name and email to push code to github
git config user.name "{full-name}" # like "Jermy Li"
@@ -43,7 +43,7 @@ Before submitting the code, we need to do some preparation:
## 2. Create an Issue on GitHub
-If you encounter bugs or have any questions, please go to [GitHub Issues](https://github.com/apache/incubator-hugegraph/issues) to report them and feel free to [create an issue](https://github.com/apache/incubator-hugegraph/issues/new).
+If you encounter bugs or have any questions, please go to [GitHub Issues](https://github.com/apache/hugegraph/issues) to report them and feel free to [create an issue](https://github.com/apache/hugegraph/issues/new).
## 3. Make changes of code locally
@@ -71,14 +71,14 @@ vim hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeFacto
# run test locally (optional)
mvn test -Pcore-test,memory
```
-Note: To be consistent with the code style easily, if you use [IDEA](https://www.jetbrains.com/idea/) as your IDE, you can directly [import](https://www.jetbrains.com/help/idea/configuring-code-style.html) our code style [configuration file](./hugegraph-style.xml).
+Note: Code style is defined by the `.editorconfig` file at the repository root. Checkstyle rules are defined in `style/checkstyle.xml`. Configure your IDE accordingly.
##### 3.2.1 Check licenses
If we want to add new third-party dependencies to the `HugeGraph` project, we need to do the following things:
-1. Find the third-party dependent repository, put the dependent `license` file into [./hugegraph-dist/release-docs/licenses/](https://github.com/apache/incubator-hugegraph/tree/master/hugegraph-dist/release-docs/licenses) path.
-2. Declare the dependency in [./install-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/install-dist/release-docs/LICENSE) `LICENSE` information.
-3. Find the NOTICE file in the repository and append it to [./install-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/install-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file).
-4. Execute locally [./install-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/install-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/install-dist/scripts/dependency/known-dependencies.txt) (or manually update).
+1. Find the third-party dependent repository, put the dependent `license` file into [./install-dist/release-docs/licenses/](https://github.com/apache/hugegraph/tree/master/install-dist/release-docs/licenses) path.
+2. Declare the dependency in [./install-dist/release-docs/LICENSE](https://github.com/apache/hugegraph/blob/master/install-dist/release-docs/LICENSE) `LICENSE` information.
+3. Find the NOTICE file in the repository and append it to [./install-dist/release-docs/NOTICE](https://github.com/apache/hugegraph/blob/master/install-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file).
+4. Execute locally [./install-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/hugegraph/blob/master/install-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/hugegraph/blob/master/install-dist/scripts/dependency/known-dependencies.txt) (or manually update).
**Example**: A new third-party dependency is introduced into the project -> `ant-1.9.1.jar`
- The project source code is located at: https://github.com/apache/ant/tree/rel/1.9.1
diff --git a/DISCLAIMER b/DISCLAIMER
deleted file mode 100644
index be718eef3b..0000000000
--- a/DISCLAIMER
+++ /dev/null
@@ -1,7 +0,0 @@
-Apache HugeGraph (incubating) is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator PMC.
-
-Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications,
-and decision making process have stabilized in a manner consistent with other successful ASF projects.
-
-While incubation status is not necessarily a reflection of the completeness or stability of the code,
-it does indicate that the project has yet to be fully endorsed by the ASF.
diff --git a/NOTICE b/NOTICE
index aa6764af84..8e48b813b8 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
-Apache HugeGraph(incubating)
-Copyright 2022-2025 The Apache Software Foundation
+Apache HugeGraph
+Copyright 2022-2026 The Apache Software Foundation
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index 45414a832c..f24f6f7bfd 100644
--- a/README.md
+++ b/README.md
@@ -7,13 +7,19 @@
[](https://www.apache.org/licenses/LICENSE-2.0.html)
-[](https://github.com/apache/incubator-hugegraph/actions/workflows/ci.yml)
-[](https://github.com/apache/incubator-hugegraph/actions/workflows/licence-checker.yml)
+[](https://github.com/apache/hugegraph/actions/workflows/server-ci.yml)
+[](https://github.com/apache/hugegraph/actions/workflows/pd-store-ci.yml)
[](https://github.com/apache/hugegraph/releases)
[](https://deepwiki.com/apache/hugegraph)
+---
+
+**Quick Navigation:** [Architecture](#architecture) • [Quick Start](#quick-start) • [Module Map](#module-map) • [Ecosystem](#ecosystem) • [For Contributors](#for-contributors) • [Community](#community)
+
+---
+
## What is Apache HugeGraph?
[HugeGraph](https://hugegraph.apache.org/) is a fast and highly-scalable [graph database](https://en.wikipedia.org/wiki/Graph_database).
@@ -23,79 +29,375 @@ achieved through the powerful [Gremlin](https://tinkerpop.apache.org/gremlin.htm
## Features
-- Compliant to [Apache TinkerPop 3](https://tinkerpop.apache.org/), supports [Gremlin](https://tinkerpop.apache.org/gremlin.html) & [Cypher](https://en.wikipedia.org/wiki/Cypher) language
-- Schema Metadata Management, including VertexLabel, EdgeLabel, PropertyKey and IndexLabel
-- Multi-type Indexes, supporting exact query, range query and complex conditions combination query
-- Plug-in Backend Store Framework, mainly support `RocksDB`/`HStore` + `HBase` for now and you could choose other backends in the [legacy version](https://hugegraph.apache.org/docs/download/download/) ≤ `1.5.0` (like `MySQL/PG`/`Cassandra` ...)
-- Integration with `Flink/Spark/HDFS`, and friendly to connect other big data platforms
-- Complete graph ecosystem (including both in/out-memory `Graph Computing` + `Graph Visualization & Tools` + `Graph Learning & AI`, see [here](#3-build-from-source))
+- **Schema Metadata Management**: VertexLabel, EdgeLabel, PropertyKey, and IndexLabel
+- **Multi-type Indexes**: Exact query, range query, and complex conditions combination query
+- **Plug-in Backend Store Framework**: Mainly supports `RocksDB`/`HStore` + `HBase`; other backends available in [legacy versions](https://hugegraph.apache.org/docs/download/download/) ≤ `1.5.0` (MySQL/PostgreSQL/Cassandra...)
+- **Big Data Integration**: Seamless integration with `Flink`/`Spark`/`HDFS`
+- **Complete Graph Ecosystem**: In/out-memory Graph Computing + Graph Visualization & Tools + Graph Learning & AI
+- **Dual Query Language Support**: [Gremlin](https://tinkerpop.apache.org/gremlin.html) (via [Apache TinkerPop 3](https://tinkerpop.apache.org/)) and [Cypher](https://en.wikipedia.org/wiki/Cypher_(query_language)) (OpenCypher)
+
+## Ecosystem
+
+Complete **HugeGraph** ecosystem components:
+
+1. **[hugegraph-toolchain](https://github.com/apache/hugegraph-toolchain)** - Graph tools suite
+ - [Loader](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-loader) - Data import tool
+ - [Dashboard](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-hubble) - Web visualization platform
+ - [Tool](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-tools) - Command-line utilities
+ - [Client](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-client) - Java/Python client SDK
+
+2. **[hugegraph-computer](https://github.com/apache/hugegraph-computer)** - Integrated **graph computing** system
+
+3. **[hugegraph-ai](https://github.com/apache/hugegraph-ai)** - **Graph AI/LLM/Knowledge Graph** integration
+
+4. **[hugegraph-website](https://github.com/apache/hugegraph-doc)** - **Documentation & website** repository
+
+## Architecture
+
+HugeGraph supports both **standalone** and **distributed** deployments:
+
+```
+ ┌─────────────────────────────────────────────────────┐
+ │ Client Layer │
+ │ Gremlin Console │ REST API │ Cypher │ SDK/Tools │
+ └─────────────────────────┬───────────────────────────┘
+ │
+ ┌─────────────────────────▼───────────────────────────┐
+ │ HugeGraph Server (:8080) │
+ │ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
+ │ │ REST API │ │ Gremlin │ │ Cypher Engine │ │
+ │ │(Jersey 3)│ │ (TP 3.5) │ │ (OpenCypher) │ │
+ │ └────┬─────┘ └────┬─────┘ └────────┬─────────┘ │
+ │ └─────────────┼─────────────────┘ │
+ │ ┌────────▼────────┐ │
+ │ │ Graph Engine │ │
+ │ │(hugegraph-core) │ │
+ │ └────────┬────────┘ │
+ └─────────────────────┼───────────────────────────────┘
+ │
+ ┌────────────────────────────────┼────────────────────────────────┐
+ │ │ │
+┌────────────▼────────────┐ ┌───────────────▼───────────────┐ ┌───────────▼──────────┐
+│ Standalone Mode │ │ Distributed Mode │ │ Legacy Backends │
+│ ┌───────────────────┐ │ │ ┌─────────────────────────┐ │ │ (≤v1.5) │
+│ │ RocksDB │ │ │ │ HugeGraph-PD │ │ │ MySQL │ PostgreSQL │
+│ │ (embedded) │ │ │ │ (Raft, 3-5 nodes) │ │ │ Cassandra │
+│ └───────────────────┘ │ │ │ :8620/:8686 │ │ │ HBase (≤v1.7) │
+│ │ │ └────────────┬────────────┘ │ └──────────────────────┘
+│ Use Case: │ │ │ │
+│ Development/Testing │ │ ┌────────────▼────────────┐ │
+│ Single Node │ │ │ HugeGraph-Store │ │
+│ │ │ │ (Raft + RocksDB) │ │
+│ Data Scale: < 1TB │ │ │ (3+ nodes) :8520 │ │
+└─────────────────────────┘ │ └─────────────────────────┘ │
+ │ │
+ │ Use Case: │
+ │ Production/HA/Cluster │
+ │ │
+ │ Data Scale: < 1000 TB │
+ └───────────────────────────────┘
+```
+
+### Deployment Mode Comparison
+
+| Mode | Components | Use Case | Data Scale | High Availability |
+|------|------------|----------|------------|-------------------|
+| **Standalone** | Server + RocksDB | Development, Testing, Single Node | < 1TB | Basic |
+| **Distributed** | Server + PD (3-5 nodes) + Store (3+ nodes) | Production, HA, Horizontal Scaling | < 1000 TB | Yes |
+
+### Module Overview
+
+| Module | Description |
+|--------|-------------|
+| [hugegraph-server](hugegraph-server) | Core graph engine with REST API, Gremlin/Cypher support, and pluggable backends (RocksDB default) |
+| [hugegraph-pd](hugegraph-pd/README.md) | Placement Driver for distributed mode - handles meta storage, partition management and cluster scheduling |
+| [hugegraph-store](hugegraph-store/README.md) | Distributed storage with Raft consensus for high availability and horizontal scaling |
+| [hugegraph-commons](hugegraph-commons) | Shared utilities, RPC framework and common components |
+
+
+📊 Click to view detailed architecture diagram (Mermaid)
+
+```mermaid
+flowchart TB
+ subgraph Clients["Client Layer"]
+ GC[Gremlin Console]
+ REST[REST Client]
+ CYPHER[Cypher Client]
+ SDK[SDK/Tools]
+ end
+
+ subgraph Server["HugeGraph Server :8080"]
+ API[REST API Jersey 3]
+ GS[Gremlin Server TinkerPop 3.5]
+ CS[Cypher Engine OpenCypher]
+ CORE[Graph Engine hugegraph-core]
+
+ API --> CORE
+ GS --> CORE
+ CS --> CORE
+ end
+
+ subgraph Storage["Storage Layer"]
+ subgraph Standalone["Standalone Mode"]
+ ROCKS[(RocksDB Embedded)]
+ end
+
+ subgraph Distributed["Distributed Mode"]
+ PD[HugeGraph-PD Raft Cluster :8620/:8686]
+ STORE[HugeGraph-Store Raft + RocksDB :8520]
+ PD <--> STORE
+ end
+
+ subgraph Legacy["Legacy Backends (≤v1.5)"]
+ MYSQL[(MySQL)]
+ PG[(PostgreSQL)]
+ CASS[(Cassandra)]
+ HBASE[(HBase, ≤v1.7)]
+ end
+ end
+
+ Clients --> Server
+ CORE --> ROCKS
+ CORE --> PD
+ CORE -.-> Legacy
+
+ style Server fill:#e1f5ff
+ style Distributed fill:#fff4e1
+ style Standalone fill:#f0f0f0
+```
+
+
## Quick Start
-### 1. Docker (For Test)
+### 5 Minutes Quick Start
+
+```bash
+# Start HugeGraph (standalone mode)
+docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph:1.7.0
-Use Docker to quickly start a HugeGraph server with `RocksDB` (in the background) for **testing or development**:
+# Verify server is running
+curl http://localhost:8080/versions
+# Try a Gremlin query
+curl -X POST http://localhost:8080/gremlin \
+ -H "Content-Type: application/json" \
+ -d '{"gremlin":"g.V().limit(5)"}'
```
-# (Optional)
-# - add "-e PRELOAD=true" to auto-load a sample graph
-docker run -itd --name=graph -e PASSWORD=xxx -p 8080:8080 hugegraph/hugegraph:1.5.0
+
+> **Production Note**: For production environments or public network exposure, you **must** enable the [AuthSystem](https://hugegraph.apache.org/docs/config/config-authentication/) for security.
+
+### Prerequisites
+
+- **Java 11+** (required)
+- **Maven 3.5+** (for building from source)
+
+### Option 1: Docker (Fastest)
+
+Docker is the quickest way to get started for **testing or development**:
+
+```bash
+# Basic usage
+docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph:1.7.0
+
+# With sample graph preloaded
+docker run -itd --name=hugegraph -e PRELOAD=true -p 8080:8080 hugegraph/hugegraph:1.7.0
+
+# With authentication enabled
+docker run -itd --name=hugegraph -e PASSWORD=your_password -p 8080:8080 hugegraph/hugegraph:1.7.0
```
-Please visit [doc page](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#3-deploy) or
-the [README](hugegraph-server/hugegraph-dist/docker/README.md) for more details. ([Docker Compose](./hugegraph-server/hugegraph-dist/docker/example))
+For advanced Docker configurations, see:
-> Note:
-> 1. The Docker image of HugeGraph is a convenience release, but not **official distribution** artifacts. You can find more details from [ASF Release Distribution Policy](https://infra.apache.org/release-distribution.html#dockerhub).
-> 2. Recommend to use `release tag` (like `1.5.0`/`1.x.0`) for the stable version. Use `latest` tag to experience the newest functions in development.
+* [Docker Documentation](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#3-deploy)
+* [Docker Compose Examples](./docker/)
+* [Docker README](./docker/README.md)
+* [Server Docker README](hugegraph-server/hugegraph-dist/docker/README.md)
-### 2. Download
+> **Docker Desktop (Mac/Windows)**: The 3-node distributed cluster (`docker/docker-compose-3pd-3store-3server.yml`) uses Docker bridge networking and works on all platforms including Docker Desktop. Allocate at least 12 GB memory to Docker Desktop.
-Visit [Download Page](https://hugegraph.apache.org/docs/download/download/) and refer the [doc](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#32-download-the-binary-tar-tarball)
-to download the latest release package and start the server.
+> **Note**: Docker images are convenience releases, not **official ASF distribution artifacts**. See [ASF Release Distribution Policy](https://infra.apache.org/release-distribution.html#dockerhub) for details.
+>
+> **Version Tags**: Use release tags (e.g., `1.7.0`) for stable deployments. The `latest` tag should only be used for testing or development.
-**Note:** if you want to use it in the production environment or expose it to the public network, must enable the [AuthSystem](https://hugegraph.apache.org/docs/config/config-authentication/) to ensure safe.
-### 3. Build From Source
+
+Option 2: Download Binary Package
-Visit [Build From Source Page](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#33-source-code-compilation) and follow the
-steps to build the source code and start the server.
+Download pre-built packages from the [Download Page](https://hugegraph.apache.org/docs/download/download/):
-The project [doc page](https://hugegraph.apache.org/docs/) contains more information on HugeGraph
-and provides detailed documentation for users. (Structure / Usage / API / Configs...)
+```bash
+# Download and extract
+# For historical 1.7.0 and earlier releases, use the archive URL and
+# set PACKAGE=apache-hugegraph-incubating-{version} instead.
+BASE_URL="https://downloads.apache.org/hugegraph/{version}"
+PACKAGE="apache-hugegraph-{version}"
+# Historical alternative:
+# BASE_URL="https://archive.apache.org/dist/incubator/hugegraph/{version}"
+# PACKAGE="apache-hugegraph-incubating-{version}"
-And here are links of other **HugeGraph** component/repositories:
+wget ${BASE_URL}/${PACKAGE}.tar.gz
+tar -xzf ${PACKAGE}.tar.gz
+cd ${PACKAGE}
-1. [hugegraph-toolchain](https://github.com/apache/hugegraph-toolchain) (graph tools **[loader](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-loader)/[dashboard](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-hubble)/[tool](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-tools)/[client](https://github.com/apache/hugegraph-toolchain/tree/master/hugegraph-client)**)
-2. [hugegraph-computer](https://github.com/apache/hugegraph-computer) (integrated **graph computing** system)
-3. [hugegraph-ai](https://github.com/apache/incubator-hugegraph-ai) (integrated **Graph AI/LLM/KG** system)
-4. [hugegraph-website](https://github.com/apache/hugegraph-doc) (**doc & website** code)
+# Initialize backend storage
+bin/init-store.sh
-## License
+# Start server
+bin/start-hugegraph.sh
-HugeGraph is licensed under [Apache 2.0 License](LICENSE).
+# Check server status
+bin/monitor-hugegraph.sh
+```
+
+For detailed instructions, see the [Binary Installation Guide](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#32-download-the-binary-tar-tarball).
+
+
+
+
+Option 3: Build from Source
+
+Build from source for development or customization:
+
+```bash
+# Clone repository
+git clone https://github.com/apache/hugegraph.git
+cd hugegraph
+
+# Build all modules (skip tests for faster build)
+mvn clean package -DskipTests
+
+# Extract built package
+tar -xzf target/apache-hugegraph-{version}.tar.gz
+cd apache-hugegraph-{version}/apache-hugegraph-server-{version}
+
+# Initialize and start
+bin/init-store.sh
+bin/start-hugegraph.sh
+```
+
+For detailed build instructions, see [BUILDING.md](BUILDING.md) and [Build from Source Guide](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#33-source-code-compilation).
+
+
+
+
+Verify Installation
+
+Once the server is running, verify the installation:
+
+```bash
+# Check server version
+curl http://localhost:8080/versions
+
+# Expected output:
+# {
+# "versions": {
+# "version": "v1",
+# "core": "1.7.0",
+# "gremlin": "3.5.1",
+# "api": "1.7.0"
+# }
+# }
+
+# Try Gremlin console (if installed locally)
+bin/gremlin-console.sh
+
+# In Gremlin console:
+gremlin> :remote connect tinkerpop.server conf/remote.yaml
+gremlin> :> g.V().limit(5)
+```
+
+For comprehensive documentation, visit the [HugeGraph Documentation](https://hugegraph.apache.org/docs/).
+
+
+
+## Module Map
+
+**Developer Navigation**: Find the right module for your task
+
+| I want to... | Module | Key Path |
+|--------------|--------|----------|
+| Understand graph operations | `hugegraph-core` | `StandardHugeGraph.java` |
+| Modify REST APIs | `hugegraph-api` | `src/.../api/` |
+| Add storage backend | `hugegraph-core` | `BackendStore.java` |
+| Develop Gremlin features | `hugegraph-core` | `src/.../traversal/` |
+| Develop Cypher features | `hugegraph-api` | `src/.../opencypher/` |
+| Work on distributed coordination | `hugegraph-pd` | `hg-pd-core/` |
+| Work on distributed storage | `hugegraph-store` | `hg-store-core/` |
+| Add backend implementations | `hugegraph-server/hugegraph-{backend}` | `hugegraph-rocksdb/`, `hugegraph-hstore/` |
+| Understand configuration | `hugegraph-dist` | `src/assembly/static/conf/` |
+| Run tests | `hugegraph-test` | Test suites with multiple profiles |
+
+For detailed architecture and development guidance, see [AGENTS.md](AGENTS.md).
+
+
+For Contributors
+
+**New to HugeGraph?** Follow this path to get started:
+
+1. **Understand the Architecture**
+ - Read [AGENTS.md](AGENTS.md) for detailed module structure and development patterns
+ - Review the [Architecture Diagram](#architecture) above
+
+2. **Set Up Your Environment**
+ - Install Java 11+ and Maven 3.5+
+ - Follow [BUILDING.md](BUILDING.md) for build instructions
+ - Configure your IDE to use `.editorconfig` for code style and `style/checkstyle.xml` for Checkstyle rules
+
+3. **Find Your First Issue**
+ - Browse [Good First Issues](https://github.com/apache/hugegraph/issues?q=label%3A%22good+first+issue%22)
+ - Check [Help Wanted Issues](https://github.com/apache/hugegraph/issues?q=label%3A%22help+wanted%22)
+
+4. **Learn the Codebase**
+ - Use the [Module Map](#module-map) to navigate
+ - Try [DeepWiki](https://deepwiki.com/apache/hugegraph) for AI-powered codebase understanding
+ - Run tests to understand behavior: `mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,memory`
+ - Try modifying a test and see what breaks
+
+5. **Code Standards**
+ - Line length: 100 characters
+ - Indentation: 4 spaces
+ - No star imports
+ - Commit format: `feat|fix|refactor(module): description`
+
+6. **Submit Your Contribution**
+ - Read [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines
+ - Follow the [Contribution Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/)
+ - Use [GitHub Desktop](https://desktop.github.com/) to simplify the PR process
+
+
## Contributing
-- Welcome to contribute to HugeGraph, please see [`How to Contribute`](CONTRIBUTING.md) & [Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/) for more information.
-- Note: It's recommended to use [GitHub Desktop](https://desktop.github.com/) to greatly simplify the PR and commit process.
-- Thank you to all the people who already contributed to HugeGraph!
+Welcome to contribute to HugeGraph!
-[](https://github.com/apache/incubator-hugegraph/graphs/contributors)
+- **How to Contribute**: See [CONTRIBUTING.md](CONTRIBUTING.md) and [Contribution Guidelines](https://hugegraph.apache.org/docs/contribution-guidelines/)
+- **Code Style**: Configure your IDE to use `.editorconfig` for code style and `style/checkstyle.xml` for Checkstyle rules
+- **PR Tool**: [GitHub Desktop](https://desktop.github.com/) is recommended for simpler workflow
-## Thanks
+Thank you to all the contributors who have helped make HugeGraph better!
+
+[](https://github.com/apache/hugegraph/graphs/contributors)
+
+## License
-HugeGraph relies on the [TinkerPop](http://tinkerpop.apache.org) framework, we refer to the storage structure of Titan and the schema definition of DataStax.
-Thanks to TinkerPop, thanks to Titan, thanks to DataStax. Thanks to all other organizations or authors who contributed to the project.
+HugeGraph is licensed under [Apache 2.0 License](LICENSE).
+
+## Community
-You are welcome to contribute to HugeGraph,
-and we are looking forward to working with you to build an excellent open-source community.
+**Get Help & Stay Connected**
-## Contact Us
+- **[GitHub Issues](https://github.com/apache/hugegraph/issues)**: Report bugs and request features (quick response)
+- **Mailing List**: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscribe here](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/))
+- **Slack**: [ASF HugeGraph Channel](https://the-asf.slack.com/archives/C059UU2FJ23)
+- **WeChat**: Scan the QR code to follow Apache HugeGraph official account
-- [GitHub Issues](https://github.com/apache/hugegraph/issues): Feedback on usage issues and functional requirements (quick response)
-- Feedback Email: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscriber](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) only)
-- WeChat public account: Apache HugeGraph, welcome to scan this QR code to follow us.
+
+
+
+
+## Thanks
-
+HugeGraph relies on the [Apache TinkerPop](http://tinkerpop.apache.org) framework. We are grateful to the TinkerPop community, Titan, and DataStax for their foundational work. Thanks to all contributors and organizations who have helped make HugeGraph possible.
+You are welcome to contribute to HugeGraph, and we look forward to working with you to build an excellent open-source community.
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 0000000000..9bc21b1ba7
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,259 @@
+# HugeGraph Docker Deployment
+
+This directory contains Docker Compose files for running HugeGraph:
+
+| File | Description |
+|------|-------------|
+| `docker-compose.yml` | Single-node cluster using pre-built images from Docker Hub |
+| `docker-compose.dev.yml` | Single-node cluster built from source (for developers) |
+| `docker-compose-3pd-3store-3server.yml` | 3-node distributed cluster (PD + Store + Server) |
+
+## Prerequisites
+
+- **Docker Engine** 20.10+ (or Docker Desktop 4.x+)
+- **Docker Compose** v2 (included in Docker Desktop)
+- **Memory**: Allocate at least **12 GB** to Docker Desktop (Settings → Resources → Memory). The 3-node cluster runs 9 JVM processes (3 PD + 3 Store + 3 Server) which are memory-intensive. Insufficient memory causes OOM kills that appear as silent Raft failures.
+
+> [!IMPORTANT]
+> The 12 GB minimum is for Docker Desktop. On Linux with native Docker, ensure the host has at least 12 GB of free memory.
+---
+
+## Single-Node Setup
+
+Two compose files are available for running a single-node cluster (1 PD + 1 Store + 1 Server):
+
+### Option A: Quick Start (pre-built images)
+
+Uses pre-built images from Docker Hub. Best for **end users** who want to run HugeGraph quickly.
+
+```bash
+cd docker
+HUGEGRAPH_VERSION=1.7.0 docker compose up -d
+```
+
+- Images: `hugegraph/pd:1.7.0`, `hugegraph/store:1.7.0`, `hugegraph/server:1.7.0`
+- `pull_policy: always` — always pulls the specified image tag
+
+> **Note**: Use release tags (e.g., `1.7.0`) for stable deployments. The `latest` tag is intended for testing or development only.
+- PD healthcheck endpoint: `/v1/health`
+- Single PD, single Store (`HG_PD_INITIAL_STORE_LIST: store:8500`), single Server
+- Server healthcheck endpoint: `/versions`
+
+### Option B: Development Build (build from source)
+
+Builds images locally from source Dockerfiles. Best for **developers** who want to test local changes.
+
+```bash
+cd docker
+docker compose -f docker-compose.dev.yml up -d
+```
+
+- Images: built from source via `build: context: ..` with Dockerfiles
+- No `pull_policy` — builds locally, doesn't pull
+- Entrypoint scripts are baked into the built image (no volume mounts)
+- PD healthcheck endpoint: `/v1/health`
+- Otherwise identical env vars and structure to the quickstart file
+
+### Key Differences
+
+| | `docker-compose.yml` (quickstart) | `docker-compose.dev.yml` (dev build) |
+|---|---|---|
+| **Images** | Pull from Docker Hub | Build from source |
+| **Who it's for** | End users | Developers |
+| **pull_policy** | `always` | not set (build) |
+
+**Verify** (both options):
+```bash
+curl http://localhost:8080/versions
+```
+
+---
+
+## 3-Node Cluster Quickstart
+
+```bash
+cd docker
+HUGEGRAPH_VERSION=1.7.0 docker compose -f docker-compose-3pd-3store-3server.yml up -d
+
+# To stop and remove all data volumes (clean restart)
+docker compose -f docker-compose-3pd-3store-3server.yml down -v
+```
+
+**Startup ordering** is enforced via `depends_on` with `condition: service_healthy`:
+
+1. **PD nodes** start first and must pass healthchecks (`/v1/health`)
+2. **Store nodes** start after all PD nodes are healthy
+3. **Server nodes** start after all Store nodes are healthy
+
+This ensures PD and Store are healthy before the server starts. The server entrypoint still performs a best-effort partition wait after launch, so partition assignment may take a little longer.
+
+**Verify the cluster is healthy**:
+
+```bash
+# Check PD health
+curl http://localhost:8620/v1/health
+
+# Check Store health
+curl http://localhost:8520/v1/health
+
+# Check Server (Graph API)
+curl http://localhost:8080/versions
+
+# List registered stores via PD
+curl http://localhost:8620/v1/stores
+
+# List partitions
+curl http://localhost:8620/v1/partitions
+```
+
+---
+
+## Environment Variable Reference
+
+Configuration is injected via environment variables. The old `docker/configs/application-pd*.yml` and `docker/configs/application-store*.yml` files are no longer used.
+
+### PD Environment Variables
+
+| Variable | Required | Default | Maps To (`application.yml`) | Description |
+|----------|----------|---------|-----------------------------|-------------|
+| `HG_PD_GRPC_HOST` | Yes | — | `grpc.host` | This node's hostname/IP for gRPC |
+| `HG_PD_RAFT_ADDRESS` | Yes | — | `raft.address` | This node's Raft address (e.g. `pd0:8610`) |
+| `HG_PD_RAFT_PEERS_LIST` | Yes | — | `raft.peers-list` | All PD peers (e.g. `pd0:8610,pd1:8610,pd2:8610`) |
+| `HG_PD_INITIAL_STORE_LIST` | Yes | — | `pd.initial-store-list` | Expected stores (e.g. `store0:8500,store1:8500,store2:8500`) |
+| `HG_PD_GRPC_PORT` | No | `8686` | `grpc.port` | gRPC server port |
+| `HG_PD_REST_PORT` | No | `8620` | `server.port` | REST API port |
+| `HG_PD_DATA_PATH` | No | `/hugegraph-pd/pd_data` | `pd.data-path` | Metadata storage path |
+| `HG_PD_INITIAL_STORE_COUNT` | No | `1` | `pd.initial-store-count` | Min stores for cluster availability |
+
+**Deprecated aliases** (still work but log a warning):
+
+| Deprecated | Use Instead |
+|------------|-------------|
+| `GRPC_HOST` | `HG_PD_GRPC_HOST` |
+| `RAFT_ADDRESS` | `HG_PD_RAFT_ADDRESS` |
+| `RAFT_PEERS` | `HG_PD_RAFT_PEERS_LIST` |
+| `PD_INITIAL_STORE_LIST` | `HG_PD_INITIAL_STORE_LIST` |
+
+### Store Environment Variables
+
+| Variable | Required | Default | Maps To (`application.yml`) | Description |
+|----------|----------|---------|-----------------------------|-------------|
+| `HG_STORE_PD_ADDRESS` | Yes | — | `pdserver.address` | PD gRPC addresses (e.g. `pd0:8686,pd1:8686,pd2:8686`) |
+| `HG_STORE_GRPC_HOST` | Yes | — | `grpc.host` | This node's hostname (e.g. `store0`) |
+| `HG_STORE_RAFT_ADDRESS` | Yes | — | `raft.address` | This node's Raft address (e.g. `store0:8510`) |
+| `HG_STORE_GRPC_PORT` | No | `8500` | `grpc.port` | gRPC server port |
+| `HG_STORE_REST_PORT` | No | `8520` | `server.port` | REST API port |
+| `HG_STORE_DATA_PATH` | No | `/hugegraph-store/storage` | `app.data-path` | Data storage path |
+
+**Deprecated aliases** (still work but log a warning):
+
+| Deprecated | Use Instead |
+|------------|-------------|
+| `PD_ADDRESS` | `HG_STORE_PD_ADDRESS` |
+| `GRPC_HOST` | `HG_STORE_GRPC_HOST` |
+| `RAFT_ADDRESS` | `HG_STORE_RAFT_ADDRESS` |
+
+### Server Environment Variables
+
+| Variable | Required | Default | Maps To | Description |
+|----------|----------|---------|-----------------------------|-------------|
+| `HG_SERVER_BACKEND` | Yes | — | `backend` in `hugegraph.properties` | Storage backend (e.g. `hstore`) |
+| `HG_SERVER_PD_PEERS` | Yes | — | `pd.peers` | PD cluster addresses (e.g. `pd0:8686,pd1:8686,pd2:8686`) |
+| `STORE_REST` | No | — | Used by `wait-partition.sh` | Store REST endpoint for partition verification (e.g. `store0:8520`) |
+| `PASSWORD` | No | — | Enables auth mode | Optional authentication password |
+
+**Deprecated aliases** (still work but log a warning):
+
+| Deprecated | Use Instead |
+|------------|-------------|
+| `BACKEND` | `HG_SERVER_BACKEND` |
+| `PD_PEERS` | `HG_SERVER_PD_PEERS` |
+
+---
+
+## Port Reference
+
+The table below reflects the published host ports in `docker-compose-3pd-3store-3server.yml`.
+The single-node compose file (`docker-compose.yml`) only publishes the REST/API ports (`8620`, `8520`, `8080`) by default.
+
+| Service | Container Port | Host Port | Protocol | Purpose |
+|---------|---------------|-----------|----------|---------|
+| pd0 | 8620 | 8620 | HTTP | REST API |
+| pd0 | 8686 | 8686 | gRPC | PD gRPC |
+| pd0 | 8610 | — | TCP | Raft (internal only) |
+| pd1 | 8620 | 8621 | HTTP | REST API |
+| pd1 | 8686 | 8687 | gRPC | PD gRPC |
+| pd2 | 8620 | 8622 | HTTP | REST API |
+| pd2 | 8686 | 8688 | gRPC | PD gRPC |
+| store0 | 8500 | 8500 | gRPC | Store gRPC |
+| store0 | 8510 | 8510 | TCP | Raft |
+| store0 | 8520 | 8520 | HTTP | REST API |
+| store1 | 8500 | 8501 | gRPC | Store gRPC |
+| store1 | 8510 | 8511 | TCP | Raft |
+| store1 | 8520 | 8521 | HTTP | REST API |
+| store2 | 8500 | 8502 | gRPC | Store gRPC |
+| store2 | 8510 | 8512 | TCP | Raft |
+| store2 | 8520 | 8522 | HTTP | REST API |
+| server0 | 8080 | 8080 | HTTP | Graph API |
+| server1 | 8080 | 8081 | HTTP | Graph API |
+| server2 | 8080 | 8082 | HTTP | Graph API |
+
+---
+
+## Healthcheck Endpoints
+
+| Service | Endpoint | Expected |
+|---------|----------|----------|
+| PD | `GET /v1/health` | `200 OK` |
+| Store | `GET /v1/health` | `200 OK` |
+| Server | `GET /versions` | `200 OK` with version JSON |
+
+---
+
+## Troubleshooting
+
+### Containers Exiting or Restarting (OOM Kills)
+
+**Symptom**: Containers exit with code 137, or restart loops. Raft logs show election timeouts.
+
+**Cause**: Docker Desktop does not have enough memory. The 9 JVM processes require at least 12 GB.
+
+**Fix**: Docker Desktop → Settings → Resources → Memory → set to **12 GB** or higher. Restart Docker Desktop.
+
+```bash
+# Check if containers were OOM killed
+docker inspect hg-pd0 | grep -i oom
+docker stats --no-stream
+```
+
+### Raft Leader Election Failure
+
+**Symptom**: PD logs show repeated `Leader election timeout`. Store nodes cannot register.
+
+**Cause**: PD nodes cannot reach each other on the Raft port (8610), or `HG_PD_RAFT_PEERS_LIST` is misconfigured.
+
+**Fix**:
+1. Verify all PD containers are running: `docker compose -f docker-compose-3pd-3store-3server.yml ps`
+2. Check PD logs: `docker logs hg-pd0`
+3. Verify network connectivity: `docker exec hg-pd0 ping pd1`
+4. Ensure `HG_PD_RAFT_PEERS_LIST` is identical on all PD nodes
+
+### Partition Assignment Not Completing
+
+**Symptom**: Server starts but graph operations fail. Store logs show `partition not found`.
+
+**Cause**: PD has not finished assigning partitions to stores, or stores did not register successfully.
+
+**Fix**:
+1. Check registered stores: `curl http://localhost:8620/v1/stores`
+2. Check partition status: `curl http://localhost:8620/v1/partitions`
+3. Wait for partition assignment (can take 1–3 minutes after all stores register)
+4. Check server logs for the `wait-partition.sh` script output: `docker logs hg-server0`
+
+### Connection Refused Errors
+
+**Symptom**: Stores cannot connect to PD, or Server cannot connect to Store.
+
+**Cause**: Services are using `127.0.0.1` instead of container hostnames, or the `hg-net` bridge network is misconfigured.
+
+**Fix**: Ensure all `HG_*` env vars use container hostnames (`pd0`, `store0`, etc.), not `127.0.0.1` or `localhost`.
diff --git a/docker/configs/application-pd0.yml b/docker/configs/application-pd0.yml
deleted file mode 100644
index 6531cbafb2..0000000000
--- a/docker/configs/application-pd0.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-spring:
- application:
- name: hugegraph-pd
-
-management:
- metrics:
- export:
- prometheus:
- enabled: true
- endpoints:
- web:
- exposure:
- include: "*"
-
-logging:
- config: 'file:./conf/log4j2.xml'
-license:
- verify-path: ./conf/verify-license.json
- license-path: ./conf/hugegraph.license
-grpc:
- port: 8686
- host: 127.0.0.1
-
-server:
- port: 8620
-
-pd:
- data-path: ./pd_data
- patrol-interval: 1800
- initial-store-count: 3
- initial-store-list: 127.0.0.1:8500,127.0.0.1:8501,127.0.0.1:8502
-
-raft:
- address: 127.0.0.1:8610
- peers-list: 127.0.0.1:8610,127.0.0.1:8611,127.0.0.1:8612
-
-store:
- max-down-time: 172800
- monitor_data_enabled: true
- monitor_data_interval: 1 minute
- monitor_data_retention: 1 day
- initial-store-count: 1
-
-partition:
- default-shard-count: 1
- store-max-shard-count: 12
diff --git a/docker/configs/application-pd1.yml b/docker/configs/application-pd1.yml
deleted file mode 100644
index 0cf9f54297..0000000000
--- a/docker/configs/application-pd1.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-spring:
- application:
- name: hugegraph-pd
-
-management:
- metrics:
- export:
- prometheus:
- enabled: true
- endpoints:
- web:
- exposure:
- include: "*"
-
-logging:
- config: 'file:./conf/log4j2.xml'
-license:
- verify-path: ./conf/verify-license.json
- license-path: ./conf/hugegraph.license
-grpc:
- port: 8687
- host: 127.0.0.1
-
-server:
- port: 8621
-
-pd:
- data-path: ./pd_data
- patrol-interval: 1800
- initial-store-count: 3
- initial-store-list: 127.0.0.1:8500,127.0.0.1:8501,127.0.0.1:8502
-
-raft:
- address: 127.0.0.1:8611
- peers-list: 127.0.0.1:8610,127.0.0.1:8611,127.0.0.1:8612
-
-store:
- max-down-time: 172800
- monitor_data_enabled: true
- monitor_data_interval: 1 minute
- monitor_data_retention: 1 day
- initial-store-count: 1
-
-partition:
- default-shard-count: 1
- store-max-shard-count: 12
diff --git a/docker/configs/application-pd2.yml b/docker/configs/application-pd2.yml
deleted file mode 100644
index a0d2c79ea3..0000000000
--- a/docker/configs/application-pd2.yml
+++ /dev/null
@@ -1,63 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-spring:
- application:
- name: hugegraph-pd
-
-management:
- metrics:
- export:
- prometheus:
- enabled: true
- endpoints:
- web:
- exposure:
- include: "*"
-
-logging:
- config: 'file:./conf/log4j2.xml'
-license:
- verify-path: ./conf/verify-license.json
- license-path: ./conf/hugegraph.license
-grpc:
- port: 8688
- host: 127.0.0.1
-
-server:
- port: 8622
-
-pd:
- data-path: ./pd_data
- patrol-interval: 1800
- initial-store-count: 3
- initial-store-list: 127.0.0.1:8500,127.0.0.1:8501,127.0.0.1:8502
-
-raft:
- address: 127.0.0.1:8612
- peers-list: 127.0.0.1:8610,127.0.0.1:8611,127.0.0.1:8612
-
-store:
- max-down-time: 172800
- monitor_data_enabled: true
- monitor_data_interval: 1 minute
- monitor_data_retention: 1 day
- initial-store-count: 1
-
-partition:
- default-shard-count: 1
- store-max-shard-count: 12
diff --git a/docker/configs/application-store0.yml b/docker/configs/application-store0.yml
deleted file mode 100644
index d093f1bfbd..0000000000
--- a/docker/configs/application-store0.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-pdserver:
- address: 127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
-
-management:
- metrics:
- export:
- prometheus:
- enabled: true
- endpoints:
- web:
- exposure:
- include: "*"
-
-grpc:
- host: 127.0.0.1
- port: 8500
- netty-server:
- max-inbound-message-size: 1000MB
-raft:
- disruptorBufferSize: 1024
- address: 127.0.0.1:8510
- max-log-file-size: 600000000000
- snapshotInterval: 1800
-server:
- port: 8520
-
-app:
- data-path: ./storage
-
-spring:
- application:
- name: store-node-grpc-server
- profiles:
- active: default
- include: pd
-
-logging:
- config: 'file:./conf/log4j2.xml'
- level:
- root: info
diff --git a/docker/configs/application-store1.yml b/docker/configs/application-store1.yml
deleted file mode 100644
index 0aeba62cf6..0000000000
--- a/docker/configs/application-store1.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-pdserver:
- address: 127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
-
-management:
- metrics:
- export:
- prometheus:
- enabled: true
- endpoints:
- web:
- exposure:
- include: "*"
-
-grpc:
- host: 127.0.0.1
- port: 8501
- netty-server:
- max-inbound-message-size: 1000MB
-raft:
- disruptorBufferSize: 1024
- address: 127.0.0.1:8511
- max-log-file-size: 600000000000
- snapshotInterval: 1800
-server:
- port: 8521
-
-app:
- data-path: ./storage
-
-spring:
- application:
- name: store-node-grpc-server
- profiles:
- active: default
- include: pd
-
-logging:
- config: 'file:./conf/log4j2.xml'
- level:
- root: info
diff --git a/docker/configs/application-store2.yml b/docker/configs/application-store2.yml
deleted file mode 100644
index e18dc62a3c..0000000000
--- a/docker/configs/application-store2.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-pdserver:
- address: 127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
-
-management:
- metrics:
- export:
- prometheus:
- enabled: true
- endpoints:
- web:
- exposure:
- include: "*"
-
-grpc:
- host: 127.0.0.1
- port: 8502
- netty-server:
- max-inbound-message-size: 1000MB
-raft:
- disruptorBufferSize: 1024
- address: 127.0.0.1:8512
- max-log-file-size: 600000000000
- snapshotInterval: 1800
-server:
- port: 8522
-
-app:
- data-path: ./storage
-
-spring:
- application:
- name: store-node-grpc-server
- profiles:
- active: default
- include: pd
-
-logging:
- config: 'file:./conf/log4j2.xml'
- level:
- root: info
diff --git a/docker/configs/server1-conf/graphs/hugegraph.properties b/docker/configs/server1-conf/graphs/hugegraph.properties
deleted file mode 100644
index 66cbccb731..0000000000
--- a/docker/configs/server1-conf/graphs/hugegraph.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
-gremlin.graph=org.apache.hugegraph.HugeFactory
-
-# cache config
-vertex.cache_type=l2
-edge.cache_type=l2
-
-store=hugegraph
-backend=hstore
-serializer=binary
-
-# pd config
-pd.peers=127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
-
-# task config
-task.scheduler_type=local
-task.schedule_period=10
-task.retry=0
-task.wait_timeout=10
diff --git a/docker/configs/server1-conf/gremlin-driver-settings.yaml b/docker/configs/server1-conf/gremlin-driver-settings.yaml
deleted file mode 100644
index 2f60ff8379..0000000000
--- a/docker/configs/server1-conf/gremlin-driver-settings.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8181
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
-}
diff --git a/docker/configs/server1-conf/gremlin-server.yaml b/docker/configs/server1-conf/gremlin-server.yaml
deleted file mode 100644
index df73386b26..0000000000
--- a/docker/configs/server1-conf/gremlin-server.yaml
+++ /dev/null
@@ -1,127 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# host and port of gremlin server, need to be consistent with host and port in rest-server.properties
-host: 127.0.0.1
-port: 8181
-
-# timeout in ms of gremlin query
-evaluationTimeout: 30000
-
-channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
-# don't set graph at here, this happens after support for dynamically adding graph
-graphs: {
-}
-scriptEngines: {
- gremlin-groovy: {
- staticImports: [
- org.opencypher.gremlin.process.traversal.CustomPredicates.*',
- org.opencypher.gremlin.traversal.CustomFunctions.*
- ],
- plugins: {
- org.apache.hugegraph.plugin.HugeGraphGremlinPlugin: {},
- org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
- org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {
- classImports: [
- java.lang.Math,
- org.apache.hugegraph.backend.id.IdGenerator,
- org.apache.hugegraph.type.define.Directions,
- org.apache.hugegraph.type.define.NodeRole,
- org.apache.hugegraph.masterelection.GlobalMasterInfo,
- org.apache.hugegraph.util.DateUtil,
- org.apache.hugegraph.traversal.algorithm.CollectionPathsTraverser,
- org.apache.hugegraph.traversal.algorithm.CountTraverser,
- org.apache.hugegraph.traversal.algorithm.CustomizedCrosspointsTraverser,
- org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser,
- org.apache.hugegraph.traversal.algorithm.FusiformSimilarityTraverser,
- org.apache.hugegraph.traversal.algorithm.HugeTraverser,
- org.apache.hugegraph.traversal.algorithm.JaccardSimilarTraverser,
- org.apache.hugegraph.traversal.algorithm.KneighborTraverser,
- org.apache.hugegraph.traversal.algorithm.KoutTraverser,
- org.apache.hugegraph.traversal.algorithm.MultiNodeShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.NeighborRankTraverser,
- org.apache.hugegraph.traversal.algorithm.PathsTraverser,
- org.apache.hugegraph.traversal.algorithm.PersonalRankTraverser,
- org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser,
- org.apache.hugegraph.traversal.algorithm.ShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.SingleSourceShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.SubGraphTraverser,
- org.apache.hugegraph.traversal.algorithm.TemplatePathsTraverser,
- org.apache.hugegraph.traversal.algorithm.steps.EdgeStep,
- org.apache.hugegraph.traversal.algorithm.steps.RepeatEdgeStep,
- org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep,
- org.apache.hugegraph.traversal.optimize.ConditionP,
- org.apache.hugegraph.traversal.optimize.Text,
- org.apache.hugegraph.traversal.optimize.TraversalUtil,
- org.opencypher.gremlin.traversal.CustomFunctions,
- org.opencypher.gremlin.traversal.CustomPredicate
- ],
- methodImports: [
- java.lang.Math#*,
- org.opencypher.gremlin.traversal.CustomPredicate#*,
- org.opencypher.gremlin.traversal.CustomFunctions#*
- ]
- },
- org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
- files: [scripts/empty-sample.groovy]
- }
- }
- }
-}
-serializers:
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
-metrics: {
- consoleReporter: {enabled: false, interval: 180000},
- csvReporter: {enabled: false, interval: 180000, fileName: ./metrics/gremlin-server-metrics.csv},
- jmxReporter: {enabled: false},
- slf4jReporter: {enabled: false, interval: 180000},
- gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
- graphiteReporter: {enabled: false, interval: 180000}
-}
-maxInitialLineLength: 4096
-maxHeaderSize: 8192
-maxChunkSize: 8192
-maxContentLength: 65536
-maxAccumulationBufferComponents: 1024
-resultIterationBatchSize: 64
-writeBufferLowWaterMark: 32768
-writeBufferHighWaterMark: 65536
-ssl: {
- enabled: false
-}
diff --git a/docker/configs/server1-conf/log4j2.xml b/docker/configs/server1-conf/log4j2.xml
deleted file mode 100644
index f1dd7e8395..0000000000
--- a/docker/configs/server1-conf/log4j2.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
-
- logs
- hugegraph-server
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docker/configs/server1-conf/remote-objects.yaml b/docker/configs/server1-conf/remote-objects.yaml
deleted file mode 100644
index 94ebc99190..0000000000
--- a/docker/configs/server1-conf/remote-objects.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8181
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- # The duplication of HugeGraphIoRegistry is meant to fix a bug in the
- # 'org.apache.tinkerpop.gremlin.driver.Settings:from(Configuration)' method.
- ioRegistries: [
- org.apache.hugegraph.io.HugeGraphIoRegistry,
- org.apache.hugegraph.io.HugeGraphIoRegistry
- ]
- }
-}
diff --git a/docker/configs/server1-conf/remote.yaml b/docker/configs/server1-conf/remote.yaml
deleted file mode 100644
index 2f60ff8379..0000000000
--- a/docker/configs/server1-conf/remote.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8181
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
-}
diff --git a/docker/configs/server1-conf/rest-server.properties b/docker/configs/server1-conf/rest-server.properties
deleted file mode 100644
index 6e2257ce97..0000000000
--- a/docker/configs/server1-conf/rest-server.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# bind url
-restserver.url=http://127.0.0.1:8081
-# gremlin server url, need to be consistent with host and port in gremlin-server.yaml
-gremlinserver.url=http://127.0.0.1:8181
-
-graphs=./conf/graphs
-
-# configuration of arthas
-arthas.telnet_port=8562
-arthas.http_port=8561
-arthas.ip=127.0.0.1
-arthas.disabled_commands=jad
-
-# authentication configs
-# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
-# 'org.apache.hugegraph.auth.ConfigAuthenticator'
-#auth.authenticator=
-
-# rpc server configs for multi graph-servers or raft-servers
-rpc.server_host=127.0.0.1
-rpc.server_port=8091
-
-# lightweight load balancing (beta)
-server.id=server-1
-server.role=master
-
-# slow query log
-log.slow_query_threshold=1000
diff --git a/docker/configs/server2-conf/graphs/hugegraph.properties b/docker/configs/server2-conf/graphs/hugegraph.properties
deleted file mode 100644
index 66cbccb731..0000000000
--- a/docker/configs/server2-conf/graphs/hugegraph.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
-gremlin.graph=org.apache.hugegraph.HugeFactory
-
-# cache config
-vertex.cache_type=l2
-edge.cache_type=l2
-
-store=hugegraph
-backend=hstore
-serializer=binary
-
-# pd config
-pd.peers=127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
-
-# task config
-task.scheduler_type=local
-task.schedule_period=10
-task.retry=0
-task.wait_timeout=10
diff --git a/docker/configs/server2-conf/gremlin-driver-settings.yaml b/docker/configs/server2-conf/gremlin-driver-settings.yaml
deleted file mode 100644
index 55f38ab97d..0000000000
--- a/docker/configs/server2-conf/gremlin-driver-settings.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8182
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
-}
diff --git a/docker/configs/server2-conf/gremlin-server.yaml b/docker/configs/server2-conf/gremlin-server.yaml
deleted file mode 100644
index 048dded559..0000000000
--- a/docker/configs/server2-conf/gremlin-server.yaml
+++ /dev/null
@@ -1,127 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# host and port of gremlin server, need to be consistent with host and port in rest-server.properties
-host: 127.0.0.1
-port: 8182
-
-# timeout in ms of gremlin query
-evaluationTimeout: 30000
-
-channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
-# don't set graph at here, this happens after support for dynamically adding graph
-graphs: {
-}
-scriptEngines: {
- gremlin-groovy: {
- staticImports: [
- org.opencypher.gremlin.process.traversal.CustomPredicates.*',
- org.opencypher.gremlin.traversal.CustomFunctions.*
- ],
- plugins: {
- org.apache.hugegraph.plugin.HugeGraphGremlinPlugin: {},
- org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
- org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {
- classImports: [
- java.lang.Math,
- org.apache.hugegraph.backend.id.IdGenerator,
- org.apache.hugegraph.type.define.Directions,
- org.apache.hugegraph.type.define.NodeRole,
- org.apache.hugegraph.masterelection.GlobalMasterInfo,
- org.apache.hugegraph.util.DateUtil,
- org.apache.hugegraph.traversal.algorithm.CollectionPathsTraverser,
- org.apache.hugegraph.traversal.algorithm.CountTraverser,
- org.apache.hugegraph.traversal.algorithm.CustomizedCrosspointsTraverser,
- org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser,
- org.apache.hugegraph.traversal.algorithm.FusiformSimilarityTraverser,
- org.apache.hugegraph.traversal.algorithm.HugeTraverser,
- org.apache.hugegraph.traversal.algorithm.JaccardSimilarTraverser,
- org.apache.hugegraph.traversal.algorithm.KneighborTraverser,
- org.apache.hugegraph.traversal.algorithm.KoutTraverser,
- org.apache.hugegraph.traversal.algorithm.MultiNodeShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.NeighborRankTraverser,
- org.apache.hugegraph.traversal.algorithm.PathsTraverser,
- org.apache.hugegraph.traversal.algorithm.PersonalRankTraverser,
- org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser,
- org.apache.hugegraph.traversal.algorithm.ShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.SingleSourceShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.SubGraphTraverser,
- org.apache.hugegraph.traversal.algorithm.TemplatePathsTraverser,
- org.apache.hugegraph.traversal.algorithm.steps.EdgeStep,
- org.apache.hugegraph.traversal.algorithm.steps.RepeatEdgeStep,
- org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep,
- org.apache.hugegraph.traversal.optimize.ConditionP,
- org.apache.hugegraph.traversal.optimize.Text,
- org.apache.hugegraph.traversal.optimize.TraversalUtil,
- org.opencypher.gremlin.traversal.CustomFunctions,
- org.opencypher.gremlin.traversal.CustomPredicate
- ],
- methodImports: [
- java.lang.Math#*,
- org.opencypher.gremlin.traversal.CustomPredicate#*,
- org.opencypher.gremlin.traversal.CustomFunctions#*
- ]
- },
- org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
- files: [scripts/empty-sample.groovy]
- }
- }
- }
-}
-serializers:
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
-metrics: {
- consoleReporter: {enabled: false, interval: 180000},
- csvReporter: {enabled: false, interval: 180000, fileName: ./metrics/gremlin-server-metrics.csv},
- jmxReporter: {enabled: false},
- slf4jReporter: {enabled: false, interval: 180000},
- gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
- graphiteReporter: {enabled: false, interval: 180000}
-}
-maxInitialLineLength: 4096
-maxHeaderSize: 8192
-maxChunkSize: 8192
-maxContentLength: 65536
-maxAccumulationBufferComponents: 1024
-resultIterationBatchSize: 64
-writeBufferLowWaterMark: 32768
-writeBufferHighWaterMark: 65536
-ssl: {
- enabled: false
-}
diff --git a/docker/configs/server2-conf/log4j2.xml b/docker/configs/server2-conf/log4j2.xml
deleted file mode 100644
index f1dd7e8395..0000000000
--- a/docker/configs/server2-conf/log4j2.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
-
- logs
- hugegraph-server
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docker/configs/server2-conf/remote-objects.yaml b/docker/configs/server2-conf/remote-objects.yaml
deleted file mode 100644
index 39679d8c30..0000000000
--- a/docker/configs/server2-conf/remote-objects.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8182
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- # The duplication of HugeGraphIoRegistry is meant to fix a bug in the
- # 'org.apache.tinkerpop.gremlin.driver.Settings:from(Configuration)' method.
- ioRegistries: [
- org.apache.hugegraph.io.HugeGraphIoRegistry,
- org.apache.hugegraph.io.HugeGraphIoRegistry
- ]
- }
-}
diff --git a/docker/configs/server2-conf/rest-server.properties b/docker/configs/server2-conf/rest-server.properties
deleted file mode 100644
index e55fb6b635..0000000000
--- a/docker/configs/server2-conf/rest-server.properties
+++ /dev/null
@@ -1,26 +0,0 @@
-# bind url
-restserver.url=http://127.0.0.1:8082
-# gremlin server url, need to be consistent with host and port in gremlin-server.yaml
-gremlinserver.url=http://127.0.0.1:8182
-
-graphs=./conf/graphs
-
-# configuration of arthas
-arthas.telnet_port=8572
-arthas.http_port=8571
-arthas.ip=127.0.0.1
-arthas.disabled_commands=jad
-
-# authentication configs
-# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
-# 'org.apache.hugegraph.auth.ConfigAuthenticator'
-#auth.authenticator=
-
-# rpc server configs for multi graph-servers or raft-servers
-rpc.server_host=127.0.0.1
-rpc.server_port=8092
-#rpc.server_timeout=30
-
-# lightweight load balancing (beta)
-server.id=server-2
-server.role=worker
diff --git a/docker/configs/server3-conf/graphs/hugegraph.properties b/docker/configs/server3-conf/graphs/hugegraph.properties
deleted file mode 100644
index 66cbccb731..0000000000
--- a/docker/configs/server3-conf/graphs/hugegraph.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
-gremlin.graph=org.apache.hugegraph.HugeFactory
-
-# cache config
-vertex.cache_type=l2
-edge.cache_type=l2
-
-store=hugegraph
-backend=hstore
-serializer=binary
-
-# pd config
-pd.peers=127.0.0.1:8686,127.0.0.1:8687,127.0.0.1:8688
-
-# task config
-task.scheduler_type=local
-task.schedule_period=10
-task.retry=0
-task.wait_timeout=10
diff --git a/docker/configs/server3-conf/gremlin-driver-settings.yaml b/docker/configs/server3-conf/gremlin-driver-settings.yaml
deleted file mode 100644
index 00ef046699..0000000000
--- a/docker/configs/server3-conf/gremlin-driver-settings.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8183
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
-}
diff --git a/docker/configs/server3-conf/gremlin-server.yaml b/docker/configs/server3-conf/gremlin-server.yaml
deleted file mode 100644
index e153926bc9..0000000000
--- a/docker/configs/server3-conf/gremlin-server.yaml
+++ /dev/null
@@ -1,127 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# host and port of gremlin server, need to be consistent with host and port in rest-server.properties
-host: 127.0.0.1
-port: 8183
-
-# timeout in ms of gremlin query
-evaluationTimeout: 30000
-
-channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
-# don't set graph at here, this happens after support for dynamically adding graph
-graphs: {
-}
-scriptEngines: {
- gremlin-groovy: {
- staticImports: [
- org.opencypher.gremlin.process.traversal.CustomPredicates.*',
- org.opencypher.gremlin.traversal.CustomFunctions.*
- ],
- plugins: {
- org.apache.hugegraph.plugin.HugeGraphGremlinPlugin: {},
- org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
- org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {
- classImports: [
- java.lang.Math,
- org.apache.hugegraph.backend.id.IdGenerator,
- org.apache.hugegraph.type.define.Directions,
- org.apache.hugegraph.type.define.NodeRole,
- org.apache.hugegraph.masterelection.GlobalMasterInfo,
- org.apache.hugegraph.util.DateUtil,
- org.apache.hugegraph.traversal.algorithm.CollectionPathsTraverser,
- org.apache.hugegraph.traversal.algorithm.CountTraverser,
- org.apache.hugegraph.traversal.algorithm.CustomizedCrosspointsTraverser,
- org.apache.hugegraph.traversal.algorithm.CustomizePathsTraverser,
- org.apache.hugegraph.traversal.algorithm.FusiformSimilarityTraverser,
- org.apache.hugegraph.traversal.algorithm.HugeTraverser,
- org.apache.hugegraph.traversal.algorithm.JaccardSimilarTraverser,
- org.apache.hugegraph.traversal.algorithm.KneighborTraverser,
- org.apache.hugegraph.traversal.algorithm.KoutTraverser,
- org.apache.hugegraph.traversal.algorithm.MultiNodeShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.NeighborRankTraverser,
- org.apache.hugegraph.traversal.algorithm.PathsTraverser,
- org.apache.hugegraph.traversal.algorithm.PersonalRankTraverser,
- org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser,
- org.apache.hugegraph.traversal.algorithm.ShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.SingleSourceShortestPathTraverser,
- org.apache.hugegraph.traversal.algorithm.SubGraphTraverser,
- org.apache.hugegraph.traversal.algorithm.TemplatePathsTraverser,
- org.apache.hugegraph.traversal.algorithm.steps.EdgeStep,
- org.apache.hugegraph.traversal.algorithm.steps.RepeatEdgeStep,
- org.apache.hugegraph.traversal.algorithm.steps.WeightedEdgeStep,
- org.apache.hugegraph.traversal.optimize.ConditionP,
- org.apache.hugegraph.traversal.optimize.Text,
- org.apache.hugegraph.traversal.optimize.TraversalUtil,
- org.opencypher.gremlin.traversal.CustomFunctions,
- org.opencypher.gremlin.traversal.CustomPredicate
- ],
- methodImports: [
- java.lang.Math#*,
- org.opencypher.gremlin.traversal.CustomPredicate#*,
- org.opencypher.gremlin.traversal.CustomFunctions#*
- ]
- },
- org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
- files: [scripts/empty-sample.groovy]
- }
- }
- }
-}
-serializers:
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV2d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
- - {className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
- }
-metrics: {
- consoleReporter: {enabled: false, interval: 180000},
- csvReporter: {enabled: false, interval: 180000, fileName: ./metrics/gremlin-server-metrics.csv},
- jmxReporter: {enabled: false},
- slf4jReporter: {enabled: false, interval: 180000},
- gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
- graphiteReporter: {enabled: false, interval: 180000}
-}
-maxInitialLineLength: 4096
-maxHeaderSize: 8192
-maxChunkSize: 8192
-maxContentLength: 65536
-maxAccumulationBufferComponents: 1024
-resultIterationBatchSize: 64
-writeBufferLowWaterMark: 32768
-writeBufferHighWaterMark: 65536
-ssl: {
- enabled: false
-}
diff --git a/docker/configs/server3-conf/log4j2.xml b/docker/configs/server3-conf/log4j2.xml
deleted file mode 100644
index f1dd7e8395..0000000000
--- a/docker/configs/server3-conf/log4j2.xml
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
-
- logs
- hugegraph-server
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docker/configs/server3-conf/remote-objects.yaml b/docker/configs/server3-conf/remote-objects.yaml
deleted file mode 100644
index ce99fcb2f6..0000000000
--- a/docker/configs/server3-conf/remote-objects.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8183
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- # The duplication of HugeGraphIoRegistry is meant to fix a bug in the
- # 'org.apache.tinkerpop.gremlin.driver.Settings:from(Configuration)' method.
- ioRegistries: [
- org.apache.hugegraph.io.HugeGraphIoRegistry,
- org.apache.hugegraph.io.HugeGraphIoRegistry
- ]
- }
-}
diff --git a/docker/configs/server3-conf/remote.yaml b/docker/configs/server3-conf/remote.yaml
deleted file mode 100644
index 00ef046699..0000000000
--- a/docker/configs/server3-conf/remote.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-hosts: [localhost]
-port: 8183
-serializer: {
- className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0,
- config: {
- serializeResultToString: false,
- ioRegistries: [org.apache.hugegraph.io.HugeGraphIoRegistry]
- }
-}
diff --git a/docker/configs/server3-conf/rest-server.properties b/docker/configs/server3-conf/rest-server.properties
deleted file mode 100644
index af1d7301db..0000000000
--- a/docker/configs/server3-conf/rest-server.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-# bind url
-restserver.url=http://127.0.0.1:8083
-# gremlin server url, need to be consistent with host and port in gremlin-server.yaml
-gremlinserver.url=http://127.0.0.1:8183
-
-graphs=./conf/graphs
-
-# configuration of arthas
-arthas.telnet_port=8582
-arthas.http_port=8581
-arthas.ip=127.0.0.1
-arthas.disabled_commands=jad
-
-# authentication configs
-# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
-# 'org.apache.hugegraph.auth.ConfigAuthenticator'
-#auth.authenticator=
-
-# rpc server configs for multi graph-servers or raft-servers
-rpc.server_host=127.0.0.1
-rpc.server_port=8093
-
-# lightweight load balancing (beta)
-server.id=server-3
-server.role=worker
diff --git a/docker/docker-compose-3pd-3store-3server.yml b/docker/docker-compose-3pd-3store-3server.yml
index f704c1c0f6..fc7930351b 100644
--- a/docker/docker-compose-3pd-3store-3server.yml
+++ b/docker/docker-compose-3pd-3store-3server.yml
@@ -15,166 +15,188 @@
# limitations under the License.
#
-# TODO: reuse the configs for same type containers
-# User could modify the node nums and the port by themselves
-version: "3"
+name: hugegraph-3x3
+
+networks:
+ hg-net:
+ driver: bridge
+
+volumes:
+ hg-pd0-data:
+ hg-pd1-data:
+ hg-pd2-data:
+ hg-store0-data:
+ hg-store1-data:
+ hg-store2-data:
+
+# ── Shared service defaults ──────────────────────────────────────────
+x-pd-common: &pd-common
+ image: hugegraph/pd:${HUGEGRAPH_VERSION:-latest}
+ pull_policy: missing
+ restart: unless-stopped
+ networks: [hg-net]
+ healthcheck:
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8620/v1/health >/dev/null || exit 1"]
+ interval: 15s
+ timeout: 10s
+ retries: 30
+ start_period: 120s
+
+x-store-common: &store-common
+ image: hugegraph/store:${HUGEGRAPH_VERSION:-latest}
+ pull_policy: missing
+ restart: unless-stopped
+ networks: [hg-net]
+ depends_on:
+ pd0: { condition: service_healthy }
+ pd1: { condition: service_healthy }
+ pd2: { condition: service_healthy }
+ healthcheck:
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8520/v1/health >/dev/null || exit 1"]
+ interval: 15s
+ timeout: 15s
+ retries: 40
+ start_period: 120s
+
+x-server-common: &server-common
+ image: hugegraph/server:${HUGEGRAPH_VERSION:-latest}
+ pull_policy: missing
+ restart: unless-stopped
+ networks: [hg-net]
+ depends_on:
+ store0: { condition: service_healthy }
+ store1: { condition: service_healthy }
+ store2: { condition: service_healthy }
+ environment:
+ STORE_REST: store0:8520
+ HG_SERVER_BACKEND: hstore
+ HG_SERVER_PD_PEERS: pd0:8686,pd1:8686,pd2:8686
+ healthcheck:
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8080/versions >/dev/null || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 30
+ start_period: 60s
+
+# ── Services ──────────────────────────────────────────────────────────
services:
+ # --- PD cluster (3 nodes) ---
pd0:
- image: hugegraph/pd
- container_name: pd0
+ <<: *pd-common
+ container_name: hg-pd0
hostname: pd0
- network_mode: host
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8620"]
- interval: 10s
- timeout: 5s
- retries: 3
+ networks: [ hg-net ]
+ environment:
+ HG_PD_GRPC_HOST: pd0
+ HG_PD_GRPC_PORT: "8686"
+ HG_PD_REST_PORT: "8620"
+ HG_PD_RAFT_ADDRESS: pd0:8610
+ HG_PD_RAFT_PEERS_LIST: pd0:8610,pd1:8610,pd2:8610
+ HG_PD_INITIAL_STORE_LIST: store0:8500,store1:8500,store2:8500
+ HG_PD_DATA_PATH: /hugegraph-pd/pd_data
+ HG_PD_INITIAL_STORE_COUNT: 3
+ ports: ["8620:8620", "8686:8686"]
volumes:
- - ./configs/application-pd0.yml:/hugegraph-pd/conf/application.yml
+ - hg-pd0-data:/hugegraph-pd/pd_data
pd1:
- image: hugegraph/pd
- container_name: pd1
+ <<: *pd-common
+ container_name: hg-pd1
hostname: pd1
- network_mode: host
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8621"]
- interval: 10s
- timeout: 5s
- retries: 3
+ networks: [ hg-net ]
+ environment:
+ HG_PD_GRPC_HOST: pd1
+ HG_PD_GRPC_PORT: "8686"
+ HG_PD_REST_PORT: "8620"
+ HG_PD_RAFT_ADDRESS: pd1:8610
+ HG_PD_RAFT_PEERS_LIST: pd0:8610,pd1:8610,pd2:8610
+ HG_PD_INITIAL_STORE_LIST: store0:8500,store1:8500,store2:8500
+ HG_PD_DATA_PATH: /hugegraph-pd/pd_data
+ HG_PD_INITIAL_STORE_COUNT: 3
+ ports: ["8621:8620", "8687:8686"]
volumes:
- - ./configs/application-pd1.yml:/hugegraph-pd/conf/application.yml
+ - hg-pd1-data:/hugegraph-pd/pd_data
pd2:
- image: hugegraph/pd
- container_name: pd2
+ <<: *pd-common
+ container_name: hg-pd2
hostname: pd2
- network_mode: host
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8622"]
- interval: 10s
- timeout: 5s
- retries: 3
+ networks: [ hg-net ]
+ environment:
+ HG_PD_GRPC_HOST: pd2
+ HG_PD_GRPC_PORT: "8686"
+ HG_PD_REST_PORT: "8620"
+ HG_PD_RAFT_ADDRESS: pd2:8610
+ HG_PD_RAFT_PEERS_LIST: pd0:8610,pd1:8610,pd2:8610
+ HG_PD_INITIAL_STORE_LIST: store0:8500,store1:8500,store2:8500
+ HG_PD_DATA_PATH: /hugegraph-pd/pd_data
+ HG_PD_INITIAL_STORE_COUNT: 3
+ ports: ["8622:8620", "8688:8686"]
volumes:
- - ./configs/application-pd2.yml:/hugegraph-pd/conf/application.yml
+ - hg-pd2-data:/hugegraph-pd/pd_data
+ # --- Store cluster (3 nodes) ---
store0:
- image: hugegraph/store
- container_name: store0
+ <<: *store-common
+ container_name: hg-store0
hostname: store0
- network_mode: host
- depends_on:
- pd0:
- condition: service_healthy
- pd1:
- condition: service_healthy
- pd2:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8520"]
- interval: 10s
- timeout: 5s
- retries: 3
+ environment:
+ HG_STORE_PD_ADDRESS: pd0:8686,pd1:8686,pd2:8686
+ HG_STORE_GRPC_HOST: store0
+ HG_STORE_GRPC_PORT: "8500"
+ HG_STORE_REST_PORT: "8520"
+ HG_STORE_RAFT_ADDRESS: store0:8510
+ HG_STORE_DATA_PATH: /hugegraph-store/storage
+ ports: ["8500:8500", "8510:8510", "8520:8520"]
volumes:
- - ./configs/application-store0.yml:/hugegraph-store/conf/application.yml
+ - hg-store0-data:/hugegraph-store/storage
store1:
- image: hugegraph/store
- container_name: store1
+ <<: *store-common
+ container_name: hg-store1
hostname: store1
- network_mode: host
- depends_on:
- pd0:
- condition: service_healthy
- pd1:
- condition: service_healthy
- pd2:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8521"]
- interval: 10s
- timeout: 5s
- retries: 3
+ environment:
+ HG_STORE_PD_ADDRESS: pd0:8686,pd1:8686,pd2:8686
+ HG_STORE_GRPC_HOST: store1
+ HG_STORE_GRPC_PORT: "8500"
+ HG_STORE_REST_PORT: "8520"
+ HG_STORE_RAFT_ADDRESS: store1:8510
+ HG_STORE_DATA_PATH: /hugegraph-store/storage
+ ports: ["8501:8500", "8511:8510", "8521:8520"]
volumes:
- - ./configs/application-store1.yml:/hugegraph-store/conf/application.yml
+ - hg-store1-data:/hugegraph-store/storage
store2:
- image: hugegraph/store
- container_name: store2
+ <<: *store-common
+ container_name: hg-store2
hostname: store2
- network_mode: host
- depends_on:
- pd0:
- condition: service_healthy
- pd1:
- condition: service_healthy
- pd2:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8522"]
- interval: 10s
- timeout: 5s
- retries: 3
+ environment:
+ HG_STORE_PD_ADDRESS: pd0:8686,pd1:8686,pd2:8686
+ HG_STORE_GRPC_HOST: store2
+ HG_STORE_GRPC_PORT: "8500"
+ HG_STORE_REST_PORT: "8520"
+ HG_STORE_RAFT_ADDRESS: store2:8510
+ HG_STORE_DATA_PATH: /hugegraph-store/storage
+ ports: ["8502:8500", "8512:8510", "8522:8520"]
volumes:
- - ./configs/application-store2.yml:/hugegraph-store/conf/application.yml
+ - hg-store2-data:/hugegraph-store/storage
+
+ # --- Server cluster (3 nodes) ---
+ server0:
+ <<: *server-common
+ container_name: hg-server0
+ hostname: server0
+ ports: ["8080:8080"]
server1:
- image: hugegraph/server
- container_name: server1
+ <<: *server-common
+ container_name: hg-server1
hostname: server1
- network_mode: host
- depends_on:
- store0:
- condition: service_healthy
- store1:
- condition: service_healthy
- store2:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8081"]
- interval: 10s
- timeout: 5s
- retries: 3
- volumes:
- - ./configs/server1-conf:/hugegraph-server/conf
+ ports: ["8081:8080"]
server2:
- image: hugegraph/server
- container_name: server2
+ <<: *server-common
+ container_name: hg-server2
hostname: server2
- network_mode: host
- depends_on:
- store0:
- condition: service_healthy
- store1:
- condition: service_healthy
- store2:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8082"]
- interval: 10s
- timeout: 5s
- retries: 3
- volumes:
- - ./configs/server2-conf:/hugegraph-server/conf
-
- server3:
- image: hugegraph/server
- container_name: server3
- hostname: server3
- network_mode: host
- depends_on:
- store0:
- condition: service_healthy
- store1:
- condition: service_healthy
- store2:
- condition: service_healthy
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8083"]
- interval: 10s
- timeout: 5s
- retries: 3
- volumes:
- - ./configs/server3-conf:/hugegraph-server/conf
+ ports: ["8082:8080"]
diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml
new file mode 100644
index 0000000000..aa0736a38b
--- /dev/null
+++ b/docker/docker-compose.dev.yml
@@ -0,0 +1,106 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+name: hugegraph-single
+
+networks:
+ hg-net:
+ driver: bridge
+
+volumes:
+ hg-pd-data:
+ hg-store-data:
+
+services:
+ pd:
+ build:
+ context: ..
+ dockerfile: hugegraph-pd/Dockerfile
+ container_name: hg-pd
+ hostname: pd
+ restart: unless-stopped
+ networks: [hg-net]
+ environment:
+ HG_PD_GRPC_HOST: pd
+ HG_PD_GRPC_PORT: "8686"
+ HG_PD_REST_PORT: "8620"
+ HG_PD_RAFT_ADDRESS: pd:8610
+ HG_PD_RAFT_PEERS_LIST: pd:8610
+ HG_PD_INITIAL_STORE_LIST: store:8500
+ HG_PD_DATA_PATH: /hugegraph-pd/pd_data
+ ports:
+ - "8620:8620"
+ volumes:
+ - hg-pd-data:/hugegraph-pd/pd_data
+ healthcheck:
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8620/v1/health >/dev/null || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 12
+ start_period: 20s
+
+ store:
+ build:
+ context: ..
+ dockerfile: hugegraph-store/Dockerfile
+ container_name: hg-store
+ hostname: store
+ restart: unless-stopped
+ networks: [hg-net]
+ depends_on:
+ pd:
+ condition: service_healthy
+ environment:
+ HG_STORE_PD_ADDRESS: pd:8686
+ HG_STORE_GRPC_HOST: store
+ HG_STORE_GRPC_PORT: "8500"
+ HG_STORE_REST_PORT: "8520"
+ HG_STORE_RAFT_ADDRESS: store:8510
+ HG_STORE_DATA_PATH: /hugegraph-store/storage
+ ports:
+ - "8520:8520"
+ volumes:
+ - hg-store-data:/hugegraph-store/storage
+ healthcheck:
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8520/v1/health >/dev/null || exit 1"]
+ interval: 10s
+ timeout: 10s
+ retries: 30
+ start_period: 30s
+
+ server:
+ build:
+ context: ..
+ dockerfile: hugegraph-server/Dockerfile-hstore
+ container_name: hg-server
+ hostname: server
+ restart: unless-stopped
+ networks: [hg-net]
+ depends_on:
+ store:
+ condition: service_healthy
+ environment:
+ HG_SERVER_BACKEND: hstore
+ HG_SERVER_PD_PEERS: pd:8686
+ ports:
+ - "8080:8080"
+ healthcheck:
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8080/versions >/dev/null || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 30
+ start_period: 60s
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 0c90c1e451..953c438f58 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -14,45 +14,90 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+name: hugegraph-single
-version: "3"
+networks:
+ hg-net:
+ driver: bridge
+
+volumes:
+ hg-pd-data:
+ hg-store-data:
services:
+
pd:
- image: hugegraph/pd
- container_name: pd
+ image: hugegraph/pd:${HUGEGRAPH_VERSION:-latest}
+ pull_policy: always
+ container_name: hg-pd
hostname: pd
- network_mode: host
+ restart: unless-stopped
+ networks: [hg-net]
+ environment:
+ HG_PD_GRPC_HOST: pd
+ HG_PD_GRPC_PORT: "8686"
+ HG_PD_REST_PORT: "8620"
+ HG_PD_RAFT_ADDRESS: pd:8610
+ HG_PD_RAFT_PEERS_LIST: pd:8610
+ HG_PD_INITIAL_STORE_LIST: store:8500
+ HG_PD_DATA_PATH: /hugegraph-pd/pd_data
+ ports:
+ - "8620:8620"
+ volumes:
+ - hg-pd-data:/hugegraph-pd/pd_data
healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8620"]
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8620/v1/health >/dev/null || exit 1"]
interval: 10s
timeout: 5s
- retries: 3
+ retries: 12
+ start_period: 30s
store:
- image: hugegraph/store
- container_name: store
+ image: hugegraph/store:${HUGEGRAPH_VERSION:-latest}
+ pull_policy: always
+ container_name: hg-store
hostname: store
- network_mode: host
+ restart: unless-stopped
+ networks: [hg-net]
depends_on:
pd:
condition: service_healthy
+ environment:
+ HG_STORE_PD_ADDRESS: pd:8686
+ HG_STORE_GRPC_HOST: store
+ HG_STORE_GRPC_PORT: "8500"
+ HG_STORE_REST_PORT: "8520"
+ HG_STORE_RAFT_ADDRESS: store:8510
+ HG_STORE_DATA_PATH: /hugegraph-store/storage
+ ports:
+ - "8520:8520"
+ volumes:
+ - hg-store-data:/hugegraph-store/storage
healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8520"]
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8520/v1/health >/dev/null || exit 1"]
interval: 10s
- timeout: 5s
- retries: 3
+ timeout: 10s
+ retries: 30
+ start_period: 60s
server:
- image: hugegraph/server
- container_name: server
+ image: hugegraph/server:${HUGEGRAPH_VERSION:-latest}
+ pull_policy: always
+ container_name: hg-server
hostname: server
- network_mode: host
+ restart: unless-stopped
+ networks: [hg-net]
depends_on:
store:
condition: service_healthy
+ environment:
+ HG_SERVER_BACKEND: hstore
+ HG_SERVER_PD_PEERS: pd:8686
+ ports:
+ - "8080:8080"
healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:8080"]
+ test: ["CMD-SHELL", "curl -fsS http://localhost:8080/versions >/dev/null || exit 1"]
interval: 10s
timeout: 5s
- retries: 3
+ retries: 30
+ start_period: 60s
diff --git a/docker/hbase/Dockerfile b/docker/hbase/Dockerfile
new file mode 100644
index 0000000000..d533415ce7
--- /dev/null
+++ b/docker/hbase/Dockerfile
@@ -0,0 +1,109 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Standalone HBase 2.6.5 image for HugeGraph HBase backend testing.
+# Exposes ZooKeeper on 2181 with znode /hbase (matching hugegraph.properties defaults).
+
+FROM eclipse-temurin:11-jre-jammy
+
+ARG HBASE_VERSION=2.6.5
+ARG HBASE_PRIMARY_URL=https://archive.apache.org/dist/hbase/${HBASE_VERSION}/hbase-${HBASE_VERSION}-bin.tar.gz
+ARG HBASE_FALLBACK_URL=https://downloads.apache.org/hbase/${HBASE_VERSION}/hbase-${HBASE_VERSION}-bin.tar.gz
+ARG ALLOW_UNVERIFIED_DOWNLOAD=false
+
+ENV HBASE_VERSION=${HBASE_VERSION}
+ENV HBASE_HOME=/opt/hbase
+ENV PATH=${HBASE_HOME}/bin:${PATH}
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ curl \
+ netcat-openbsd \
+ && rm -rf /var/lib/apt/lists/*
+
+RUN set -eux; \
+ download_ok=0; \
+ downloaded_url=""; \
+ for url in "${HBASE_PRIMARY_URL}" "${HBASE_FALLBACK_URL}"; do \
+ [ -n "${url}" ] || continue; \
+ echo "Downloading HBase from ${url}"; \
+ if curl -fL --retry 8 --retry-delay 5 --retry-all-errors \
+ --connect-timeout 30 --max-time 1800 "${url}" -o /tmp/hbase.tar.gz; then \
+ download_ok=1; \
+ downloaded_url="${url}"; \
+ break; \
+ fi; \
+ echo "Download failed for ${url}, trying next source..."; \
+ rm -f /tmp/hbase.tar.gz; \
+ done; \
+ if [ "${download_ok}" -ne 1 ]; then \
+ echo "Unable to download HBase ${HBASE_VERSION} tarball from configured sources"; \
+ exit 1; \
+ fi; \
+ checksum_ok=0; \
+ for checksum_url in "${downloaded_url}.sha512" "${HBASE_PRIMARY_URL}.sha512" "${HBASE_FALLBACK_URL}.sha512"; do \
+ [ -n "${checksum_url}" ] || continue; \
+ if curl -fL --retry 5 --retry-delay 3 --retry-all-errors \
+ --connect-timeout 30 "${checksum_url}" -o /tmp/hbase.tar.gz.sha512 2>/dev/null; then \
+ checksum_ok=1; \
+ break; \
+ fi; \
+ done; \
+ if [ "${checksum_ok}" -eq 1 ]; then \
+ echo "Verifying SHA512 checksum..."; \
+ expected_hash=$(grep -Eio '[a-f0-9]{128}' /tmp/hbase.tar.gz.sha512 | head -n 1 | tr 'A-F' 'a-f' || true); \
+ if [ -z "$expected_hash" ]; then \
+ expected_hash=$(awk '{for (i = 1; i <= NF; i++) if (length($i) >= 8 && $i ~ /^[0-9A-Fa-f]+$/) hash = hash $i} END {if (length(hash) >= 128) print tolower(substr(hash, 1, 128))}' /tmp/hbase.tar.gz.sha512 || true); \
+ fi; \
+ if [ -n "$expected_hash" ]; then \
+ actual_hash=$(sha512sum /tmp/hbase.tar.gz | awk '{print $1}'); \
+ if [ "$expected_hash" = "$actual_hash" ]; then \
+ echo "SHA512 verified OK"; \
+ else \
+ echo "ERROR: SHA512 mismatch"; \
+ echo " Expected: $expected_hash"; \
+ echo " Actual: $actual_hash"; \
+ exit 1; \
+ fi; \
+ else \
+ if [ "${ALLOW_UNVERIFIED_DOWNLOAD}" = "true" ]; then \
+ echo "WARNING: Could not parse SHA512 file (ALLOW_UNVERIFIED_DOWNLOAD=true)"; \
+ else \
+ echo "ERROR: Could not parse SHA512 file"; \
+ exit 1; \
+ fi; \
+ fi; \
+ else \
+ if [ "${ALLOW_UNVERIFIED_DOWNLOAD}" = "true" ]; then \
+ echo "WARNING: Could not download SHA512 file (ALLOW_UNVERIFIED_DOWNLOAD=true)"; \
+ else \
+ echo "ERROR: Could not download SHA512 file"; \
+ exit 1; \
+ fi; \
+ fi; \
+ tar -xzf /tmp/hbase.tar.gz -C /opt; \
+ mv /opt/hbase-${HBASE_VERSION} ${HBASE_HOME}; \
+ rm -f /tmp/hbase.tar.gz /tmp/hbase.tar.gz.sha512
+
+# hbase-site.xml: standalone mode, znode=/hbase (matches hugegraph.properties)
+COPY hbase-site.xml ${HBASE_HOME}/conf/hbase-site.xml
+
+# Entrypoint: start HBase then tail the master log
+COPY entrypoint.sh /entrypoint.sh
+RUN chmod +x /entrypoint.sh
+
+EXPOSE 2181 16000 16010 16020 16030
+
+ENTRYPOINT ["/entrypoint.sh"]
+
diff --git a/docker/hbase/README.md b/docker/hbase/README.md
new file mode 100644
index 0000000000..fd72514602
--- /dev/null
+++ b/docker/hbase/README.md
@@ -0,0 +1,303 @@
+# HugeGraph + HBase Backend
+
+This guide covers running HugeGraph with HBase backend.
+
+> All commands below run from the repository root (this project folder).
+
+Use this once at the start of your terminal session:
+
+```bash
+ROOT_DIR="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
+cd "$ROOT_DIR"
+```
+
+---
+
+## Quick Start Paths (Choose One)
+
+
+Option 1: Standalone HugeGraph (using start-hugegraph.sh)
+
+Prerequisite: build local artifact first.
+mvn clean package -DskipTests
+```
+cd "$ROOT_DIR"
+```
+
+```bash
+# 1) Start HBase
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml down -v
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml build --no-cache hbase
+HBASE_MASTER_HOSTNAME=localhost HBASE_REGIONSERVER_HOSTNAME=localhost \
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml up -d
+until docker exec hg-hbase-test nc -z localhost 2181 >/dev/null 2>&1; do sleep 2; done
+echo "HBase ZooKeeper is reachable on 2181"
+# Optional troubleshooting stream:
+# docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml logs -f hbase
+```
+```bash
+# 2) Configure HugeGraph (standalone runtime)
+SERVER_DIR="$(find . -maxdepth 4 -type d -path './hugegraph-server/apache-hugegraph-server-*' | head -n 1)"
+[ -n "$SERVER_DIR" ] || { echo "Build artifact not found"; exit 1; }
+CONF="$SERVER_DIR/conf/graphs/hugegraph.properties"
+
+perl -pi -e 's/^backend=.*/backend=hbase/' "$CONF"
+perl -pi -e 's/^serializer=.*/serializer=hbase/' "$CONF"
+perl -pi -e 's/^#(hbase\.hosts=.*)/$1/' "$CONF"
+perl -pi -e 's/^#(hbase\.port=.*)/$1/' "$CONF"
+perl -pi -e 's/^#(hbase\.znode_parent=.*)/$1/' "$CONF"
+perl -pi -e 's/^hbase\.hosts=.*/hbase.hosts=localhost/' "$CONF"
+perl -pi -e 's/^hbase\.port=.*/hbase.port=2181/' "$CONF"
+perl -pi -e 's|^hbase\.znode_parent=.*|hbase.znode_parent=/hbase|' "$CONF"
+
+grep -E '^(backend|serializer|hbase\.)' "$CONF"
+```
+
+```bash
+# 3) Init and start server
+cd "$SERVER_DIR"
+printf 'pa\npa\n' | ./bin/init-store.sh
+./bin/start-hugegraph.sh
+
+# 4) Verify backend logs mention hbase
+cd "$ROOT_DIR"
+grep -Eai 'hbase|rocksdb|hstore' "$SERVER_DIR"/logs/*.log | tail -n 30
+```
+
+
+
+
+Option 2: Docker HugeGraph (fully containerized)
+
+```
+cd "$ROOT_DIR"
+```
+
+```bash
+# 1) Start HBase
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml down -v
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml build --no-cache hbase
+HBASE_HOSTNAME=hbase docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml up -d
+until docker exec hg-hbase-test nc -z localhost 2181 >/dev/null 2>&1; do sleep 2; done
+echo "HBase ZooKeeper is reachable on 2181"
+# Optional troubleshooting stream:
+# docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml logs -f hbase
+```
+
+```bash
+# 2) Build HugeGraph server image
+docker build -f hugegraph-server/Dockerfile -t hugegraph/server:dev .
+
+# 3) Resolve HBase network
+HBASE_NETWORK="$(docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{println $k}}{{end}}' hg-hbase-test | head -n 1)"
+echo "$HBASE_NETWORK"
+```
+
+```bash
+# 4) One-shot init-store
+docker rm -f hg-server-init >/dev/null 2>&1 || true
+docker run --rm --name hg-server-init \
+ --network "$HBASE_NETWORK" \
+ hugegraph/server:dev \
+ bash -lc '
+ set -euo pipefail
+ CONF=/hugegraph-server/conf/graphs/hugegraph.properties
+ perl -pi -e "s/^backend=.*/backend=hbase/" "$CONF"
+ perl -pi -e "s/^serializer=.*/serializer=hbase/" "$CONF"
+ perl -pi -e "s/^#(hbase\.hosts=.*)/\$1/" "$CONF"
+ perl -pi -e "s/^#(hbase\.port=.*)/\$1/" "$CONF"
+ perl -pi -e "s/^#(hbase\.znode_parent=.*)/\$1/" "$CONF"
+ perl -pi -e "s/^hbase\.hosts=.*/hbase.hosts=hbase/" "$CONF"
+ perl -pi -e "s/^hbase\.port=.*/hbase.port=2181/" "$CONF"
+ perl -pi -e "s|^hbase\.znode_parent=.*|hbase.znode_parent=/hbase|" "$CONF"
+ printf "pa\npa\n" | ./bin/init-store.sh
+ '
+```
+
+```bash
+# 5) Start HugeGraph container
+docker rm -f hg-server-dev-hbase >/dev/null 2>&1 || true
+docker run -d --name hg-server-dev-hbase \
+ --network "$HBASE_NETWORK" \
+ -p 8080:8080 \
+ -p 8182:8182 \
+ hugegraph/server:dev \
+ bash -lc '
+ set -euo pipefail
+ CONF=/hugegraph-server/conf/graphs/hugegraph.properties
+ perl -pi -e "s/^backend=.*/backend=hbase/" "$CONF"
+ perl -pi -e "s/^serializer=.*/serializer=hbase/" "$CONF"
+ perl -pi -e "s/^#(hbase\.hosts=.*)/\$1/" "$CONF"
+ perl -pi -e "s/^#(hbase\.port=.*)/\$1/" "$CONF"
+ perl -pi -e "s/^#(hbase\.znode_parent=.*)/\$1/" "$CONF"
+ perl -pi -e "s/^hbase\.hosts=.*/hbase.hosts=hbase/" "$CONF"
+ perl -pi -e "s/^hbase\.port=.*/hbase.port=2181/" "$CONF"
+ perl -pi -e "s|^hbase\.znode_parent=.*|hbase.znode_parent=/hbase|" "$CONF"
+ ./bin/start-hugegraph.sh -t 120
+ tail -f /hugegraph-server/logs/hugegraph-server.log
+ '
+```
+
+```bash
+# 6) Verify hbase backend
+docker exec hg-server-dev-hbase bash -lc "grep -E '^(backend|serializer|hbase\.)' /hugegraph-server/conf/graphs/hugegraph.properties"
+docker exec hg-server-dev-hbase bash -lc "grep -Ei 'hbase|rocksdb|hstore' /hugegraph-server/logs/*.log | tail -n 30"
+```
+
+
+
+After either path is up, run the shared tests below.
+
+---
+
+## Common Testing Steps
+
+### Apache HugeGraph Persistent Runbook (REST Engine)
+
+### Prerequisites and Constants
+
+- Base URL: `http://localhost:8080`
+- Graph target name: `hugegraph`
+- Storage backend: persistent (HBase/Cassandra/RocksDB)
+
+---
+
+### Step 1: Purge Database (Fresh Restart)
+
+Wipe any conflicting test records and data schema.
+
+```bash
+curl -X DELETE "http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/clear?confirm_message=I%27m+sure+to+delete+all+data"
+```
+
+Status `204 No Content` confirms success.
+
+---
+
+### Step 2: Provision Structural Schema
+
+1) Register property keys:
+
+```bash
+curl -X POST -H "Content-Type: application/json" \
+ -d '{"name": "name", "data_type": "TEXT", "cardinality": "SINGLE"}' \
+ "http://localhost:8080/graphs/hugegraph/schema/propertykeys"
+```
+
+2) Register vertex label (PRIMARY_KEY):
+
+```bash
+curl -X POST -H "Content-Type: application/json" \
+ -d '{"name": "person", "id_strategy": "PRIMARY_KEY", "properties": ["name"], "primary_keys": ["name"]}' \
+ "http://localhost:8080/graphs/hugegraph/schema/vertexlabels"
+```
+
+3) Register edge label:
+
+```bash
+curl -X POST -H "Content-Type: application/json" \
+ -d '{"name": "knows", "source_label": "person", "target_label": "person", "properties": []}' \
+ "http://localhost:8080/graphs/hugegraph/schema/edgelabels"
+```
+
+---
+
+### Step 3: Populate Graph Elements
+
+1) Batch write vertices (Alice and Bob):
+
+```bash
+curl -X POST -H "Content-Type: application/json" \
+ -d '[{"label": "person", "properties": {"name": "Alice"}}, {"label": "person", "properties": {"name": "Bob"}}]' \
+ "http://localhost:8080/graphs/hugegraph/graph/vertices/batch"
+```
+
+Response should include IDs similar to `1:Alice` and `1:Bob`.
+
+2) Create directed edge (Alice knows Bob):
+
+```bash
+curl -X POST -H "Content-Type: application/json" \
+ -d '{"label": "knows", "outV": "1:Alice", "inV": "1:Bob", "properties": {}}' \
+ "http://localhost:8080/graphs/hugegraph/graph/edges"
+```
+
+---
+
+### Step 4: Synchronous Verification and Traversal
+
+1) Verify target K-hop output:
+
+```bash
+curl -s "http://localhost:8080/graphs/hugegraph/traversers/kout?source=%221:Alice%22&direction=OUT&max_depth=1"
+```
+
+Expected output: `{"vertices":["1:Bob"]}`
+
+2) Verify relation path structure:
+
+```bash
+curl -s "http://localhost:8080/graphs/hugegraph/traversers/rays?source=%221:Alice%22&direction=OUT&label=knows&max_depth=1"
+```
+
+Expected output contains: `rays":[{"objects":["1:Alice","1:Bob"]}]`
+
+---
+
+### Troubleshooting Cheat Sheet
+
+- URI syntax error: do not append literal `"` inside bare URLs. Use URL-encoded values (`%22`).
+- Property missing errors: prefer native `/traversers/*` APIs for synchronous reads.
+
+---
+
+## Cleanup
+
+Run cleanup only after testing is complete.
+
+### Standalone HugeGraph + Docker HBase
+
+```bash
+cd "$SERVER_DIR" && ./bin/stop-hugegraph.sh
+cd "$ROOT_DIR"
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml down -v
+```
+
+### Docker HugeGraph + Docker HBase
+
+```bash
+docker rm -f hg-server-init >/dev/null 2>&1 || true
+docker rm -f hg-server-dev-hbase
+docker compose -p hg-hbase -f docker/hbase/docker-compose.hbase.yml down -v
+```
+
+---
+
+## Troubleshooting
+
+| Symptom | Fix |
+|---|---|
+| `UnknownHostException: hbase:16000` | HugeGraph container is not on same Docker network as HBase. Verify `HBASE_NETWORK` and `--network`. |
+| RocksDB logs in server output | `backend=rocksdb` still active; re-run backend config and restart. |
+| `TableNotFoundException` on API calls | Tables not initialized; re-run `init-store.sh` from selected path. |
+| Port 8182 already in use | `lsof -i :8182` then `kill `. |
+| HBase container not starting | Check `lsof -i :2181`; increase Docker memory to >= 4 GB. |
+
+---
+
+## Verification Checklist
+
+- [ ] `backend=hbase` in `hugegraph.properties`
+- [ ] Server logs show HBase client messages (not RocksDB/HStore)
+- [ ] HBase tables exist in `default_hugegraph:*`
+- [ ] REST runbook queries return expected graph data
+- [ ] Data survives server restart
+
+---
+
+## References
+
+- HBase official docs: https://hbase.apache.org/
+- HugeGraph HBase backend: `hugegraph-server/hugegraph-hbase/`
+- HBase Docker Compose: `docker/hbase/docker-compose.hbase.yml`
+- HBase Docker config: `docker/hbase/hbase-site.xml`
diff --git a/docker/hbase/docker-compose.hbase.yml b/docker/hbase/docker-compose.hbase.yml
new file mode 100644
index 0000000000..c5266844c5
--- /dev/null
+++ b/docker/hbase/docker-compose.hbase.yml
@@ -0,0 +1,79 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# HBase standalone for local HugeGraph HBase backend development & testing.
+#
+# Usage:
+# Start: docker compose -f docker/hbase/docker-compose.hbase.yml up -d
+# Standalone HugeGraph on host:
+# HBASE_MASTER_HOSTNAME=localhost HBASE_REGIONSERVER_HOSTNAME=localhost \
+# docker compose -f docker/hbase/docker-compose.hbase.yml up -d
+# Wait: until docker exec hg-hbase-test nc -z localhost 2181; do sleep 2; done
+# Verify: nc -z localhost 2181 && echo "ZooKeeper OK"
+# Test: mvn test -pl hugegraph-server/hugegraph-test -am -P core-test,hbase
+# Stop: docker compose -f docker/hbase/docker-compose.hbase.yml down -v
+#
+# HugeGraph test config (hugegraph-server/hugegraph-test/src/main/resources/hugegraph.properties):
+# hbase.hosts=localhost
+# hbase.port=2181
+# hbase.znode_parent=/hbase
+#
+# Ports exposed to host:
+# 2181 - ZooKeeper (HBase embedded)
+# 16000 - HBase Master RPC
+# 16010 - HBase Master Web UI -> http://localhost:16010
+# 16020 - HBase RegionServer RPC
+# 16030 - HBase RegionServer Web UI -> http://localhost:16030
+
+services:
+ hbase:
+ build:
+ context: .
+ dockerfile: Dockerfile
+ args:
+ HBASE_VERSION: "2.6.5"
+ # Optional overrides for flaky networks/corporate mirrors.
+ HBASE_PRIMARY_URL: "${HBASE_PRIMARY_URL:-https://downloads.apache.org/hbase/2.6.5/hbase-2.6.5-bin.tar.gz}"
+ HBASE_FALLBACK_URL: "${HBASE_FALLBACK_URL:-https://archive.apache.org/dist/hbase/2.6.5/hbase-2.6.5-bin.tar.gz}"
+ image: hugegraph/hbase:2.6.5
+ container_name: hg-hbase-test
+ hostname: "${HBASE_HOSTNAME:-hbase}"
+ environment:
+ HBASE_HOSTNAME: "${HBASE_HOSTNAME:-hbase}"
+ HBASE_MASTER_HOSTNAME: "${HBASE_MASTER_HOSTNAME:-}"
+ HBASE_REGIONSERVER_HOSTNAME: "${HBASE_REGIONSERVER_HOSTNAME:-}"
+ ports:
+ - "2181:2181" # ZooKeeper (matches hbase.port in hugegraph.properties)
+ - "16000:16000" # Master RPC
+ - "16010:16010" # Master Web UI -> http://localhost:16010
+ - "16020:16020" # RegionServer RPC
+ - "16030:16030" # RegionServer Web UI -> http://localhost:16030
+ volumes:
+ - hbase-data:/tmp/hbase
+ - hbase-zk-data:/tmp/zookeeper
+ healthcheck:
+ # nc -z confirms ZooKeeper is accepting connections
+ test: ["CMD", "nc", "-z", "localhost", "2181"]
+ interval: 10s
+ timeout: 10s
+ retries: 15
+ start_period: 90s
+ restart: unless-stopped
+
+volumes:
+ hbase-data:
+ hbase-zk-data:
+
+
diff --git a/docker/hbase/entrypoint.sh b/docker/hbase/entrypoint.sh
new file mode 100644
index 0000000000..72cfd38134
--- /dev/null
+++ b/docker/hbase/entrypoint.sh
@@ -0,0 +1,99 @@
+#!/bin/bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+set -e
+
+HBASE_HOSTNAME="${HBASE_HOSTNAME:-hbase}"
+HBASE_MASTER_HOSTNAME="${HBASE_MASTER_HOSTNAME:-${HBASE_HOSTNAME}}"
+HBASE_REGIONSERVER_HOSTNAME="${HBASE_REGIONSERVER_HOSTNAME:-${HBASE_HOSTNAME}}"
+HBASE_SITE_XML="${HBASE_HOME}/conf/hbase-site.xml"
+
+escape_sed_replacement() {
+ local value="$1"
+ if [[ "$value" == *$'\n'* ]]; then
+ echo "Property values must not contain newlines" >&2
+ exit 1
+ fi
+ printf '%s' "$value" | sed -e 's/[\\&|]/\\&/g'
+}
+
+set_xml_property_value() {
+ local property_name="$1"
+ local property_value
+ property_value=$(escape_sed_replacement "$2")
+
+ # The in-place replacement below expects the standard HBase layout where
+ # ... is followed by ... on the next line.
+ # Fail loudly if the property entry is missing to avoid silent misconfig.
+ if ! grep -Fq "${property_name} " "${HBASE_SITE_XML}"; then
+ echo "Missing required property '${property_name}' in ${HBASE_SITE_XML}" >&2
+ exit 1
+ fi
+
+ sed -i "/${property_name//./\\.}<\\/name>/ {n; s|.* |${property_value} |;}" "${HBASE_SITE_XML}"
+}
+
+set_xml_property_value "hbase.master.hostname" "${HBASE_MASTER_HOSTNAME}"
+set_xml_property_value "hbase.regionserver.hostname" "${HBASE_REGIONSERVER_HOSTNAME}"
+
+echo "Starting HBase ${HBASE_VERSION} standalone..."
+echo "HBase container hostname fallback: ${HBASE_HOSTNAME}"
+echo "HBase advertised master hostname: ${HBASE_MASTER_HOSTNAME}"
+echo "HBase advertised regionserver hostname: ${HBASE_REGIONSERVER_HOSTNAME}"
+
+
+# Start services explicitly to avoid SSH-based helper assumptions in containers
+${HBASE_HOME}/bin/hbase-daemon.sh start zookeeper
+${HBASE_HOME}/bin/hbase-daemon.sh start master
+${HBASE_HOME}/bin/hbase-daemon.sh start regionserver
+
+echo "HBase started. Waiting for ZooKeeper on port 2181..."
+zk_attempts=0
+until nc -z localhost 2181; do
+ zk_attempts=$((zk_attempts + 1))
+ if [ "$zk_attempts" -ge 120 ]; then
+ echo "Timed out waiting for ZooKeeper on 2181"
+ ${HBASE_HOME}/bin/hbase-daemon.sh status || true
+ exit 1
+ fi
+ sleep 1
+done
+echo "ZooKeeper is ready."
+
+echo "Waiting for HBase Master..."
+master_attempts=0
+until echo "status 'simple'" | ${HBASE_HOME}/bin/hbase shell -n 2>/dev/null | grep -E -q "([1-9][0-9]*[[:space:]]+live[[:space:]]+servers|[1-9][0-9]*[[:space:]]+servers|servers:[[:space:]]*[1-9])"; do
+ master_attempts=$((master_attempts + 1))
+ if [ "$master_attempts" -ge 180 ]; then
+ echo "Timed out waiting for HBase master/regionserver readiness"
+ ${HBASE_HOME}/bin/hbase-daemon.sh status || true
+ tail -n 80 ${HBASE_HOME}/logs/hbase-*.out ${HBASE_HOME}/logs/hbase-*.log \
+ 2>/dev/null || true
+ exit 1
+ fi
+ sleep 3
+done
+echo "HBase is ready. Master + RegionServer online."
+
+# Tail all daemon logs so `docker logs` includes startup/runtime issues
+shopt -s nullglob
+log_files=("${HBASE_HOME}/logs"/hbase-*.out "${HBASE_HOME}/logs"/hbase-*.log)
+if [ ${#log_files[@]} -gt 0 ]; then
+ exec tail -F "${log_files[@]}"
+fi
+exec tail -f /dev/null
+
diff --git a/docker/hbase/hbase-site.xml b/docker/hbase/hbase-site.xml
new file mode 100644
index 0000000000..41a555d0ab
--- /dev/null
+++ b/docker/hbase/hbase-site.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+ hbase.rootdir
+ file:///tmp/hbase
+
+
+
+ hbase.zookeeper.property.dataDir
+ /tmp/zookeeper
+
+
+
+ hbase.zookeeper.quorum
+ localhost
+
+
+ hbase.zookeeper.property.clientPort
+ 2181
+
+
+
+ hbase.zookeeper.property.maxClientCnxns
+ 0
+
+
+
+ zookeeper.znode.parent
+ /hbase
+
+
+
+ hbase.zookeeper.property.tickTime
+ 6000
+
+
+ zookeeper.session.timeout
+ 180000
+
+
+
+ hbase.cluster.distributed
+ true
+
+
+
+ hbase.wal.provider
+ filesystem
+
+
+ hbase.unsafe.stream.capability.enforce
+ false
+
+
+ hbase.master.hostname
+ localhost
+
+
+ hbase.regionserver.hostname
+ localhost
+
+
+ hbase.master.ipc.address
+ 0.0.0.0
+
+
+ hbase.regionserver.ipc.address
+ 0.0.0.0
+
+
+
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-dist/pom.xml b/hugegraph-cluster-test/hugegraph-clustertest-dist/pom.xml
index 7ec79efba0..e318f06bd0 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-dist/pom.xml
+++ b/hugegraph-cluster-test/hugegraph-clustertest-dist/pom.xml
@@ -1,19 +1,19 @@
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/hugegraph.properties.template b/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/hugegraph.properties.template
index 2a086bd325..005031fe60 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/hugegraph.properties.template
+++ b/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/hugegraph.properties.template
@@ -16,8 +16,7 @@
#
# gremlin entrance to create graph
-# auth config: org.apache.hugegraph.auth.HugeFactoryAuthProxy
-gremlin.graph=org.apache.hugegraph.HugeFactory
+gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy
# cache config
#schema.cache_capacity=100000
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/rest-server.properties.template b/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/rest-server.properties.template
index 8f4e9bf616..01744ac2c0 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/rest-server.properties.template
+++ b/hugegraph-cluster-test/hugegraph-clustertest-dist/src/assembly/static/conf/rest-server.properties.template
@@ -36,17 +36,18 @@ arthas.disabled_commands=jad
# authentication configs
# choose 'org.apache.hugegraph.auth.StandardAuthenticator' or
# 'org.apache.hugegraph.auth.ConfigAuthenticator'
-#auth.authenticator=
+auth.authenticator=org.apache.hugegraph.auth.StandardAuthenticator
+# true if using hstore mode
+usePD=true
+
+# default password
+auth.admin_pa=pa
# for StandardAuthenticator mode
#auth.graph_store=hugegraph
# auth client config
#auth.remote_url=127.0.0.1:8899,127.0.0.1:8898,127.0.0.1:8897
-# for ConfigAuthenticator mode
-#auth.admin_token=
-#auth.user_tokens=[]
-
# rpc server configs for multi graph-servers or raft-servers
rpc.server_host=127.0.0.1
rpc.server_port=$RPC_PORT$
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml
index 8feb6181f2..b59648304f 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml
+++ b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml
@@ -1,19 +1,19 @@
11
11
UTF-8
- 2.17.0
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/base/ClusterConstant.java b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/base/ClusterConstant.java
index 9120c0cf92..730bbc53ed 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/base/ClusterConstant.java
+++ b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/base/ClusterConstant.java
@@ -33,12 +33,12 @@ public class ClusterConstant {
public static final String PLUGINS_DIR = "plugins";
public static final String BIN_DIR = "bin";
public static final String CONF_DIR = "conf";
- public static final String PD_PACKAGE_PREFIX = "apache-hugegraph-pd-incubating";
+ public static final String PD_PACKAGE_PREFIX = "apache-hugegraph-pd";
public static final String PD_JAR_PREFIX = "hg-pd-service";
- public static final String STORE_PACKAGE_PREFIX = "apache-hugegraph-store-incubating";
+ public static final String STORE_PACKAGE_PREFIX = "apache-hugegraph-store";
public static final String STORE_JAR_PREFIX = "hg-store-node";
- public static final String SERVER_PACKAGE_PREFIX = "apache-hugegraph-server-incubating";
- public static final String CT_PACKAGE_PREFIX = "apache-hugegraph-ct-incubating";
+ public static final String SERVER_PACKAGE_PREFIX = "apache-hugegraph-server";
+ public static final String CT_PACKAGE_PREFIX = "apache-hugegraph-ct";
public static final String APPLICATION_FILE = "application.yml";
public static final String SERVER_PROPERTIES = "rest-server.properties";
public static final String HUGEGRAPH_PROPERTIES = "graphs/hugegraph.properties";
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/node/ServerNodeWrapper.java b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/node/ServerNodeWrapper.java
index e39bc39557..e16b96781e 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/node/ServerNodeWrapper.java
+++ b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/src/main/java/org/apache/hugegraph/ct/node/ServerNodeWrapper.java
@@ -34,15 +34,21 @@
import static org.apache.hugegraph.ct.base.ClusterConstant.SERVER_TEMPLATE_PATH;
import static org.apache.hugegraph.ct.base.ClusterConstant.isJava11OrHigher;
+import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
public class ServerNodeWrapper extends AbstractNodeWrapper {
+ private static List hgJars = loadHgJarsOnce();
public ServerNodeWrapper(int clusterIndex, int index) {
super(clusterIndex, index);
this.fileNames = new ArrayList<>(
@@ -67,6 +73,38 @@ private static void addJarsToClasspath(File directory, List classpath) {
}
}
+ private static void addOrderedJarsToClasspath(File directory, List classpath) {
+ // Add jar starts with hugegraph in proper order
+ String path = directory.getAbsolutePath();
+ for (String jar : hgJars) {
+ classpath.add(path + File.separator + jar);
+ }
+ if (directory.exists() && directory.isDirectory()) {
+ File[] files =
+ directory.listFiles((dir, name) -> name.endsWith(".jar") && !name.contains(
+ "hugegraph"));
+ if (files != null) {
+ for (File file : files) {
+ classpath.add(file.getAbsolutePath());
+ }
+ }
+ }
+ }
+
+ private static List loadHgJarsOnce(){
+ ArrayList jars = new ArrayList<>();
+ try (InputStream is = ServerNodeWrapper.class.getResourceAsStream("/jar.txt");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ jars.add(line);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return Collections.unmodifiableList(jars);
+ }
+
@Override
public void start() {
try {
@@ -79,7 +117,7 @@ public void start() {
}
List classpath = new ArrayList<>();
- addJarsToClasspath(new File(workPath + LIB_DIR), classpath);
+ addOrderedJarsToClasspath(new File(workPath + LIB_DIR), classpath);
addJarsToClasspath(new File(workPath + EXT_DIR), classpath);
addJarsToClasspath(new File(workPath + PLUGINS_DIR), classpath);
String storeClassPath = String.join(":", classpath);
@@ -87,6 +125,8 @@ public void start() {
startCmd.addAll(Arrays.asList(
"-Dname=HugeGraphServer" + this.index,
"--add-exports=java.base/jdk.internal.reflect=ALL-UNNAMED",
+ "--add-modules=jdk.unsupported",
+ "--add-exports=java.base/sun.nio.ch=ALL-UNNAMED",
"-cp", storeClassPath,
"org.apache.hugegraph.dist.HugeGraphServer",
"./conf/gremlin-server.yaml",
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml b/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml
index c888404545..735ea66b43 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml
+++ b/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml
@@ -1,19 +1,19 @@
4.13.2
compile
+
+ jakarta.ws.rs
+ jakarta.ws.rs-api
+ 3.0.0
+
+
+ org.glassfish.jersey.inject
+ jersey-hk2
+ 3.0.3
+ test
+
+
+ org.glassfish.jersey.core
+ jersey-client
+ 3.0.3
+ compile
+
@@ -92,6 +109,31 @@
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+
+
+ generate-version
+ process-resources
+
+ copy-resources
+
+
+ ${project.build.directory}/classes
+
+
+ src/main/resources
+ true
+
+ jar.txt
+
+
+
+
+
+
+
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/BaseMultiClusterTest.java b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/BaseMultiClusterTest.java
index 59394101c2..9e90933026 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/BaseMultiClusterTest.java
+++ b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/BaseMultiClusterTest.java
@@ -20,32 +20,73 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.hugegraph.SimpleClusterTest.BaseSimpleTest;
+import org.apache.hugegraph.SimpleClusterTest.BaseSimpleTest.RestClient;
import org.apache.hugegraph.ct.env.BaseEnv;
import org.apache.hugegraph.ct.env.MultiNodeEnv;
+import org.apache.hugegraph.serializer.direct.util.HugeException;
import org.junit.AfterClass;
+import org.junit.Assert;
import org.junit.BeforeClass;
+import jakarta.ws.rs.core.Response;
+
/**
* MultiNode Test generate the cluster env with 3 pd node + 3 store node + 3 server node.
* Or you can set different num of nodes by using env = new MultiNodeEnv(pdNum, storeNum, serverNum)
* All nodes are deployed in ports generated randomly, the application of nodes are stored
- * in /apache-hugegraph-ct-incubating-1.5.0, you can visit each node with rest api.
+ * in /apache-hugegraph-ct-1.7.0, you can visit each node with rest api.
*/
public class BaseMultiClusterTest {
protected static BaseEnv env;
protected static Process p;
+ protected static List clients = new ArrayList<>();
+ protected static String BASE_URL = "http://";
+ protected static final String GRAPH = "hugegraphapi";
+ protected static final String URL_PREFIX = "graphspaces/DEFAULT/graphs/" + GRAPH;
+ protected static final String SCHEMA_PKS = "/schema/propertykeys";
@BeforeClass
public static void initEnv() {
env = new MultiNodeEnv();
env.startCluster();
+ clients.clear();
+ for (String addr : env.getServerRestAddrs()) {
+ clients.add(new RestClient(BASE_URL + addr));
+ }
+ initGraph();
}
@AfterClass
public static void clearEnv() {
env.stopCluster();
+ for (RestClient client : clients) {
+ client.close();
+ }
+ }
+
+ protected static void initGraph() {
+ BaseSimpleTest.RestClient client = clients.get(0);
+ Response r = client.get(URL_PREFIX);
+ if (r.getStatus() != 200) {
+ String body = "{\n" +
+ " \"backend\": \"hstore\",\n" +
+ " \"serializer\": \"binary\",\n" +
+ " \"store\": \"hugegraphapi\",\n" +
+ " \"search.text_analyzer\": \"jieba\",\n" +
+ " \"search.text_analyzer_mode\": \"INDEX\"\n" +
+ "}";
+ r = client.post(URL_PREFIX, body);
+ if (r.getStatus() != 201) {
+ throw new HugeException(String.format(
+ "Failed to initialize graph %s %s",GRAPH, r.readEntity(String.class)
+ ));
+ }
+ }
}
protected String execCmd(String[] cmds) throws IOException {
@@ -61,4 +102,21 @@ protected String execCmd(String[] cmds) throws IOException {
p.destroy();
return builder.toString();
}
+
+ protected static String assertResponseStatus(int status,
+ Response response) {
+ String content = response.readEntity(String.class);
+ String message = String.format("Response with status %s and content %s",
+ response.getStatus(), content);
+ Assert.assertEquals(message, status, response.getStatus());
+ return content;
+ }
+
+ public static Response createAndAssert(RestClient client, String path,
+ String body,
+ int status) {
+ Response r = client.post(path, body);
+ assertResponseStatus(status, r);
+ return r;
+ }
}
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/MultiClusterDeployTest.java b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/MultiClusterDeployTest.java
index 0318df1ad0..4229fc35f5 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/MultiClusterDeployTest.java
+++ b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/MultiClusterTest/MultiClusterDeployTest.java
@@ -18,22 +18,12 @@
package org.apache.hugegraph.MultiClusterTest;
import java.io.IOException;
-import java.util.Iterator;
import java.util.List;
-import org.apache.hugegraph.driver.GraphManager;
-import org.apache.hugegraph.driver.GremlinManager;
-import org.apache.hugegraph.driver.HugeClient;
-import org.apache.hugegraph.driver.SchemaManager;
+import org.apache.hugegraph.SimpleClusterTest.BaseSimpleTest.RestClient;
import org.apache.hugegraph.pd.client.PDClient;
import org.apache.hugegraph.pd.client.PDConfig;
import org.apache.hugegraph.pd.common.PDException;
-import org.apache.hugegraph.structure.constant.T;
-import org.apache.hugegraph.structure.graph.Edge;
-import org.apache.hugegraph.structure.graph.Path;
-import org.apache.hugegraph.structure.graph.Vertex;
-import org.apache.hugegraph.structure.gremlin.Result;
-import org.apache.hugegraph.structure.gremlin.ResultSet;
import org.junit.Assert;
import org.junit.Test;
@@ -59,11 +49,6 @@ public void testStoreNodesDeployment() throws IOException {
List addrs = env.getStoreRestAddrs();
for (String addr : addrs) {
String[] cmds = {"curl", addr};
- // TODO: why not use the sb param?
- StringBuilder sb = new StringBuilder();
- for (String cmd : cmds) {
- sb.append(cmd).append(" ");
- }
String responseMsg = execCmd(cmds);
Assert.assertTrue(responseMsg.startsWith("{"));
}
@@ -71,133 +56,64 @@ public void testStoreNodesDeployment() throws IOException {
@Test
public void testServerNodesDeployment() {
- List addrs = env.getServerRestAddrs();
- for (String addr : addrs) {
- HugeClient hugeClient = HugeClient.builder("http://" + addr, "hugegraph")
- .build();
- SchemaManager schema = hugeClient.schema();
-
- schema.propertyKey("name").asText().ifNotExist().create();
- schema.propertyKey("age").asInt().ifNotExist().create();
- schema.propertyKey("city").asText().ifNotExist().create();
- schema.propertyKey("weight").asDouble().ifNotExist().create();
- schema.propertyKey("lang").asText().ifNotExist().create();
- schema.propertyKey("date").asDate().ifNotExist().create();
- schema.propertyKey("price").asInt().ifNotExist().create();
-
- schema.vertexLabel("person")
- .properties("name", "age", "city")
- .primaryKeys("name")
- .ifNotExist()
- .create();
-
- schema.vertexLabel("software")
- .properties("name", "lang", "price")
- .primaryKeys("name")
- .ifNotExist()
- .create();
-
- schema.indexLabel("personByCity")
- .onV("person")
- .by("city")
- .secondary()
- .ifNotExist()
- .create();
-
- schema.indexLabel("personByAgeAndCity")
- .onV("person")
- .by("age", "city")
- .secondary()
- .ifNotExist()
- .create();
-
- schema.indexLabel("softwareByPrice")
- .onV("software")
- .by("price")
- .range()
- .ifNotExist()
- .create();
-
- schema.edgeLabel("knows")
- .sourceLabel("person")
- .targetLabel("person")
- .properties("date", "weight")
- .ifNotExist()
- .create();
-
- schema.edgeLabel("created")
- .sourceLabel("person").targetLabel("software")
- .properties("date", "weight")
- .ifNotExist()
- .create();
-
- schema.indexLabel("createdByDate")
- .onE("created")
- .by("date")
- .secondary()
- .ifNotExist()
- .create();
-
- schema.indexLabel("createdByWeight")
- .onE("created")
- .by("weight")
- .range()
- .ifNotExist()
- .create();
-
- schema.indexLabel("knowsByWeight")
- .onE("knows")
- .by("weight")
- .range()
- .ifNotExist()
- .create();
-
- GraphManager graph = hugeClient.graph();
- Vertex marko = graph.addVertex(T.LABEL, "person", "name", "marko",
- "age", 29, "city", "Beijing");
- Vertex vadas = graph.addVertex(T.LABEL, "person", "name", "vadas",
- "age", 27, "city", "Hongkong");
- Vertex lop = graph.addVertex(T.LABEL, "software", "name", "lop",
- "lang", "java", "price", 328);
- Vertex josh = graph.addVertex(T.LABEL, "person", "name", "josh",
- "age", 32, "city", "Beijing");
- Vertex ripple = graph.addVertex(T.LABEL, "software", "name", "ripple",
- "lang", "java", "price", 199);
- Vertex peter = graph.addVertex(T.LABEL, "person", "name", "peter",
- "age", 35, "city", "Shanghai");
-
- marko.addEdge("knows", vadas, "date", "2016-01-10", "weight", 0.5);
- marko.addEdge("knows", josh, "date", "2013-02-20", "weight", 1.0);
- marko.addEdge("created", lop, "date", "2017-12-10", "weight", 0.4);
- josh.addEdge("created", lop, "date", "2009-11-11", "weight", 0.4);
- josh.addEdge("created", ripple, "date", "2017-12-10", "weight", 1.0);
- peter.addEdge("created", lop, "date", "2017-03-24", "weight", 0.2);
-
- GremlinManager gremlin = hugeClient.gremlin();
- System.out.println("==== Path ====");
- ResultSet resultSet = gremlin.gremlin("g.V().outE().path()").execute();
- Iterator results = resultSet.iterator();
- results.forEachRemaining(result -> {
- System.out.println(result.getObject().getClass());
- Object object = result.getObject();
- if (object instanceof Vertex) {
- System.out.println(((Vertex) object).id());
- } else if (object instanceof Edge) {
- System.out.println(((Edge) object).id());
- } else if (object instanceof Path) {
- List elements = ((Path) object).objects();
- elements.forEach(element -> {
- System.out.println(element.getClass());
- System.out.println(element);
- });
- } else {
- System.out.println(object);
- }
- });
-
- hugeClient.close();
- assert true;
- break;
+ for (RestClient client : clients) {
+ String path = URL_PREFIX + SCHEMA_PKS;
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"name\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"age\",\n"
+ + "\"data_type\": \"INT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"city\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"lang\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"date\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"price\",\n"
+ + "\"data_type\": \"INT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"weight\",\n"
+ + "\"data_type\": \"DOUBLE\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(client, path, "{\n"
+ + "\"name\": \"rank\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
}
}
}
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/BaseSimpleTest.java b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/BaseSimpleTest.java
index 61954de811..f0f0c33461 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/BaseSimpleTest.java
+++ b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/BaseSimpleTest.java
@@ -20,36 +20,61 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.util.Map;
import org.apache.hugegraph.ct.env.BaseEnv;
import org.apache.hugegraph.ct.env.SimpleEnv;
-import org.apache.hugegraph.driver.HugeClient;
import org.apache.hugegraph.pd.client.PDClient;
+import org.apache.hugegraph.serializer.direct.util.HugeException;
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.glassfish.jersey.client.filter.EncodingFilter;
+import org.glassfish.jersey.message.GZipEncoder;
import org.junit.AfterClass;
+import org.junit.Assert;
import org.junit.BeforeClass;
+import com.google.common.collect.Multimap;
+
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
+
/**
* Simple Test generate the cluster env with 1 pd node + 1 store node + 1 server node.
* All nodes are deployed in ports generated randomly; The application of nodes is stored
- * in /apache-hugegraph-ct-incubating-1.5.0, you can visit each node with rest api.
+ * in /apache-hugegraph-ct-1.7.0, you can visit each node with rest api.
*/
public class BaseSimpleTest {
protected static BaseEnv env;
protected static Process p;
protected static PDClient pdClient;
- protected static HugeClient hugeClient;
+
+ protected static String BASE_URL = "http://";
+ protected static final String GRAPH = "hugegraphapi";
+ protected static final String USERNAME = "admin";
+ private static final String PASSWORD = "pa";
+
+ protected static final String URL_PREFIX = "graphspaces/DEFAULT/graphs/" + GRAPH;
+ protected static final String SCHEMA_PKS = "/schema/propertykeys";
+ protected static RestClient client;
@BeforeClass
public static void initEnv() {
env = new SimpleEnv();
env.startCluster();
+ client = new RestClient(BASE_URL + env.getServerRestAddrs().get(0));
+ initGraph();
}
@AfterClass
public static void clearEnv() throws InterruptedException {
env.stopCluster();
Thread.sleep(2000);
+ client.close();
}
protected String execCmd(String[] cmds) throws IOException {
@@ -66,4 +91,101 @@ protected String execCmd(String[] cmds) throws IOException {
return builder.toString();
}
+ protected static void initGraph() {
+ Response r = client.get(URL_PREFIX);
+ if (r.getStatus() != 200) {
+ String body = "{\n" +
+ " \"backend\": \"hstore\",\n" +
+ " \"serializer\": \"binary\",\n" +
+ " \"store\": \"hugegraphapi\",\n" +
+ " \"search.text_analyzer\": \"jieba\",\n" +
+ " \"search.text_analyzer_mode\": \"INDEX\"\n" +
+ "}";
+ r = client.post(URL_PREFIX, body);
+ if (r.getStatus() != 201) {
+ throw new HugeException("Failed to create graph: " + GRAPH +
+ r.readEntity(String.class));
+ }
+ }
+ }
+
+ public static class RestClient {
+
+ private final Client client;
+ private final WebTarget target;
+
+ public RestClient(String url) {
+ this.client = ClientBuilder.newClient();
+ this.client.register(EncodingFilter.class);
+ this.client.register(GZipEncoder.class);
+ this.client.register(HttpAuthenticationFeature.basic(USERNAME,
+ PASSWORD));
+ this.target = this.client.target(url);
+ }
+
+ public void close() {
+ this.client.close();
+ }
+
+ public WebTarget target() {
+ return this.target;
+ }
+
+ public WebTarget target(String url) {
+ return this.client.target(url);
+ }
+
+ public Response get(String path) {
+ return this.target.path(path).request().get();
+ }
+
+ public Response get(String path, String id) {
+ return this.target.path(path).path(id).request().get();
+ }
+
+ public Response get(String path,
+ MultivaluedMap headers) {
+ return this.target.path(path).request().headers(headers).get();
+ }
+
+ public Response get(String path, Multimap params) {
+ WebTarget target = this.target.path(path);
+ for (Map.Entry entries : params.entries()) {
+ target = target.queryParam(entries.getKey(), entries.getValue());
+ }
+ return target.request().get();
+ }
+
+ public Response get(String path, Map params) {
+ WebTarget target = this.target.path(path);
+ for (Map.Entry i : params.entrySet()) {
+ target = target.queryParam(i.getKey(), i.getValue());
+ }
+ return target.request().get();
+ }
+
+ public Response post(String path, String content) {
+ return this.post(path, Entity.json(content));
+ }
+
+ public Response post(String path, Entity> entity) {
+ return this.target.path(path).request().post(entity);
+ }
+ }
+
+ protected static String assertResponseStatus(int status,
+ Response response) {
+ String content = response.readEntity(String.class);
+ String message = String.format("Response with status %s and content %s",
+ response.getStatus(), content);
+ Assert.assertEquals(message, status, response.getStatus());
+ return content;
+ }
+
+ public static Response createAndAssert(String path, String body,
+ int status) {
+ Response r = client.post(path, body);
+ assertResponseStatus(status, r);
+ return r;
+ }
}
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/SimpleClusterDeployTest.java b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/SimpleClusterDeployTest.java
index 61a73ff0f4..267e186f9e 100644
--- a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/SimpleClusterDeployTest.java
+++ b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/java/org/apache/hugegraph/SimpleClusterTest/SimpleClusterDeployTest.java
@@ -18,22 +18,11 @@
package org.apache.hugegraph.SimpleClusterTest;
import java.io.IOException;
-import java.util.Iterator;
import java.util.List;
-import org.apache.hugegraph.driver.GraphManager;
-import org.apache.hugegraph.driver.GremlinManager;
-import org.apache.hugegraph.driver.HugeClient;
-import org.apache.hugegraph.driver.SchemaManager;
import org.apache.hugegraph.pd.client.PDClient;
import org.apache.hugegraph.pd.client.PDConfig;
import org.apache.hugegraph.pd.common.PDException;
-import org.apache.hugegraph.structure.constant.T;
-import org.apache.hugegraph.structure.graph.Edge;
-import org.apache.hugegraph.structure.graph.Path;
-import org.apache.hugegraph.structure.graph.Vertex;
-import org.apache.hugegraph.structure.gremlin.Result;
-import org.apache.hugegraph.structure.gremlin.ResultSet;
import org.junit.Assert;
import org.junit.Test;
@@ -44,7 +33,7 @@ public void testPDNodesDeployment() {
try {
List addrs = env.getPDGrpcAddrs();
for (String addr : addrs) {
- PDConfig pdConfig = PDConfig.of(addr);
+ PDConfig pdConfig = PDConfig.of(addr, Long.MAX_VALUE);
pdClient = PDClient.create(pdConfig);
pdClient.dbCompaction();
}
@@ -59,142 +48,69 @@ public void testStoreNodesDeployment() throws IOException {
List addrs = env.getStoreRestAddrs();
for (String addr : addrs) {
String[] cmds = {"curl", addr};
- // TODO: what's the purpose of this?
- StringBuilder sb = new StringBuilder();
- for (String cmd : cmds) {
- sb.append(cmd).append(" ");
- }
String responseMsg = execCmd(cmds);
Assert.assertTrue(responseMsg.startsWith("{"));
}
}
@Test
- public void testServerNodesDeployment() {
- List addrs = env.getServerRestAddrs();
- for (String addr : addrs) {
- hugeClient = HugeClient.builder("http://" + addr, "hugegraph").build();
- SchemaManager schema = hugeClient.schema();
-
- schema.propertyKey("name").asText().ifNotExist().create();
- schema.propertyKey("age").asInt().ifNotExist().create();
- schema.propertyKey("city").asText().ifNotExist().create();
- schema.propertyKey("weight").asDouble().ifNotExist().create();
- schema.propertyKey("lang").asText().ifNotExist().create();
- schema.propertyKey("date").asDate().ifNotExist().create();
- schema.propertyKey("price").asInt().ifNotExist().create();
-
- schema.vertexLabel("person")
- .properties("name", "age", "city")
- .primaryKeys("name")
- .ifNotExist()
- .create();
-
- schema.vertexLabel("software")
- .properties("name", "lang", "price")
- .primaryKeys("name")
- .ifNotExist()
- .create();
-
- schema.indexLabel("personByCity")
- .onV("person")
- .by("city")
- .secondary()
- .ifNotExist()
- .create();
-
- schema.indexLabel("personByAgeAndCity")
- .onV("person")
- .by("age", "city")
- .secondary()
- .ifNotExist()
- .create();
-
- schema.indexLabel("softwareByPrice")
- .onV("software")
- .by("price")
- .range()
- .ifNotExist()
- .create();
-
- schema.edgeLabel("knows")
- .sourceLabel("person")
- .targetLabel("person")
- .properties("date", "weight")
- .ifNotExist()
- .create();
-
- schema.edgeLabel("created")
- .sourceLabel("person").targetLabel("software")
- .properties("date", "weight")
- .ifNotExist()
- .create();
-
- schema.indexLabel("createdByDate")
- .onE("created")
- .by("date")
- .secondary()
- .ifNotExist()
- .create();
-
- schema.indexLabel("createdByWeight")
- .onE("created")
- .by("weight")
- .range()
- .ifNotExist()
- .create();
-
- schema.indexLabel("knowsByWeight")
- .onE("knows")
- .by("weight")
- .range()
- .ifNotExist()
- .create();
-
- GraphManager graph = hugeClient.graph();
- Vertex marko = graph.addVertex(T.LABEL, "person", "name", "marko",
- "age", 29, "city", "Beijing");
- Vertex vadas = graph.addVertex(T.LABEL, "person", "name", "vadas",
- "age", 27, "city", "Hongkong");
- Vertex lop = graph.addVertex(T.LABEL, "software", "name", "lop",
- "lang", "java", "price", 328);
- Vertex josh = graph.addVertex(T.LABEL, "person", "name", "josh",
- "age", 32, "city", "Beijing");
- Vertex ripple = graph.addVertex(T.LABEL, "software", "name", "ripple",
- "lang", "java", "price", 199);
- Vertex peter = graph.addVertex(T.LABEL, "person", "name", "peter",
- "age", 35, "city", "Shanghai");
-
- marko.addEdge("knows", vadas, "date", "2016-01-10", "weight", 0.5);
- marko.addEdge("knows", josh, "date", "2013-02-20", "weight", 1.0);
- marko.addEdge("created", lop, "date", "2017-12-10", "weight", 0.4);
- josh.addEdge("created", lop, "date", "2009-11-11", "weight", 0.4);
- josh.addEdge("created", ripple, "date", "2017-12-10", "weight", 1.0);
- peter.addEdge("created", lop, "date", "2017-03-24", "weight", 0.2);
-
- GremlinManager gremlin = hugeClient.gremlin();
- System.out.println("==== Path ====");
- ResultSet resultSet = gremlin.gremlin("g.V().outE().path()").execute();
- Iterator results = resultSet.iterator();
- results.forEachRemaining(result -> {
- System.out.println(result.getObject().getClass());
- Object object = result.getObject();
- if (object instanceof Vertex) {
- System.out.println(((Vertex) object).id());
- } else if (object instanceof Edge) {
- System.out.println(((Edge) object).id());
- } else if (object instanceof Path) {
- List elements = ((Path) object).objects();
- elements.forEach(element -> {
- System.out.println(element.getClass());
- System.out.println(element);
- });
- } else {
- System.out.println(object);
- }
- });
-
- hugeClient.close();
- }
+ public void testServerNode() {
+ String path = URL_PREFIX + SCHEMA_PKS;
+ createAndAssert(path, "{\n"
+ + "\"name\": \"name\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"age\",\n"
+ + "\"data_type\": \"INT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"city\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"lang\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"date\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"price\",\n"
+ + "\"data_type\": \"INT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"weight\",\n"
+ + "\"data_type\": \"DOUBLE\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
+ createAndAssert(path, "{\n"
+ + "\"name\": \"rank\",\n"
+ + "\"data_type\": \"TEXT\",\n"
+ + "\"cardinality\": \"SINGLE\",\n"
+ + "\"check_exist\": false,\n"
+ + "\"properties\":[]\n"
+ + "}", 202);
}
}
diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/resources/jar.txt b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/resources/jar.txt
new file mode 100644
index 0000000000..7a566545ce
--- /dev/null
+++ b/hugegraph-cluster-test/hugegraph-clustertest-test/src/main/resources/jar.txt
@@ -0,0 +1,14 @@
+hugegraph-api-${revision}.jar
+hugegraph-cassandra-${revision}.jar
+hugegraph-common-${revision}.jar
+hugegraph-core-${revision}.jar
+hugegraph-dist-${revision}.jar
+hugegraph-hbase-${revision}.jar
+hugegraph-hstore-${revision}.jar
+hugegraph-mysql-${revision}.jar
+hugegraph-palo-${revision}.jar
+hugegraph-postgresql-${revision}.jar
+hugegraph-rocksdb-${revision}.jar
+hugegraph-rpc-${revision}.jar
+hugegraph-scylladb-${revision}.jar
+hugegraph-struct-${revision}.jar
diff --git a/hugegraph-cluster-test/pom.xml b/hugegraph-cluster-test/pom.xml
index fcc409d6ad..cd54ac0ffe 100644
--- a/hugegraph-cluster-test/pom.xml
+++ b/hugegraph-cluster-test/pom.xml
@@ -1,19 +1,19 @@
11
11
UTF-8
- apache-${release.name}-ct-incubating-${project.version}
+ apache-${release.name}-ct-${project.version}
diff --git a/hugegraph-commons/README.md b/hugegraph-commons/README.md
index 4ec2ebb5bb..d8cbcbc24a 100644
--- a/hugegraph-commons/README.md
+++ b/hugegraph-commons/README.md
@@ -3,8 +3,8 @@
[](https://www.apache.org/licenses/LICENSE-2.0.html)
[](https://codecov.io/gh/hugegraph/hugegraph-common)
[](https://mvnrepository.com/artifact/org.apache.hugegraph/hugegraph-common)
-[](https://github.com/apache/incubator-hugegraph-commons/actions/workflows/codeql-analysis.yml)
-[](https://github.com/apache/incubator-hugegraph-commons/actions/workflows/ci.yml)
+[](https://github.com/apache/hugegraph-commons/actions/workflows/codeql-analysis.yml)
+[](https://github.com/apache/hugegraph-commons/actions/workflows/ci.yml)
hugegraph-commons is a common module for [HugeGraph](https://github.com/apache/hugegraph) and its peripheral components.
@@ -13,7 +13,7 @@ numeric or collection util classes to simplify the development of HugeGraph and
## Components
-- Lock: atomic lock, key lock, lock group and lock manger
+- Lock: atomic lock, key lock, lock group and lock manager
- Config: register and load config option with security check
- Event: listening and notification, do something asynchronously
- Iterator: some iterators with extra functions, map, filter, extend, etc.
@@ -49,7 +49,7 @@ And here are links of other repositories:
- Note: It's recommended to use [GitHub Desktop](https://desktop.github.com/) to greatly simplify the PR and commit process.
- Thank you to all the people who already contributed to HugeGraph!
-[](https://github.com/apache/incubator-hugegraph-commons/graphs/contributors)
+[](https://github.com/apache/hugegraph-commons/graphs/contributors)
## Licence
@@ -59,8 +59,8 @@ Same as HugeGraph, hugegraph-commons are also licensed under [Apache 2.0](./LICE
---
- - [GitHub Issues](https://github.com/apache/incubator-hugegraph-commons/issues): Feedback on usage issues and functional requirements (quick response)
+ - [GitHub Issues](https://github.com/apache/hugegraph-commons/issues): Feedback on usage issues and functional requirements (quick response)
- Feedback Email: [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscriber](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) only)
- WeChat public account: Apache HugeGraph, welcome to scan this QR code to follow us.
-
+
diff --git a/hugegraph-commons/hugegraph-common/README.md b/hugegraph-commons/hugegraph-common/README.md
index 8614ba126b..bfeef03cd2 100644
--- a/hugegraph-commons/hugegraph-common/README.md
+++ b/hugegraph-commons/hugegraph-common/README.md
@@ -12,7 +12,7 @@ its components.
## Components
-- Lock: atomic lock, key lock, lock group and lock manger
+- Lock: atomic lock, key lock, lock group and lock manager
- Config: register and load config option with security check
- Event: listening and notification, do something asynchronously
- Iterator: some iterators with extra functions, map, filter, extend, etc.
diff --git a/hugegraph-commons/hugegraph-common/build.sh b/hugegraph-commons/hugegraph-common/build.sh
old mode 100644
new mode 100755
diff --git a/hugegraph-commons/hugegraph-common/pom.xml b/hugegraph-commons/hugegraph-common/pom.xml
index a57bcf59cd..6b11681716 100644
--- a/hugegraph-commons/hugegraph-common/pom.xml
+++ b/hugegraph-commons/hugegraph-common/pom.xml
@@ -28,7 +28,7 @@
hugegraph-common
${project.artifactId}
- https://github.com/apache/incubator-hugegraph-commons/tree/master/hugegraph-common
+ https://github.com/apache/hugegraph-commons/tree/master/hugegraph-common
hugegraph-common is a common module for HugeGraph and its peripheral components.
hugegraph-common encapsulates locks, configurations, events, iterators, rest and some
@@ -223,6 +223,14 @@
org.projectlombok
lombok
+
+
+
+
+ io.github.jbellis
+ jvector
+ 3.0.6
+
diff --git a/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/ConfigOption.java b/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/ConfigOption.java
index 159f13901f..cffef28f19 100644
--- a/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/ConfigOption.java
+++ b/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/ConfigOption.java
@@ -20,6 +20,22 @@
import com.google.common.base.Predicate;
public class ConfigOption extends TypedOption {
+ private boolean urlNormalize = false;
+ private String defaultScheme = null;
+
+ public ConfigOption withUrlNormalization(String scheme) {
+ this.urlNormalize = true;
+ this.defaultScheme = scheme;
+ return this;
+ }
+
+ public boolean needsUrlNormalization() {
+ return this.urlNormalize;
+ }
+
+ public String getDefaultScheme() {
+ return this.defaultScheme;
+ }
public ConfigOption(String name, String desc, T value) {
this(name, desc, null, value);
diff --git a/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/HugeConfig.java b/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/HugeConfig.java
index 4837154563..9f9ecdea4d 100644
--- a/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/HugeConfig.java
+++ b/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/config/HugeConfig.java
@@ -43,6 +43,9 @@ public class HugeConfig extends PropertiesConfiguration {
private static final Logger LOG = Log.logger(HugeConfig.class);
+ // Cache for URL normalization metadata (populated lazily per key)
+ private static final Map URL_NORMALIZATIONS = new HashMap<>();
+
private String configPath;
public HugeConfig(Configuration config) {
@@ -87,9 +90,17 @@ private void setLayoutIfNeeded(Configuration conf) {
@SuppressWarnings("unchecked")
public R get(TypedOption option) {
Object value = this.getProperty(option.name());
+ boolean fromDefault = false;
+
if (value == null) {
- return option.defaultValue();
+ value = option.defaultValue();
+ fromDefault = true;
}
+
+ if (!fromDefault) {
+ value = normalizeUrlOptionIfNeeded(option.name(), value);
+ }
+
return (R) value;
}
@@ -213,4 +224,86 @@ private static Configuration loadConfigFile(File configFile) {
e, configFile);
}
}
+
+ private static Object normalizeUrlOptionIfNeeded(String key, Object value) {
+ if (value == null) {
+ return null;
+ }
+
+ String scheme = defaultSchemeFor(key);
+ if (scheme == null) {
+ return value;
+ }
+
+ // Normalize URL options if configured with .withUrlNormalization()
+ if (value instanceof String) {
+ String original = (String) value;
+ String normalized = prefixSchemeIfMissing(original, scheme);
+
+ if (!original.equals(normalized)) {
+ LOG.warn("Config '{}' is missing scheme, auto-corrected to '{}'",
+ key, normalized);
+ }
+
+ return normalized;
+ }
+
+ // If it ever hits here, it means config storage returned a non-string type;
+ // leave it unchanged (safer than forcing toString()).
+ return value;
+ }
+
+ private static String defaultSchemeFor(String key) {
+ // Check if we already cached this key's scheme
+ if (URL_NORMALIZATIONS.containsKey(key)) {
+ return URL_NORMALIZATIONS.get(key);
+ }
+
+ // We don't know yet - look it up NOW from OptionSpace
+ synchronized (URL_NORMALIZATIONS) {
+ // Double-check after acquiring lock
+ if (URL_NORMALIZATIONS.containsKey(key)) {
+ return URL_NORMALIZATIONS.get(key);
+ }
+
+ // Look up the option from OptionSpace
+ TypedOption, ?> option = OptionSpace.get(key);
+ String scheme = null;
+
+ if (option instanceof ConfigOption) {
+ ConfigOption> configOption = (ConfigOption>) option;
+ if (configOption.needsUrlNormalization()) {
+ scheme = configOption.getDefaultScheme();
+ }
+ }
+
+ // Cache it for next time (even if null)
+ URL_NORMALIZATIONS.put(key, scheme);
+ return scheme;
+ }
+ }
+
+ private static String prefixSchemeIfMissing(String raw, String scheme) {
+ if (raw == null) {
+ return null;
+ }
+ String s = raw.trim();
+ if (s.isEmpty()) {
+ return s;
+ }
+
+ int scIdx = s.indexOf("://");
+ if (scIdx > 0) {
+ // Normalize existing scheme to lowercase while preserving the rest
+ String existingScheme = s.substring(0, scIdx).toLowerCase();
+ String rest = s.substring(scIdx + 3); // skip the "://" delimiter
+ return existingScheme + "://" + rest;
+ }
+
+ String defaultScheme = scheme == null ? "" : scheme;
+ if (!defaultScheme.isEmpty() && !defaultScheme.endsWith("://")) {
+ defaultScheme = defaultScheme + "://";
+ }
+ return defaultScheme + s;
+ }
}
diff --git a/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/event/EventHub.java b/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/event/EventHub.java
index b37c67133b..fbdf460a96 100644
--- a/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/event/EventHub.java
+++ b/hugegraph-commons/hugegraph-common/src/main/java/org/apache/hugegraph/event/EventHub.java
@@ -149,7 +149,27 @@ public int unlisten(String event, EventListener listener) {
return count;
}
+ /**
+ * Notify all registered listeners for {@code event} EXCEPT
+ * {@code ignoredListener}. ANY_EVENT listeners are notified unless they
+ * are the ignored one.
+ *
+ * @return a Future resolving to the count of listeners actually
+ * invoked (the ignored listener is NOT counted)
+ */
+ public Future notifyExcept(String event,
+ EventListener ignoredListener,
+ @Nullable Object... args) {
+ return this.notify(event, ignoredListener, args);
+ }
+
public Future notify(String event, @Nullable Object... args) {
+ return this.notify(event, null, args);
+ }
+
+ private Future notify(String event,
+ EventListener ignoredListener,
+ @Nullable Object... args) {
@SuppressWarnings("resource")
ExtendableIterator all = new ExtendableIterator<>();
@@ -173,8 +193,12 @@ public Future notify(String event, @Nullable Object... args) {
int count = 0;
// Notify all listeners, and ignore the results
while (all.hasNext()) {
+ EventListener listener = all.next();
+ if (listener == ignoredListener) {
+ continue;
+ }
try {
- all.next().event(ev);
+ listener.event(ev);
count++;
} catch (Throwable e) {
LOG.warn("Failed to handle event: {}", ev, e);
diff --git a/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/event/EventHubTest.java b/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/event/EventHubTest.java
index dff0227022..69472bc8e3 100644
--- a/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/event/EventHubTest.java
+++ b/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/event/EventHubTest.java
@@ -388,6 +388,43 @@ public void testEventNotifyWithArg2() {
Assert.assertEquals(1, count.get());
}
+ @Test
+ public void testNotifyExcept() throws Exception {
+ final String notify = "event-notify";
+ AtomicInteger listenerACount = new AtomicInteger();
+ AtomicInteger listenerBCount = new AtomicInteger();
+ AtomicInteger listenerCCount = new AtomicInteger();
+
+ EventListener listenerA = event -> {
+ event.checkArgs(String.class);
+ Assert.assertEquals("fake-arg", event.args()[0]);
+ listenerACount.incrementAndGet();
+ return true;
+ };
+ EventListener listenerB = event -> {
+ listenerBCount.incrementAndGet();
+ return true;
+ };
+ EventListener listenerC = event -> {
+ event.checkArgs(String.class);
+ Assert.assertEquals("fake-arg", event.args()[0]);
+ listenerCCount.incrementAndGet();
+ return true;
+ };
+
+ this.eventHub.listen(notify, listenerA);
+ this.eventHub.listen(notify, listenerB);
+ this.eventHub.listen(EventHub.ANY_EVENT, listenerC);
+
+ Assert.assertEquals(2, (int) this.eventHub
+ .notifyExcept(notify, listenerB,
+ "fake-arg")
+ .get());
+ Assert.assertEquals(1, listenerACount.get());
+ Assert.assertEquals(0, listenerBCount.get());
+ Assert.assertEquals(1, listenerCCount.get());
+ }
+
@Test
public void testEventNotifyWithMultiThreads() throws InterruptedException {
final String notify = "event-notify";
diff --git a/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java
index 712aea7ab2..93a69dd8ec 100644
--- a/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java
+++ b/hugegraph-commons/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java
@@ -112,7 +112,7 @@ public void testPostWithTokenAndAllParams() {
@Test
public void testPostHttpsWithAllParams() {
- String url = "https://github.com/apache/incubator-hugegraph-doc/" +
+ String url = "https://github.com/apache/hugegraph-doc/" +
"raw/master/dist/commons/cacerts.jks";
String trustStoreFile = "src/test/resources/cacerts.jks";
BaseUnitTest.downloadFileByUrl(url, trustStoreFile);
@@ -129,7 +129,7 @@ public void testPostHttpsWithAllParams() {
@Test
public void testPostHttpsWithTokenAndAllParams() {
- String url = "https://github.com/apache/incubator-hugegraph-doc/" +
+ String url = "https://github.com/apache/hugegraph-doc/" +
"raw/master/dist/commons/cacerts.jks";
String trustStoreFile = "src/test/resources/cacerts.jks";
BaseUnitTest.downloadFileByUrl(url, trustStoreFile);
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/LICENSE b/hugegraph-commons/hugegraph-dist/release-docs/LICENSE
deleted file mode 100644
index ab02e44829..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/LICENSE
+++ /dev/null
@@ -1,338 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
-
-============================================================================
- APACHE HUGEGRAPH (Incubating) SUBCOMPONENTS:
-
- The Apache HugeGraph(Incubating) project contains subcomponents with separate copyright
- notices and license terms. Your use of the source code for the these
- subcomponents is subject to the terms and conditions of the following
- licenses.
-
-
-========================================================================
-Third party Apache 2.0 licenses
-========================================================================
-
-The following components are provided under the Apache 2.0 License.
-See licenses/ for text of these licenses.
-
- (Apache License, 2.0) Javassist (org.javassist:javassist:3.28.0-GA - http://www.javassist.org/)
- (Apache License, Version 2.0) * Apache Commons BeanUtils:- commons-beanutils:commons-beanutils:1.9.4 (https://commons.apache.org/proper/commons-beanutils/)
- (Apache License, Version 2.0) * Apache Commons Codec:- commons-codec:commons-codec:1.13 (https://commons.apache.org/proper/commons-codec/)
- (Apache License, Version 2.0) * Apache Commons Collections:- commons-collections:commons-collections:3.2.2 (http://commons.apache.org/collections/)
- (Apache License, Version 2.0) * Apache Commons Configuration:- commons-configuration:commons-configuration:1.10 (http://commons.apache.org/configuration/)- org.apache.commons:commons-configuration2:2.8.0 (https://commons.apache.org/proper/commons-configuration/)
- (Apache License, Version 2.0) * Apache Commons IO:- commons-io:commons-io:2.7 (https://commons.apache.org/proper/commons-io/)
- (Apache License, Version 2.0) * Apache Commons Lang:- org.apache.commons:commons-lang3:3.12.0 (https://commons.apache.org/proper/commons-lang/)
- (Apache License, Version 2.0) * Apache Commons Text:- org.apache.commons:commons-text:1.9 (https://commons.apache.org/proper/commons-text)
- (Apache License, Version 2.0) * Apache HttpClient:- org.apache.httpcomponents:httpclient:4.5.13 (http://hc.apache.org/httpcomponents-client)
- (Apache License, Version 2.0) * Apache HttpCore:- org.apache.httpcomponents:httpcore:4.4.13 (http://hc.apache.org/httpcomponents-core-ga)
- (Apache License, Version 2.0) * Apache Log4j API:- org.apache.logging.log4j:log4j-api:2.18.0 (https://logging.apache.org/log4j/2.x/log4j-api/)
- (Apache License, Version 2.0) * Apache Log4j Core:- org.apache.logging.log4j:log4j-core:2.18.0 (https://logging.apache.org/log4j/2.x/log4j-core/)
- (Apache License, Version 2.0) * Apache Log4j SLF4J Binding:- org.apache.logging.log4j:log4j-slf4j-impl:2.18.0 (https://logging.apache.org/log4j/2.x/log4j-slf4j-impl/)
- (Apache License, Version 2.0) * Bean Validation API:- javax.validation:validation-api:1.1.0.Final (http://beanvalidation.org)
- (Apache License, Version 2.0) * Byte Buddy (without dependencies):- net.bytebuddy:byte-buddy:1.12.1 (https://bytebuddy.net/byte-buddy)
- (Apache License, Version 2.0) * Byte Buddy agent:- net.bytebuddy:byte-buddy-agent:1.12.1 (https://bytebuddy.net/byte-buddy-agent)
- (Apache License, Version 2.0) * Commons Lang:- commons-lang:commons-lang:2.6 (http://commons.apache.org/lang/)
- (Apache License, Version 2.0) * Commons Logging:- commons-logging:commons-logging:1.1.1 (http://commons.apache.org/logging)
- (Apache License, Version 2.0) * Disruptor Framework:- com.lmax:disruptor:3.3.7 (http://lmax-exchange.github.com/disruptor)
- (Apache License, Version 2.0) * FindBugs-jsr305:- com.google.code.findbugs:jsr305:3.0.1 (http://findbugs.sourceforge.net/)
- (Apache License, Version 2.0) * Google Android Annotations Library:- com.google.android:annotations:4.1.1.4 (http://source.android.com/)
- (Apache License, Version 2.0) * Gson:- com.google.code.gson:gson:2.8.6 (https://github.com/google/gson/gson)
- (Apache License, Version 2.0) * Guava InternalFutureFailureAccess and InternalFutures:- com.google.guava:failureaccess:1.0.1 (https://github.com/google/guava/failureaccess)
- (Apache License, Version 2.0) * Guava ListenableFuture only:- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava (https://github.com/google/guava/listenablefuture)
- (Apache License, Version 2.0) * Guava: Google Core Libraries for Java:- com.google.guava:guava:30.0-jre (https://github.com/google/guava/guava)
- (Apache License, Version 2.0) * J2ObjC Annotations:- com.google.j2objc:j2objc-annotations:1.3 (https://github.com/google/j2objc/)
- (Apache License, Version 2.0) * Jackson module: Old JAXB Annotations (javax.xml.bind):- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.14.0-rc1 (https://github.com/FasterXML/jackson-modules-base)
- (Apache License, Version 2.0) * Jackson-JAXRS: JSON:- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.14.0-rc1 (https://github.com/FasterXML/jackson-jaxrs-providers/jackson-jaxrs-json-provider)
- (Apache License, Version 2.0) * Jackson-JAXRS: base:- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.14.0-rc1 (https://github.com/FasterXML/jackson-jaxrs-providers/jackson-jaxrs-base)
- (Apache License, Version 2.0) * Jackson-annotations:- com.fasterxml.jackson.core:jackson-annotations:2.14.0-rc1 (https://github.com/FasterXML/jackson)
- (Apache License, Version 2.0) * Jackson-core:- com.fasterxml.jackson.core:jackson-core:2.14.0-rc1 (https://github.com/FasterXML/jackson-core)
- (Apache License, Version 2.0) * Jackson-dataformat-YAML:- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.9.3 (https://github.com/FasterXML/jackson-dataformats-text)
- (Apache License, Version 2.0) * Joda-Time:- joda-time:joda-time:2.10.8 (https://www.joda.org/joda-time/)
- (Apache License, Version 2.0) * Netty/All-in-One:- io.netty:netty-all:4.1.42.Final (https://netty.io/netty-all/)
- (Apache License, Version 2.0) * Objenesis:- org.objenesis:objenesis:3.2 (http://objenesis.org/objenesis)
- (Apache License, Version 2.0) * OpenTracing API:- io.opentracing:opentracing-api:0.22.0 (https://github.com/opentracing/opentracing-java/opentracing-api)
- (Apache License, Version 2.0) * OpenTracing-mock:- io.opentracing:opentracing-mock:0.22.0 (https://github.com/opentracing/opentracing-java/opentracing-mock)
- (Apache License, Version 2.0) * OpenTracing-noop:- io.opentracing:opentracing-noop:0.22.0 (https://github.com/opentracing/opentracing-java/opentracing-noop)
- (Apache License, Version 2.0) * OpenTracing-util:- io.opentracing:opentracing-util:0.22.0 (https://github.com/opentracing/opentracing-java/opentracing-util)
- (Apache License, Version 2.0) * SnakeYAML:- org.yaml:snakeyaml:1.18 (http://www.snakeyaml.org)
- (Apache License, Version 2.0) * com.alipay.sofa.common:sofa-common-tools:- com.alipay.sofa.common:sofa-common-tools:1.0.12 (https://github.com/sofastack/sofa-common-tools)
- (Apache License, Version 2.0) * com.alipay.sofa:bolt:- com.alipay.sofa:bolt:1.6.2 (https://github.com/alipay/sofa-bolt)
- (Apache License, Version 2.0) * com.alipay.sofa:hessian:- com.alipay.sofa:hessian:3.3.7 (http://github.com/alipay/sofa-hessian)
- (Apache License, Version 2.0) * com.alipay.sofa:sofa-rpc-all:- com.alipay.sofa:sofa-rpc-all:5.7.6 (http://github.com/sofastack/sofa-rpc)
- (Apache License, Version 2.0) * error-prone annotations:- com.google.errorprone:error_prone_annotations:2.3.4 (http://nexus.sonatype.org/oss-repository-hosting.html/error_prone_parent/error_prone_annotations)
- (Apache License, Version 2.0) * io.grpc:grpc-api:- io.grpc:grpc-api:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * io.grpc:grpc-context:- io.grpc:grpc-context:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * io.grpc:grpc-core:- io.grpc:grpc-core:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * io.grpc:grpc-netty-shaded:- io.grpc:grpc-netty-shaded:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * io.grpc:grpc-protobuf:- io.grpc:grpc-protobuf:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * io.grpc:grpc-protobuf-lite:- io.grpc:grpc-protobuf-lite:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * io.grpc:grpc-stub:- io.grpc:grpc-stub:1.28.0 (https://github.com/grpc/grpc-java)
- (Apache License, Version 2.0) * jackson-databind:- com.fasterxml.jackson.core:jackson-databind:2.14.0-rc1 (https://github.com/FasterXML/jackson)
- (Apache License, Version 2.0) * lookout-api:- com.alipay.sofa.lookout:lookout-api:1.4.1 (https://github.com/sofastack/sofa-lookout/lookout-api)
- (Apache License, Version 2.0) * perfmark:perfmark-api:- io.perfmark:perfmark-api:0.19.0 (https://github.com/perfmark/perfmark)
- (Apache License, Version 2.0) * proto-google-common-protos:- com.google.api.grpc:proto-google-common-protos:1.17.0 (https://github.com/googleapis/api-client-staging)
- (Apache License, Version 2.0) * swagger-annotations:- io.swagger:swagger-annotations:1.5.18 (https://github.com/swagger-api/swagger-core/modules/swagger-annotations)
- (Apache License, Version 2.0) * swagger-core:- io.swagger:swagger-core:1.5.18 (https://github.com/swagger-api/swagger-core/modules/swagger-core)
- (Apache License, Version 2.0) * swagger-models:- io.swagger:swagger-models:1.5.18 (https://github.com/swagger-api/swagger-core/modules/swagger-models)
- (Apache License, Version 2.0) * tracer-core:- com.alipay.sofa:tracer-core:3.0.8 (https://projects.spring.io/spring-boot/#/spring-boot-starter-parent/sofaboot-dependencies/tracer-all-parent/tracer-core)
- (Apache License, Version 2.0) * OkHttp (com.squareup.okhttp3:okhttp:4.10.0 - https://github.com/square/okhttp)
- (Apache License, Version 2.0) * OkHttp (com.squareup.okhttp3:logging-interceptor:4.10.0 - https://github.com/square/okhttp)
-
-========================================================================
-Third party CDDL licenses
-========================================================================
-
-The following components are provided under the CDDL License.
-See licenses/ for text of these licenses.
- (CDDL) * JavaBeans Activation Framework API jar:- javax.activation:javax.activation-api:1.2.0 (http://java.net/all/javax.activation-api/)
- (CDDL 1.1) * jaxb-api:- javax.xml.bind:jaxb-api:2.3.1 (https://github.com/javaee/jaxb-spec/jaxb-api)
- (Dual license consisting of the CDDL v1.1) * Default Provider:- org.glassfish:javax.json:1.0 (http://jsonp.java.net)
-
-
-========================================================================
-Third party EPL licenses
-========================================================================
-
-The following components are provided under the EPL License.
-See licenses/ for text of these licenses.
- (Eclipse Public License - v2.0) * HK2 API module:- org.glassfish.hk2:hk2-api:3.0.1 (https://github.com/eclipse-ee4j/glassfish-hk2/hk2-api)
- (Eclipse Public License - v2.0) * HK2 Implementation Utilities:- org.glassfish.hk2:hk2-utils:3.0.1 (https://github.com/eclipse-ee4j/glassfish-hk2/hk2-utils)
- (Eclipse Public License - v2.0) * OSGi resource locator:- org.glassfish.hk2:osgi-resource-locator:1.0.3 (https://projects.eclipse.org/projects/ee4j/osgi-resource-locator)
- (Eclipse Public License - v2.0) * ServiceLocator Default Implementation:- org.glassfish.hk2:hk2-locator:3.0.1 (https://github.com/eclipse-ee4j/glassfish-hk2/hk2-locator)
- (Eclipse Public License - v2.0) * aopalliance version 1.0 repackaged as a module:- org.glassfish.hk2.external:aopalliance-repackaged:3.0.1 (https://github.com/eclipse-ee4j/glassfish-hk2/external/aopalliance-repackaged)
- (Eclipse Public License - v2.0) * JUnit:- junit:junit:4.13.1 (http://junit.org)
-
-========================================================================
-Third party EDL licenses
-========================================================================
-
-The following components are provided under the EDL License.
-See licenses/ for text of these licenses.
- (Eclipse Distribution License - v1.0) * Jakarta Activation:- com.sun.activation:jakarta.activation:2.0.1 (https://github.com/eclipse-ee4j/jaf/jakarta.activation)
- (Eclipse Distribution License - v1.0) * Jakarta Activation API jar:- jakarta.activation:jakarta.activation-api:1.2.2 (https://github.com/eclipse-ee4j/jaf/jakarta.activation-api)
- (Eclipse Distribution License - v1.0) * Old JAXB Core:- com.sun.xml.bind:jaxb-core:3.0.2 (https://eclipse-ee4j.github.io/jaxb-ri/)
- (Eclipse Distribution License - v1.0) * Old JAXB Runtime:- com.sun.xml.bind:jaxb-impl:3.0.2 (https://eclipse-ee4j.github.io/jaxb-ri/)
-
-
-========================================================================
-Third party BSD licenses
-========================================================================
-
-The following components are provided under the BSD License.
-See licenses/ for text of these licenses.
- (The 3-Clause BSD License) * Hamcrest Core:- org.hamcrest:hamcrest-core:1.3 (https://github.com/hamcrest/JavaHamcrest/hamcrest-core)
- (The 3-Clause BSD License) * Protocol Buffers [Core]:- com.google.protobuf:protobuf-java:3.11.0 (https://developers.google.com/protocol-buffers/protobuf-java/)
-
-========================================================================
-Third party MIT licenses
-========================================================================
-
-The following components are provided under the MIT License.
-See licenses/ for text of these licenses.
- (The MIT License)* Animal Sniffer Annotations:- org.codehaus.mojo:animal-sniffer-annotations:1.18 (http://www.mojohaus.org/animal-sniffer/animal-sniffer-annotations)
- (The MIT License)* Checker Qual:- org.checkerframework:checker-qual:3.5.0 (https://checkerframework.org)
- (The MIT License)* SLF4J API Module:- org.slf4j:slf4j-api:1.7.25 (http://www.slf4j.org)
- (The MIT License)* mockito-core:- org.mockito:mockito-core:4.1.0 (https://github.com/mockito/mockito)
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/NOTICE b/hugegraph-commons/hugegraph-dist/release-docs/NOTICE
deleted file mode 100644
index c021594e78..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/NOTICE
+++ /dev/null
@@ -1,935 +0,0 @@
-Apache HugeGraph(incubating)
-Copyright 2022-2024 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-The initial codebase was donated to the ASF by HugeGraph Authors, copyright 2017-2021.
-
-========================================================================
-
-commons-logging NOTICE
-
-========================================================================
-// ------------------------------------------------------------------
-// NOTICE file corresponding to the section 4d of The Apache License,
-// Version 2.0, in this case for Commons Logging
-// ------------------------------------------------------------------
-
-Commons Logging
-Copyright 2001-2007 The Apache Software Foundation
-
-This product includes/uses software(s) developed by 'an unknown organization'
- - Unnamed - avalon-framework:avalon-framework:jar:4.1.3
- - Unnamed - log4j:log4j:jar:1.2.12
- - Unnamed - logkit:logkit:jar:1.0.1
-
-
-========================================================================
-
-httpclient NOTICE
-
-========================================================================
-
-Apache HttpClient
-Copyright 1999-2020 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
-========================================================================
-
-httpcore NOTICE
-
-========================================================================
-
-Apache HttpCore
-Copyright 2005-2020 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
-========================================================================
-
-jackson-core-2.14.0 NOTICE
-
-========================================================================
-# Jackson JSON processor
-
-Jackson is a high-performance, Free/Open Source JSON processing library.
-It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
-been in development since 2007.
-It is currently developed by a community of developers.
-
-## Licensing
-
-Jackson 2.x core and extension components are licensed under Apache License 2.0
-To find the details that apply to this artifact see the accompanying LICENSE file.
-
-## Credits
-
-A list of contributors may be found from CREDITS(-2.x) file, which is included
-in some artifacts (usually source distributions); but is always available
-from the source code management (SCM) system project uses.
-========================================================================
-
-jackson-databind-2.14.0 NOTICE
-
-========================================================================
-# Jackson JSON processor
-
-Jackson is a high-performance, Free/Open Source JSON processing library.
-It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
-been in development since 2007.
-It is currently developed by a community of developers.
-
-## Licensing
-
-Jackson 2.x core and extension components are licensed under Apache License 2.0
-To find the details that apply to this artifact see the accompanying LICENSE file.
-
-## Credits
-
-A list of contributors may be found from CREDITS(-2.x) file, which is included
-in some artifacts (usually source distributions); but is always available
-from the source code management (SCM) system project uses.
-========================================================================
-
-jackson-dataformat-yaml NOTICE
-
-========================================================================
-# Jackson JSON processor
-
-Jackson is a high-performance, Free/Open Source JSON processing library.
-It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
-been in development since 2007.
-It is currently developed by a community of developers, as well as supported
-commercially by FasterXML.com.
-
-## Licensing
-
-Jackson core and extension components may be licensed under different licenses.
-To find the details that apply to this artifact see the accompanying LICENSE file.
-For more information, including possible other licensing options, contact
-FasterXML.com (http://fasterxml.com).
-
-## Credits
-
-A list of contributors may be found from CREDITS file, which is included
-in some artifacts (usually source distributions); but is always available
-from the source code management (SCM) system project uses.
-========================================================================
-
-jackson-jaxrs-json-provider-2.14.0 NOTICE
-
-========================================================================
-# Jackson JSON processor
-
-Jackson is a high-performance, Free/Open Source JSON processing library.
-It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
-been in development since 2007.
-It is currently developed by a community of developers, as well as supported
-commercially by FasterXML.com.
-
-## Licensing
-
-Jackson core and extension components may be licensed under different licenses.
-To find the details that apply to this artifact see the accompanying LICENSE file.
-For more information, including possible other licensing options, contact
-FasterXML.com (http://fasterxml.com).
-
-## Credits
-
-A list of contributors may be found from CREDITS file, which is included
-in some artifacts (usually source distributions); but is always available
-from the source code management (SCM) system project uses.
-========================================================================
-
-jackson-module-jaxb-annotations-2.14.0 NOTICE
-
-========================================================================
-# Jackson JSON processor
-
-Jackson is a high-performance, Free/Open Source JSON processing library.
-It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
-been in development since 2007.
-It is currently developed by a community of developers, as well as supported
-commercially by FasterXML.com.
-
-## Licensing
-
-Jackson core and extension components may licensed under different licenses.
-To find the details that apply to this artifact see the accompanying LICENSE file.
-For more information, including possible other licensing options, contact
-FasterXML.com (http://fasterxml.com).
-
-## Credits
-
-A list of contributors may be found from CREDITS file, which is included
-in some artifacts (usually source distributions); but is always available
-from the source code management (SCM) system project uses.
-========================================================================
-
-log4j-api NOTICE
-
-========================================================================
-
-Apache Log4j API
-Copyright 1999-2022 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
-========================================================================
-
-log4j-core NOTICE
-
-========================================================================
-Apache Log4j Core
-Copyright 1999-2012 Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-ResolverUtil.java
-Copyright 2005-2006 Tim Fennell
-
-========================================================================
-
-log4j-slf4j-impl NOTICE
-
-========================================================================
-
-Apache Log4j SLF4J Binding
-Copyright 1999-2022 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
-========================================================================
-
-gRPC NOTICE
-
-========================================================================
-
-
-Copyright 2014 The gRPC Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
------------------------------------------------------------------------
-
-This product contains a modified portion of 'OkHttp', an open source
-HTTP & SPDY client for Android and Java applications, which can be obtained
-at:
-
- * LICENSE:
- * okhttp/third_party/okhttp/LICENSE (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/square/okhttp
- * LOCATION_IN_GRPC:
- * okhttp/third_party/okhttp
-
-This product contains a modified portion of 'Envoy', an open source
-cloud-native high-performance edge/middle/service proxy, which can be
-obtained at:
-
- * LICENSE:
- * xds/third_party/envoy/LICENSE (Apache License 2.0)
- * NOTICE:
- * xds/third_party/envoy/NOTICE
- * HOMEPAGE:
- * https://www.envoyproxy.io
- * LOCATION_IN_GRPC:
- * xds/third_party/envoy
-
-This product contains a modified portion of 'protoc-gen-validate (PGV)',
-an open source protoc plugin to generate polyglot message validators,
-which can be obtained at:
-
- * LICENSE:
- * xds/third_party/protoc-gen-validate/LICENSE (Apache License 2.0)
- * NOTICE:
- * xds/third_party/protoc-gen-validate/NOTICE
- * HOMEPAGE:
- * https://github.com/envoyproxy/protoc-gen-validate
- * LOCATION_IN_GRPC:
- * xds/third_party/protoc-gen-validate
-
-This product contains a modified portion of 'udpa',
-an open source universal data plane API, which can be obtained at:
-
- * LICENSE:
- * xds/third_party/udpa/LICENSE (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/cncf/udpa
- * LOCATION_IN_GRPC:
- * xds/third_party/udpa
-
-========================================================================
-
-jaxb-ri NOTICE
-
-========================================================================
-# Notices for Eclipse Implementation of JAXB
-
-This content is produced and maintained by the Eclipse Implementation of JAXB
-project.
-
-* Project home: https://projects.eclipse.org/projects/ee4j.jaxb-impl
-
-## Trademarks
-
-Eclipse Implementation of JAXB is a trademark of the Eclipse Foundation.
-
-## Copyright
-
-All content is the property of the respective authors or their employers. For
-more information regarding authorship of content, please consult the listed
-source code repository logs.
-
-## Declared Project Licenses
-
-This program and the accompanying materials are made available under the terms
-of the Eclipse Distribution License v. 1.0 which is available at
-http://www.eclipse.org/org/documents/edl-v10.php.
-
-SPDX-License-Identifier: BSD-3-Clause
-
-## Source Code
-
-The project maintains the following source code repositories:
-
-* https://github.com/eclipse-ee4j/jaxb-ri
-* https://github.com/eclipse-ee4j/jaxb-istack-commons
-* https://github.com/eclipse-ee4j/jaxb-dtd-parser
-* https://github.com/eclipse-ee4j/jaxb-fi
-* https://github.com/eclipse-ee4j/jaxb-stax-ex
-* https://github.com/eclipse-ee4j/jax-rpc-ri
-
-## Third-party Content
-
-This project leverages the following third party content.
-
-Apache Ant (1.10.2)
-
-* License: Apache-2.0 AND W3C AND LicenseRef-Public-Domain
-
-Apache Ant (1.10.2)
-
-* License: Apache-2.0 AND W3C AND LicenseRef-Public-Domain
-
-Apache Felix (1.2.0)
-
-* License: Apache License, 2.0
-
-args4j (2.33)
-
-* License: MIT License
-
-dom4j (1.6.1)
-
-* License: Custom license based on Apache 1.1
-
-file-management (3.0.0)
-
-* License: Apache-2.0
-* Project: https://maven.apache.org/shared/file-management/
-* Source:
- https://svn.apache.org/viewvc/maven/shared/tags/file-management-3.0.0/
-
-JUnit (4.12)
-
-* License: Eclipse Public License
-
-JUnit (4.12)
-
-* License: Eclipse Public License
-
-maven-compat (3.5.2)
-
-* License: Apache-2.0
-* Project: https://maven.apache.org/ref/3.5.2/maven-compat/
-* Source:
- https://mvnrepository.com/artifact/org.apache.maven/maven-compat/3.5.2
-
-maven-core (3.5.2)
-
-* License: Apache-2.0
-* Project: https://maven.apache.org/ref/3.5.2/maven-core/index.html
-* Source: https://mvnrepository.com/artifact/org.apache.maven/maven-core/3.5.2
-
-maven-plugin-annotations (3.5)
-
-* License: Apache-2.0
-* Project: https://maven.apache.org/plugin-tools/maven-plugin-annotations/
-* Source:
- https://github.com/apache/maven-plugin-tools/tree/master/maven-plugin-annotations
-
-maven-plugin-api (3.5.2)
-
-* License: Apache-2.0
-
-maven-resolver-api (1.1.1)
-
-* License: Apache-2.0
-
-maven-resolver-api (1.1.1)
-
-* License: Apache-2.0
-
-maven-resolver-connector-basic (1.1.1)
-
-* License: Apache-2.0
-
-maven-resolver-impl (1.1.1)
-
-* License: Apache-2.0
-
-maven-resolver-spi (1.1.1)
-
-* License: Apache-2.0
-
-maven-resolver-transport-file (1.1.1)
-
-* License: Apache-2.0
-* Project: https://maven.apache.org/resolver/maven-resolver-transport-file/
-* Source:
- https://github.com/apache/maven-resolver/tree/master/maven-resolver-transport-file
-
-maven-resolver-util (1.1.1)
-
-* License: Apache-2.0
-
-maven-settings (3.5.2)
-
-* License: Apache-2.0
-* Source:
- https://mvnrepository.com/artifact/org.apache.maven/maven-settings/3.5.2
-
-OSGi Service Platform Core Companion Code (6.0)
-
-* License: Apache License, 2.0
-
-plexus-archiver (3.5)
-
-* License: Apache-2.0
-* Project: https://codehaus-plexus.github.io/plexus-archiver/
-* Source: https://github.com/codehaus-plexus/plexus-archiver
-
-plexus-io (3.0.0)
-
-* License: Apache-2.0
-
-plexus-utils (3.1.0)
-
-* License: Apache- 2.0 or Apache- 1.1 or BSD or Public Domain or Indiana
- University Extreme! Lab Software License V1.1.1 (Apache 1.1 style)
-
-relaxng-datatype (1.0)
-
-* License: New BSD license
-
-Sax (0.2)
-
-* License: SAX-PD
-* Project: http://www.megginson.com/downloads/SAX/
-* Source: http://sourceforge.net/project/showfiles.php?group_id=29449
-
-testng (6.14.2)
-
-* License: Apache-2.0 AND (MIT )
-* Project: https://testng.org/doc/index.html
-* Source: https://github.com/cbeust/testng
-
-wagon-http-lightweight (3.0.0)
-
-* License: Pending
-* Project: https://maven.apache.org/wagon/
-* Source:
- https://mvnrepository.com/artifact/org.apache.maven.wagon/wagon-http-lightweight/3.0.0
-
-xz for java (1.8)
-
-* License: LicenseRef-Public-Domain
-
-## Cryptography
-
-Content may contain encryption software. The country in which you are currently
-may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software,
-please check the country's laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is
-permitted.
-
-
-========================================================================
-
-Swagger Core NOTICE
-
-========================================================================
-Swagger Core - ${pom.name}
-Copyright (c) 2015. SmartBear Software Inc.
-Swagger Core - ${pom.name} is licensed under Apache 2.0 license.
-Copy of the Apache 2.0 license can be found in `LICENSE` file.
-
-
-========================================================================
-
-Joda time NOTICE
-
-========================================================================
-
-=============================================================================
-= NOTICE file corresponding to section 4d of the Apache License Version 2.0 =
-=============================================================================
-This product includes software developed by
-Joda.org (https://www.joda.org/).
-
-========================================================================
-
-Eclipse GlassFish NOTICE
-
-========================================================================
-
-# Notices for Eclipse GlassFish
-
-This content is produced and maintained by the Eclipse GlassFish project.
-
-* Project home: https://projects.eclipse.org/projects/ee4j.glassfish
-
-## Trademarks
-
-Eclipse GlassFish, and GlassFish are trademarks of the Eclipse Foundation.
-
-## Copyright
-
-All content is the property of the respective authors or their employers. For
-more information regarding authorship of content, please consult the listed
-source code repository logs.
-
-## Declared Project Licenses
-
-This program and the accompanying materials are made available under the terms
-of the Eclipse Public License v. 2.0 which is available at
-http://www.eclipse.org/legal/epl-2.0. This Source Code may also be made
-available under the following Secondary Licenses when the conditions for such
-availability set forth in the Eclipse Public License v. 2.0 are satisfied: GNU
-General Public License, version 2 with the GNU Classpath Exception which is
-available at https://www.gnu.org/software/classpath/license.html.
-
-SPDX-License-Identifier: EPL-2.0
-
-## Source Code
-
-The project maintains the following source code repositories:
-
-* https://github.com/eclipse-ee4j/glassfish-ha-api
-* https://github.com/eclipse-ee4j/glassfish-logging-annotation-processor
-* https://github.com/eclipse-ee4j/glassfish-shoal
-* https://github.com/eclipse-ee4j/glassfish-cdi-porting-tck
-* https://github.com/eclipse-ee4j/glassfish-jsftemplating
-* https://github.com/eclipse-ee4j/glassfish-hk2-extra
-* https://github.com/eclipse-ee4j/glassfish-hk2
-* https://github.com/eclipse-ee4j/glassfish-fighterfish
-
-## Third-party Content
-
-This project leverages the following third party content.
-
-None
-
-## Cryptography
-
-Content may contain encryption software. The country in which you are currently
-may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software,
-please check the country's laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is
-permitted.
-
-
-========================================================================
-
-netty NOTICE
-
-========================================================================
-
- The Netty Project
- =================
-
-Please visit the Netty web site for more information:
-
- * https://netty.io/
-
-Copyright 2014 The Netty Project
-
-The Netty Project licenses this file to you under the Apache License,
-version 2.0 (the "License"); you may not use this file except in compliance
-with the License. You may obtain a copy of the License at:
-
- https://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations
-under the License.
-
-Also, please refer to each LICENSE..txt file, which is located in
-the 'license' directory of the distribution file, for the license terms of the
-components that this product depends on.
-
--------------------------------------------------------------------------------
-This product contains the extensions to Java Collections Framework which has
-been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:
-
- * LICENSE:
- * license/LICENSE.jsr166y.txt (Public Domain)
- * HOMEPAGE:
- * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
- * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/
-
-This product contains a modified version of Robert Harder's Public Domain
-Base64 Encoder and Decoder, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.base64.txt (Public Domain)
- * HOMEPAGE:
- * http://iharder.sourceforge.net/current/java/base64/
-
-This product contains a modified portion of 'Webbit', an event based
-WebSocket and HTTP server, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.webbit.txt (BSD License)
- * HOMEPAGE:
- * https://github.com/joewalnes/webbit
-
-This product contains a modified portion of 'SLF4J', a simple logging
-facade for Java, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.slf4j.txt (MIT License)
- * HOMEPAGE:
- * https://www.slf4j.org/
-
-This product contains a modified portion of 'Apache Harmony', an open source
-Java SE, which can be obtained at:
-
- * NOTICE:
- * license/NOTICE.harmony.txt
- * LICENSE:
- * license/LICENSE.harmony.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://archive.apache.org/dist/harmony/
-
-This product contains a modified portion of 'jbzip2', a Java bzip2 compression
-and decompression library written by Matthew J. Francis. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.jbzip2.txt (MIT License)
- * HOMEPAGE:
- * https://code.google.com/p/jbzip2/
-
-This product contains a modified portion of 'libdivsufsort', a C API library to construct
-the suffix array and the Burrows-Wheeler transformed string for any input string of
-a constant-size alphabet written by Yuta Mori. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.libdivsufsort.txt (MIT License)
- * HOMEPAGE:
- * https://github.com/y-256/libdivsufsort
-
-This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM,
- which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.jctools.txt (ASL2 License)
- * HOMEPAGE:
- * https://github.com/JCTools/JCTools
-
-This product optionally depends on 'JZlib', a re-implementation of zlib in
-pure Java, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.jzlib.txt (BSD style License)
- * HOMEPAGE:
- * http://www.jcraft.com/jzlib/
-
-This product optionally depends on 'Compress-LZF', a Java library for encoding and
-decoding data in LZF format, written by Tatu Saloranta. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.compress-lzf.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/ning/compress
-
-This product optionally depends on 'lz4', a LZ4 Java compression
-and decompression library written by Adrien Grand. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.lz4.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/jpountz/lz4-java
-
-This product optionally depends on 'lzma-java', a LZMA Java compression
-and decompression library, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.lzma-java.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/jponge/lzma-java
-
-This product optionally depends on 'zstd-jni', a zstd-jni Java compression
-and decompression library, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.zstd-jni.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/luben/zstd-jni
-
-This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression
-and decompression library written by William Kinney. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.jfastlz.txt (MIT License)
- * HOMEPAGE:
- * https://code.google.com/p/jfastlz/
-
-This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data
-interchange format, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.protobuf.txt (New BSD License)
- * HOMEPAGE:
- * https://github.com/google/protobuf
-
-This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
-a temporary self-signed X.509 certificate when the JVM does not provide the
-equivalent functionality. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.bouncycastle.txt (MIT License)
- * HOMEPAGE:
- * https://www.bouncycastle.org/
-
-This product optionally depends on 'Snappy', a compression library produced
-by Google Inc, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.snappy.txt (New BSD License)
- * HOMEPAGE:
- * https://github.com/google/snappy
-
-This product optionally depends on 'JBoss Marshalling', an alternative Java
-serialization API, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.jboss-marshalling.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/jboss-remoting/jboss-marshalling
-
-This product optionally depends on 'Caliper', Google's micro-
-benchmarking framework, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.caliper.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/google/caliper
-
-This product optionally depends on 'Apache Commons Logging', a logging
-framework, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.commons-logging.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://commons.apache.org/logging/
-
-This product optionally depends on 'Apache Log4J', a logging framework, which
-can be obtained at:
-
- * LICENSE:
- * license/LICENSE.log4j.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://logging.apache.org/log4j/
-
-This product optionally depends on 'Aalto XML', an ultra-high performance
-non-blocking XML processor, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.aalto-xml.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://wiki.fasterxml.com/AaltoHome
-
-This product contains a modified version of 'HPACK', a Java implementation of
-the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.hpack.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/twitter/hpack
-
-This product contains a modified version of 'HPACK', a Java implementation of
-the HTTP/2 HPACK algorithm written by Cory Benfield. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.hyper-hpack.txt (MIT License)
- * HOMEPAGE:
- * https://github.com/python-hyper/hpack/
-
-This product contains a modified version of 'HPACK', a Java implementation of
-the HTTP/2 HPACK algorithm written by Tatsuhiro Tsujikawa. It can be obtained at:
-
- * LICENSE:
- * license/LICENSE.nghttp2-hpack.txt (MIT License)
- * HOMEPAGE:
- * https://github.com/nghttp2/nghttp2/
-
-This product contains a modified portion of 'Apache Commons Lang', a Java library
-provides utilities for the java.lang API, which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.commons-lang.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://commons.apache.org/proper/commons-lang/
-
-
-This product contains the Maven wrapper scripts from 'Maven Wrapper', that provides an easy way to ensure a user has everything necessary to run the Maven build.
-
- * LICENSE:
- * license/LICENSE.mvn-wrapper.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/takari/maven-wrapper
-
-This product contains the dnsinfo.h header file, that provides a way to retrieve the system DNS configuration on MacOS.
-This private header is also used by Apple's open source
- mDNSResponder (https://opensource.apple.com/tarballs/mDNSResponder/).
-
- * LICENSE:
- * license/LICENSE.dnsinfo.txt (Apple Public Source License 2.0)
- * HOMEPAGE:
- * https://www.opensource.apple.com/source/configd/configd-453.19/dnsinfo/dnsinfo.h
-
-This product optionally depends on 'Brotli4j', Brotli compression and
-decompression for Java., which can be obtained at:
-
- * LICENSE:
- * license/LICENSE.brotli4j.txt (Apache License 2.0)
- * HOMEPAGE:
- * https://github.com/hyperxpro/Brotli4j
-========================================================================
-
-perfmark NOTICE
-
-========================================================================
-
-Copyright 2019 Google LLC
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
------------------------------------------------------------------------
-
-This product contains a modified portion of 'Catapult', an open source
-Trace Event viewer for Chome, Linux, and Android applications, which can
-be obtained at:
-
- * LICENSE:
- * traceviewer/src/main/resources/io/perfmark/traceviewer/third_party/catapult/LICENSE (New BSD License)
- * HOMEPAGE:
- * https://github.com/catapult-project/catapult
-
-This product contains a modified portion of 'Polymer', a library for Web
-Components, which can be obtained at:
- * LICENSE:
- * traceviewer/src/main/resources/io/perfmark/traceviewer/third_party/polymer/LICENSE (New BSD License)
- * HOMEPAGE:
- * https://github.com/Polymer/polymer
-
-
-This product contains a modified portion of 'ASM', an open source
-Java Bytecode library, which can be obtained at:
-
- * LICENSE:
- * agent/src/main/resources/io/perfmark/agent/third_party/asm/LICENSE (BSD style License)
- * HOMEPAGE:
- * https://asm.ow2.io/
-========================================================================
-
-junit5 NOTICE
-
-========================================================================
-Open Source Licenses
-====================
-
-This product may include a number of subcomponents with separate
-copyright notices and license terms. Your use of the source code for
-these subcomponents is subject to the terms and conditions of the
-subcomponent's license, as noted in the LICENSE-.md
-files.
-========================================================================
-
-jaf-api NOTICE
-
-========================================================================
-
-# Notices for Jakarta Activation
-
-This content is produced and maintained by Jakarta Activation project.
-
-* Project home: https://projects.eclipse.org/projects/ee4j.jaf
-
-## Copyright
-
-All content is the property of the respective authors or their employers. For
-more information regarding authorship of content, please consult the listed
-source code repository logs.
-
-## Declared Project Licenses
-
-This program and the accompanying materials are made available under the terms
-of the Eclipse Distribution License v. 1.0,
-which is available at http://www.eclipse.org/org/documents/edl-v10.php.
-
-SPDX-License-Identifier: BSD-3-Clause
-
-## Source Code
-
-The project maintains the following source code repositories:
-
-* https://github.com/eclipse-ee4j/jaf
-========================================================================
-
-okhttp NOTICE
-
-========================================================================
-
-Note that publicsuffixes.gz is compiled from The Public Suffix List:
-https://publicsuffix.org/list/public_suffix_list.dat
-
-It is subject to the terms of the Mozilla Public License, v. 2.0:
-https://mozilla.org/MPL/2.0/
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-JavaHamcrest.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-JavaHamcrest.txt
deleted file mode 100644
index 4933bda5ba..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-JavaHamcrest.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-BSD License
-
-Copyright (c) 2000-2015 www.hamcrest.org
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list of
-conditions and the following disclaimer. Redistributions in binary form must reproduce
-the above copyright notice, this list of conditions and the following disclaimer in
-the documentation and/or other materials provided with the distribution.
-
-Neither the name of Hamcrest nor the names of its contributors may be used to endorse
-or promote products derived from this software without specific prior written
-permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
-SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
-TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
-WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-animal-sniffer.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-animal-sniffer.txt
deleted file mode 100644
index 370fb559bb..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-animal-sniffer.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License
-
-Copyright (c) 2009 codehaus.org.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-aopalliance-repackaged.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-aopalliance-repackaged.txt
deleted file mode 100644
index 4a00ba9482..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-aopalliance-repackaged.txt
+++ /dev/null
@@ -1,362 +0,0 @@
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1
-
-1. Definitions.
-
- 1.1. "Contributor" means each individual or entity that creates or
- contributes to the creation of Modifications.
-
- 1.2. "Contributor Version" means the combination of the Original
- Software, prior Modifications used by a Contributor (if any), and
- the Modifications made by that particular Contributor.
-
- 1.3. "Covered Software" means (a) the Original Software, or (b)
- Modifications, or (c) the combination of files containing Original
- Software with files containing Modifications, in each case including
- portions thereof.
-
- 1.4. "Executable" means the Covered Software in any form other than
- Source Code.
-
- 1.5. "Initial Developer" means the individual or entity that first
- makes Original Software available under this License.
-
- 1.6. "Larger Work" means a work which combines Covered Software or
- portions thereof with code not governed by the terms of this License.
-
- 1.7. "License" means this document.
-
- 1.8. "Licensable" means having the right to grant, to the maximum
- extent possible, whether at the time of the initial grant or
- subsequently acquired, any and all of the rights conveyed herein.
-
- 1.9. "Modifications" means the Source Code and Executable form of
- any of the following:
-
- A. Any file that results from an addition to, deletion from or
- modification of the contents of a file containing Original Software
- or previous Modifications;
-
- B. Any new file that contains any part of the Original Software or
- previous Modification; or
-
- C. Any new file that is contributed or otherwise made available
- under the terms of this License.
-
- 1.10. "Original Software" means the Source Code and Executable form
- of computer software code that is originally released under this
- License.
-
- 1.11. "Patent Claims" means any patent claim(s), now owned or
- hereafter acquired, including without limitation, method, process,
- and apparatus claims, in any patent Licensable by grantor.
-
- 1.12. "Source Code" means (a) the common form of computer software
- code in which modifications are made and (b) associated
- documentation included in or with such code.
-
- 1.13. "You" (or "Your") means an individual or a legal entity
- exercising rights under, and complying with all of the terms of,
- this License. For legal entities, "You" includes any entity which
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants.
-
- 2.1. The Initial Developer Grant.
-
- Conditioned upon Your compliance with Section 3.1 below and subject
- to third party intellectual property claims, the Initial Developer
- hereby grants You a world-wide, royalty-free, non-exclusive license:
-
- (a) under intellectual property rights (other than patent or
- trademark) Licensable by Initial Developer, to use, reproduce,
- modify, display, perform, sublicense and distribute the Original
- Software (or portions thereof), with or without Modifications,
- and/or as part of a Larger Work; and
-
- (b) under Patent Claims infringed by the making, using or selling of
- Original Software, to make, have made, use, practice, sell, and
- offer for sale, and/or otherwise dispose of the Original Software
- (or portions thereof).
-
- (c) The licenses granted in Sections 2.1(a) and (b) are effective on
- the date Initial Developer first distributes or otherwise makes the
- Original Software available to a third party under the terms of this
- License.
-
- (d) Notwithstanding Section 2.1(b) above, no patent license is
- granted: (1) for code that You delete from the Original Software, or
- (2) for infringements caused by: (i) the modification of the
- Original Software, or (ii) the combination of the Original Software
- with other software or devices.
-
- 2.2. Contributor Grant.
-
- Conditioned upon Your compliance with Section 3.1 below and subject
- to third party intellectual property claims, each Contributor hereby
- grants You a world-wide, royalty-free, non-exclusive license:
-
- (a) under intellectual property rights (other than patent or
- trademark) Licensable by Contributor to use, reproduce, modify,
- display, perform, sublicense and distribute the Modifications
- created by such Contributor (or portions thereof), either on an
- unmodified basis, with other Modifications, as Covered Software
- and/or as part of a Larger Work; and
-
- (b) under Patent Claims infringed by the making, using, or selling
- of Modifications made by that Contributor either alone and/or in
- combination with its Contributor Version (or portions of such
- combination), to make, use, sell, offer for sale, have made, and/or
- otherwise dispose of: (1) Modifications made by that Contributor (or
- portions thereof); and (2) the combination of Modifications made by
- that Contributor with its Contributor Version (or portions of such
- combination).
-
- (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective
- on the date Contributor first distributes or otherwise makes the
- Modifications available to a third party.
-
- (d) Notwithstanding Section 2.2(b) above, no patent license is
- granted: (1) for any code that Contributor has deleted from the
- Contributor Version; (2) for infringements caused by: (i) third
- party modifications of Contributor Version, or (ii) the combination
- of Modifications made by that Contributor with other software
- (except as part of the Contributor Version) or other devices; or (3)
- under Patent Claims infringed by Covered Software in the absence of
- Modifications made by that Contributor.
-
-3. Distribution Obligations.
-
- 3.1. Availability of Source Code.
-
- Any Covered Software that You distribute or otherwise make available
- in Executable form must also be made available in Source Code form
- and that Source Code form must be distributed only under the terms
- of this License. You must include a copy of this License with every
- copy of the Source Code form of the Covered Software You distribute
- or otherwise make available. You must inform recipients of any such
- Covered Software in Executable form as to how they can obtain such
- Covered Software in Source Code form in a reasonable manner on or
- through a medium customarily used for software exchange.
-
- 3.2. Modifications.
-
- The Modifications that You create or to which You contribute are
- governed by the terms of this License. You represent that You
- believe Your Modifications are Your original creation(s) and/or You
- have sufficient rights to grant the rights conveyed by this License.
-
- 3.3. Required Notices.
-
- You must include a notice in each of Your Modifications that
- identifies You as the Contributor of the Modification. You may not
- remove or alter any copyright, patent or trademark notices contained
- within the Covered Software, or any notices of licensing or any
- descriptive text giving attribution to any Contributor or the
- Initial Developer.
-
- 3.4. Application of Additional Terms.
-
- You may not offer or impose any terms on any Covered Software in
- Source Code form that alters or restricts the applicable version of
- this License or the recipients' rights hereunder. You may choose to
- offer, and to charge a fee for, warranty, support, indemnity or
- liability obligations to one or more recipients of Covered Software.
- However, you may do so only on Your own behalf, and not on behalf of
- the Initial Developer or any Contributor. You must make it
- absolutely clear that any such warranty, support, indemnity or
- liability obligation is offered by You alone, and You hereby agree
- to indemnify the Initial Developer and every Contributor for any
- liability incurred by the Initial Developer or such Contributor as a
- result of warranty, support, indemnity or liability terms You offer.
-
- 3.5. Distribution of Executable Versions.
-
- You may distribute the Executable form of the Covered Software under
- the terms of this License or under the terms of a license of Your
- choice, which may contain terms different from this License,
- provided that You are in compliance with the terms of this License
- and that the license for the Executable form does not attempt to
- limit or alter the recipient's rights in the Source Code form from
- the rights set forth in this License. If You distribute the Covered
- Software in Executable form under a different license, You must make
- it absolutely clear that any terms which differ from this License
- are offered by You alone, not by the Initial Developer or
- Contributor. You hereby agree to indemnify the Initial Developer and
- every Contributor for any liability incurred by the Initial
- Developer or such Contributor as a result of any such terms You offer.
-
- 3.6. Larger Works.
-
- You may create a Larger Work by combining Covered Software with
- other code not governed by the terms of this License and distribute
- the Larger Work as a single product. In such a case, You must make
- sure the requirements of this License are fulfilled for the Covered
- Software.
-
-4. Versions of the License.
-
- 4.1. New Versions.
-
- Oracle is the initial license steward and may publish revised and/or
- new versions of this License from time to time. Each version will be
- given a distinguishing version number. Except as provided in Section
- 4.3, no one other than the license steward has the right to modify
- this License.
-
- 4.2. Effect of New Versions.
-
- You may always continue to use, distribute or otherwise make the
- Covered Software available under the terms of the version of the
- License under which You originally received the Covered Software. If
- the Initial Developer includes a notice in the Original Software
- prohibiting it from being distributed or otherwise made available
- under any subsequent version of the License, You must distribute and
- make the Covered Software available under the terms of the version
- of the License under which You originally received the Covered
- Software. Otherwise, You may also choose to use, distribute or
- otherwise make the Covered Software available under the terms of any
- subsequent version of the License published by the license steward.
-
- 4.3. Modified Versions.
-
- When You are an Initial Developer and You want to create a new
- license for Your Original Software, You may create and use a
- modified version of this License if You: (a) rename the license and
- remove any references to the name of the license steward (except to
- note that the license differs from this License); and (b) otherwise
- make it clear that the license contains terms which differ from this
- License.
-
-5. DISCLAIMER OF WARRANTY.
-
- COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
- INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE
- IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
- NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
- THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE
- DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY
- OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING,
- REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
- ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS
- AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
- 6.1. This License and the rights granted hereunder will terminate
- automatically if You fail to comply with terms herein and fail to
- cure such breach within 30 days of becoming aware of the breach.
- Provisions which, by their nature, must remain in effect beyond the
- termination of this License shall survive.
-
- 6.2. If You assert a patent infringement claim (excluding
- declaratory judgment actions) against Initial Developer or a
- Contributor (the Initial Developer or Contributor against whom You
- assert such claim is referred to as "Participant") alleging that the
- Participant Software (meaning the Contributor Version where the
- Participant is a Contributor or the Original Software where the
- Participant is the Initial Developer) directly or indirectly
- infringes any patent, then any and all rights granted directly or
- indirectly to You by such Participant, the Initial Developer (if the
- Initial Developer is not the Participant) and all Contributors under
- Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice
- from Participant terminate prospectively and automatically at the
- expiration of such 60 day notice period, unless if within such 60
- day period You withdraw Your claim with respect to the Participant
- Software against such Participant either unilaterally or pursuant to
- a written agreement with Participant.
-
- 6.3. If You assert a patent infringement claim against Participant
- alleging that the Participant Software directly or indirectly
- infringes any patent where such claim is resolved (such as by
- license or settlement) prior to the initiation of patent
- infringement litigation, then the reasonable value of the licenses
- granted by such Participant under Sections 2.1 or 2.2 shall be taken
- into account in determining the amount or value of any payment or
- license.
-
- 6.4. In the event of termination under Sections 6.1 or 6.2 above,
- all end user licenses that have been validly granted by You or any
- distributor hereunder prior to termination (excluding licenses
- granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY.
-
- UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
- (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
- INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
- COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE
- TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
- CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
- LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER
- FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
- LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE
- POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT
- APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH
- PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH
- LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR
- LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION
- AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
- The Covered Software is a "commercial item," as that term is defined
- in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
- software" (as that term is defined at 48 C.F.R. §
- 252.227-7014(a)(1)) and "commercial computer software documentation"
- as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent
- with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4
- (June 1995), all U.S. Government End Users acquire Covered Software
- with only those rights set forth herein. This U.S. Government Rights
- clause is in lieu of, and supersedes, any other FAR, DFAR, or other
- clause or provision that addresses Government rights in computer
- software under this License.
-
-9. MISCELLANEOUS.
-
- This License represents the complete agreement concerning subject
- matter hereof. If any provision of this License is held to be
- unenforceable, such provision shall be reformed only to the extent
- necessary to make it enforceable. This License shall be governed by
- the law of the jurisdiction specified in a notice contained within
- the Original Software (except to the extent applicable law, if any,
- provides otherwise), excluding such jurisdiction's conflict-of-law
- provisions. Any litigation relating to this License shall be subject
- to the jurisdiction of the courts located in the jurisdiction and
- venue specified in a notice contained within the Original Software,
- with the losing party responsible for costs, including, without
- limitation, court costs and reasonable attorneys' fees and expenses.
- The application of the United Nations Convention on Contracts for
- the International Sale of Goods is expressly excluded. Any law or
- regulation which provides that the language of a contract shall be
- construed against the drafter shall not apply to this License. You
- agree that You alone are responsible for compliance with the United
- States export administration regulations (and the export control
- laws and regulation of any other countries) when You use, distribute
- or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
- As between Initial Developer and the Contributors, each party is
- responsible for claims and damages arising, directly or indirectly,
- out of its utilization of rights under this License and You agree to
- work with Initial Developer and Contributors to distribute such
- responsibility on an equitable basis. Nothing herein is intended or
- shall be deemed to constitute any admission of liability.
-
-------------------------------------------------------------------------
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
-LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the
-State of California (excluding conflict-of-law provisions). Any
-litigation relating to this License shall be subject to the jurisdiction
-of the Federal Courts of the Northern District of California and the
-state courts of the State of California, with venue lying in Santa Clara
-County, California.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-api-client-staging.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-api-client-staging.txt
deleted file mode 100644
index 97ee06a0a4..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-api-client-staging.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright 2016, Google Inc.
-All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-beanutils.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-beanutils.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-beanutils.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-configuration2.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-configuration2.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-configuration2.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-lang.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-lang.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-lang.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-lang3.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-lang3.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-lang3.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-text.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-text.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-commons-text.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-glassfish-hk2.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-glassfish-hk2.txt
deleted file mode 100644
index bda7db00c5..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-glassfish-hk2.txt
+++ /dev/null
@@ -1,277 +0,0 @@
-# Eclipse Public License - v 2.0
-
- THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
- PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
- OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
- 1. DEFINITIONS
-
- "Contribution" means:
-
- a) in the case of the initial Contributor, the initial content
- Distributed under this Agreement, and
-
- b) in the case of each subsequent Contributor:
- i) changes to the Program, and
- ii) additions to the Program;
- where such changes and/or additions to the Program originate from
- and are Distributed by that particular Contributor. A Contribution
- "originates" from a Contributor if it was added to the Program by
- such Contributor itself or anyone acting on such Contributor's behalf.
- Contributions do not include changes or additions to the Program that
- are not Modified Works.
-
- "Contributor" means any person or entity that Distributes the Program.
-
- "Licensed Patents" mean patent claims licensable by a Contributor which
- are necessarily infringed by the use or sale of its Contribution alone
- or when combined with the Program.
-
- "Program" means the Contributions Distributed in accordance with this
- Agreement.
-
- "Recipient" means anyone who receives the Program under this Agreement
- or any Secondary License (as applicable), including Contributors.
-
- "Derivative Works" shall mean any work, whether in Source Code or other
- form, that is based on (or derived from) the Program and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship.
-
- "Modified Works" shall mean any work in Source Code or other form that
- results from an addition to, deletion from, or modification of the
- contents of the Program, including, for purposes of clarity any new file
- in Source Code form that contains any contents of the Program. Modified
- Works shall not include works that contain only declarations,
- interfaces, types, classes, structures, or files of the Program solely
- in each case in order to link to, bind by name, or subclass the Program
- or Modified Works thereof.
-
- "Distribute" means the acts of a) distributing or b) making available
- in any manner that enables the transfer of a copy.
-
- "Source Code" means the form of a Program preferred for making
- modifications, including but not limited to software source code,
- documentation source, and configuration files.
-
- "Secondary License" means either the GNU General Public License,
- Version 2.0, or any later versions of that license, including any
- exceptions or additional permissions as identified by the initial
- Contributor.
-
- 2. GRANT OF RIGHTS
-
- a) Subject to the terms of this Agreement, each Contributor hereby
- grants Recipient a non-exclusive, worldwide, royalty-free copyright
- license to reproduce, prepare Derivative Works of, publicly display,
- publicly perform, Distribute and sublicense the Contribution of such
- Contributor, if any, and such Derivative Works.
-
- b) Subject to the terms of this Agreement, each Contributor hereby
- grants Recipient a non-exclusive, worldwide, royalty-free patent
- license under Licensed Patents to make, use, sell, offer to sell,
- import and otherwise transfer the Contribution of such Contributor,
- if any, in Source Code or other form. This patent license shall
- apply to the combination of the Contribution and the Program if, at
- the time the Contribution is added by the Contributor, such addition
- of the Contribution causes such combination to be covered by the
- Licensed Patents. The patent license shall not apply to any other
- combinations which include the Contribution. No hardware per se is
- licensed hereunder.
-
- c) Recipient understands that although each Contributor grants the
- licenses to its Contributions set forth herein, no assurances are
- provided by any Contributor that the Program does not infringe the
- patent or other intellectual property rights of any other entity.
- Each Contributor disclaims any liability to Recipient for claims
- brought by any other entity based on infringement of intellectual
- property rights or otherwise. As a condition to exercising the
- rights and licenses granted hereunder, each Recipient hereby
- assumes sole responsibility to secure any other intellectual
- property rights needed, if any. For example, if a third party
- patent license is required to allow Recipient to Distribute the
- Program, it is Recipient's responsibility to acquire that license
- before distributing the Program.
-
- d) Each Contributor represents that to its knowledge it has
- sufficient copyright rights in its Contribution, if any, to grant
- the copyright license set forth in this Agreement.
-
- e) Notwithstanding the terms of any Secondary License, no
- Contributor makes additional grants to any Recipient (other than
- those set forth in this Agreement) as a result of such Recipient's
- receipt of the Program under the terms of a Secondary License
- (if permitted under the terms of Section 3).
-
- 3. REQUIREMENTS
-
- 3.1 If a Contributor Distributes the Program in any form, then:
-
- a) the Program must also be made available as Source Code, in
- accordance with section 3.2, and the Contributor must accompany
- the Program with a statement that the Source Code for the Program
- is available under this Agreement, and informs Recipients how to
- obtain it in a reasonable manner on or through a medium customarily
- used for software exchange; and
-
- b) the Contributor may Distribute the Program under a license
- different than this Agreement, provided that such license:
- i) effectively disclaims on behalf of all other Contributors all
- warranties and conditions, express and implied, including
- warranties or conditions of title and non-infringement, and
- implied warranties or conditions of merchantability and fitness
- for a particular purpose;
-
- ii) effectively excludes on behalf of all other Contributors all
- liability for damages, including direct, indirect, special,
- incidental and consequential damages, such as lost profits;
-
- iii) does not attempt to limit or alter the recipients' rights
- in the Source Code under section 3.2; and
-
- iv) requires any subsequent distribution of the Program by any
- party to be under a license that satisfies the requirements
- of this section 3.
-
- 3.2 When the Program is Distributed as Source Code:
-
- a) it must be made available under this Agreement, or if the
- Program (i) is combined with other material in a separate file or
- files made available under a Secondary License, and (ii) the initial
- Contributor attached to the Source Code the notice described in
- Exhibit A of this Agreement, then the Program may be made available
- under the terms of such Secondary Licenses, and
-
- b) a copy of this Agreement must be included with each copy of
- the Program.
-
- 3.3 Contributors may not remove or alter any copyright, patent,
- trademark, attribution notices, disclaimers of warranty, or limitations
- of liability ("notices") contained within the Program from any copy of
- the Program which they Distribute, provided that Contributors may add
- their own appropriate notices.
-
- 4. COMMERCIAL DISTRIBUTION
-
- Commercial distributors of software may accept certain responsibilities
- with respect to end users, business partners and the like. While this
- license is intended to facilitate the commercial use of the Program,
- the Contributor who includes the Program in a commercial product
- offering should do so in a manner which does not create potential
- liability for other Contributors. Therefore, if a Contributor includes
- the Program in a commercial product offering, such Contributor
- ("Commercial Contributor") hereby agrees to defend and indemnify every
- other Contributor ("Indemnified Contributor") against any losses,
- damages and costs (collectively "Losses") arising from claims, lawsuits
- and other legal actions brought by a third party against the Indemnified
- Contributor to the extent caused by the acts or omissions of such
- Commercial Contributor in connection with its distribution of the Program
- in a commercial product offering. The obligations in this section do not
- apply to any claims or Losses relating to any actual or alleged
- intellectual property infringement. In order to qualify, an Indemnified
- Contributor must: a) promptly notify the Commercial Contributor in
- writing of such claim, and b) allow the Commercial Contributor to control,
- and cooperate with the Commercial Contributor in, the defense and any
- related settlement negotiations. The Indemnified Contributor may
- participate in any such claim at its own expense.
-
- For example, a Contributor might include the Program in a commercial
- product offering, Product X. That Contributor is then a Commercial
- Contributor. If that Commercial Contributor then makes performance
- claims, or offers warranties related to Product X, those performance
- claims and warranties are such Commercial Contributor's responsibility
- alone. Under this section, the Commercial Contributor would have to
- defend claims against the other Contributors related to those performance
- claims and warranties, and if a court requires any other Contributor to
- pay any damages as a result, the Commercial Contributor must pay
- those damages.
-
- 5. NO WARRANTY
-
- EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
- PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
- BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
- IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
- TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
- PURPOSE. Each Recipient is solely responsible for determining the
- appropriateness of using and distributing the Program and assumes all
- risks associated with its exercise of rights under this Agreement,
- including but not limited to the risks and costs of program errors,
- compliance with applicable laws, damage to or loss of data, programs
- or equipment, and unavailability or interruption of operations.
-
- 6. DISCLAIMER OF LIABILITY
-
- EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
- PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
- SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
- PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
- EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGES.
-
- 7. GENERAL
-
- If any provision of this Agreement is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability of
- the remainder of the terms of this Agreement, and without further
- action by the parties hereto, such provision shall be reformed to the
- minimum extent necessary to make such provision valid and enforceable.
-
- If Recipient institutes patent litigation against any entity
- (including a cross-claim or counterclaim in a lawsuit) alleging that the
- Program itself (excluding combinations of the Program with other software
- or hardware) infringes such Recipient's patent(s), then such Recipient's
- rights granted under Section 2(b) shall terminate as of the date such
- litigation is filed.
-
- All Recipient's rights under this Agreement shall terminate if it
- fails to comply with any of the material terms or conditions of this
- Agreement and does not cure such failure in a reasonable period of
- time after becoming aware of such noncompliance. If all Recipient's
- rights under this Agreement terminate, Recipient agrees to cease use
- and distribution of the Program as soon as reasonably practicable.
- However, Recipient's obligations under this Agreement and any licenses
- granted by Recipient relating to the Program shall continue and survive.
-
- Everyone is permitted to copy and distribute copies of this Agreement,
- but in order to avoid inconsistency the Agreement is copyrighted and
- may only be modified in the following manner. The Agreement Steward
- reserves the right to publish new versions (including revisions) of
- this Agreement from time to time. No one other than the Agreement
- Steward has the right to modify this Agreement. The Eclipse Foundation
- is the initial Agreement Steward. The Eclipse Foundation may assign the
- responsibility to serve as the Agreement Steward to a suitable separate
- entity. Each new version of the Agreement will be given a distinguishing
- version number. The Program (including Contributions) may always be
- Distributed subject to the version of the Agreement under which it was
- received. In addition, after a new version of the Agreement is published,
- Contributor may elect to Distribute the Program (including its
- Contributions) under the new version.
-
- Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
- receives no rights or licenses to the intellectual property of any
- Contributor under this Agreement, whether expressly, by implication,
- estoppel or otherwise. All rights in the Program not expressly granted
- under this Agreement are reserved. Nothing in this Agreement is intended
- to be enforceable by any entity that is not a Contributor or Recipient.
- No third-party beneficiary rights are created under this Agreement.
-
- Exhibit A - Form of Secondary Licenses Notice
-
- "This Source Code may also be made available under the following
- Secondary Licenses when the conditions for such availability set forth
- in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
- version(s), and exceptions or additional permissions here}."
-
- Simply including a copy of this Agreement, including this Exhibit A
- is not sufficient to license the Source Code under Secondary Licenses.
-
- If it is not possible or desirable to put the notice in a particular
- file, then You may include the notice in a location (such as a LICENSE
- file in a relevant directory) where a recipient would be likely to
- look for such a notice.
-
- You may add additional accurate notices of copyright ownership.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-grpc-java.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-grpc-java.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-grpc-java.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-gson.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-gson.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-gson.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-j2objc.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-j2objc.txt
deleted file mode 100644
index 2b004c3eee..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-j2objc.txt
+++ /dev/null
@@ -1,232 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
---------------------------------------------------------------------------------
-The next section, BSD-3-Clause, applies to the files in:
-jre_emul/android/platform/libcore/ojluni/src/main/java/java/time
---------------------------------------------------------------------------------
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
-* Neither the name of JSR-310 nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-dataformat-yaml.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-dataformat-yaml.txt
deleted file mode 100644
index 8d5775d40c..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-dataformat-yaml.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor YAML module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-base-2.14.0.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-base-2.14.0.txt
deleted file mode 100644
index 6acf75483f..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-base-2.14.0.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor databind module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-base.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-base.txt
deleted file mode 100644
index 6acf75483f..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-base.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor databind module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-json-provider-2.14.0.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-json-provider-2.14.0.txt
deleted file mode 100644
index 6acf75483f..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-json-provider-2.14.0.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor databind module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-json-provider.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-json-provider.txt
deleted file mode 100644
index 6acf75483f..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-jaxrs-json-provider.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor databind module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-module-jaxb-annotations-2.14.0.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-module-jaxb-annotations-2.14.0.txt
deleted file mode 100644
index 283587f1b1..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-module-jaxb-annotations-2.14.0.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor `jackson-module-jaxb-annotations` module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-module-jaxb-annotations.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-module-jaxb-annotations.txt
deleted file mode 100644
index 283587f1b1..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jackson-module-jaxb-annotations.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-This copy of Jackson JSON processor `jackson-module-jaxb-annotations` module is licensed under the
-Apache (Software) License, version 2.0 ("the License").
-See the License for details about distribution rights, and the
-specific rights regarding derivate works.
-
-You may obtain a copy of the License at:
-
-http://www.apache.org/licenses/LICENSE-2.0
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jaf-api.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jaf-api.txt
deleted file mode 100644
index 05220de312..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jaf-api.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-
- Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of the Eclipse Foundation, Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jakarta.activation-api.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jakarta.activation-api.txt
deleted file mode 100644
index e0358f9721..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jakarta.activation-api.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-
- Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- - Neither the name of the Eclipse Foundation, Inc. nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jakarta.activation.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jakarta.activation.txt
deleted file mode 100644
index a8ba56ef14..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jakarta.activation.txt
+++ /dev/null
@@ -1,277 +0,0 @@
-# Eclipse Public License - v 2.0
-
- THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
- PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
- OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
- 1. DEFINITIONS
-
- "Contribution" means:
-
- a) in the case of the initial Contributor, the initial content
- Distributed under this Agreement, and
-
- b) in the case of each subsequent Contributor:
- i) changes to the Program, and
- ii) additions to the Program;
- where such changes and/or additions to the Program originate from
- and are Distributed by that particular Contributor. A Contribution
- "originates" from a Contributor if it was added to the Program by
- such Contributor itself or anyone acting on such Contributor's behalf.
- Contributions do not include changes or additions to the Program that
- are not Modified Works.
-
- "Contributor" means any person or entity that Distributes the Program.
-
- "Licensed Patents" mean patent claims licensable by a Contributor which
- are necessarily infringed by the use or sale of its Contribution alone
- or when combined with the Program.
-
- "Program" means the Contributions Distributed in accordance with this
- Agreement.
-
- "Recipient" means anyone who receives the Program under this Agreement
- or any Secondary License (as applicable), including Contributors.
-
- "Derivative Works" shall mean any work, whether in Source Code or other
- form, that is based on (or derived from) the Program and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship.
-
- "Modified Works" shall mean any work in Source Code or other form that
- results from an addition to, deletion from, or modification of the
- contents of the Program, including, for purposes of clarity any new file
- in Source Code form that contains any contents of the Program. Modified
- Works shall not include works that contain only declarations,
- interfaces, types, classes, structures, or files of the Program solely
- in each case in order to link to, bind by name, or subclass the Program
- or Modified Works thereof.
-
- "Distribute" means the acts of a) distributing or b) making available
- in any manner that enables the transfer of a copy.
-
- "Source Code" means the form of a Program preferred for making
- modifications, including but not limited to software source code,
- documentation source, and configuration files.
-
- "Secondary License" means either the GNU General Public License,
- Version 2.0, or any later versions of that license, including any
- exceptions or additional permissions as identified by the initial
- Contributor.
-
- 2. GRANT OF RIGHTS
-
- a) Subject to the terms of this Agreement, each Contributor hereby
- grants Recipient a non-exclusive, worldwide, royalty-free copyright
- license to reproduce, prepare Derivative Works of, publicly display,
- publicly perform, Distribute and sublicense the Contribution of such
- Contributor, if any, and such Derivative Works.
-
- b) Subject to the terms of this Agreement, each Contributor hereby
- grants Recipient a non-exclusive, worldwide, royalty-free patent
- license under Licensed Patents to make, use, sell, offer to sell,
- import and otherwise transfer the Contribution of such Contributor,
- if any, in Source Code or other form. This patent license shall
- apply to the combination of the Contribution and the Program if, at
- the time the Contribution is added by the Contributor, such addition
- of the Contribution causes such combination to be covered by the
- Licensed Patents. The patent license shall not apply to any other
- combinations which include the Contribution. No hardware per se is
- licensed hereunder.
-
- c) Recipient understands that although each Contributor grants the
- licenses to its Contributions set forth herein, no assurances are
- provided by any Contributor that the Program does not infringe the
- patent or other intellectual property rights of any other entity.
- Each Contributor disclaims any liability to Recipient for claims
- brought by any other entity based on infringement of intellectual
- property rights or otherwise. As a condition to exercising the
- rights and licenses granted hereunder, each Recipient hereby
- assumes sole responsibility to secure any other intellectual
- property rights needed, if any. For example, if a third party
- patent license is required to allow Recipient to Distribute the
- Program, it is Recipient's responsibility to acquire that license
- before distributing the Program.
-
- d) Each Contributor represents that to its knowledge it has
- sufficient copyright rights in its Contribution, if any, to grant
- the copyright license set forth in this Agreement.
-
- e) Notwithstanding the terms of any Secondary License, no
- Contributor makes additional grants to any Recipient (other than
- those set forth in this Agreement) as a result of such Recipient's
- receipt of the Program under the terms of a Secondary License
- (if permitted under the terms of Section 3).
-
- 3. REQUIREMENTS
-
- 3.1 If a Contributor Distributes the Program in any form, then:
-
- a) the Program must also be made available as Source Code, in
- accordance with section 3.2, and the Contributor must accompany
- the Program with a statement that the Source Code for the Program
- is available under this Agreement, and informs Recipients how to
- obtain it in a reasonable manner on or through a medium customarily
- used for software exchange; and
-
- b) the Contributor may Distribute the Program under a license
- different than this Agreement, provided that such license:
- i) effectively disclaims on behalf of all other Contributors all
- warranties and conditions, express and implied, including
- warranties or conditions of title and non-infringement, and
- implied warranties or conditions of merchantability and fitness
- for a particular purpose;
-
- ii) effectively excludes on behalf of all other Contributors all
- liability for damages, including direct, indirect, special,
- incidental and consequential damages, such as lost profits;
-
- iii) does not attempt to limit or alter the recipients' rights
- in the Source Code under section 3.2; and
-
- iv) requires any subsequent distribution of the Program by any
- party to be under a license that satisfies the requirements
- of this section 3.
-
- 3.2 When the Program is Distributed as Source Code:
-
- a) it must be made available under this Agreement, or if the
- Program (i) is combined with other material in a separate file or
- files made available under a Secondary License, and (ii) the initial
- Contributor attached to the Source Code the notice described in
- Exhibit A of this Agreement, then the Program may be made available
- under the terms of such Secondary Licenses, and
-
- b) a copy of this Agreement must be included with each copy of
- the Program.
-
- 3.3 Contributors may not remove or alter any copyright, patent,
- trademark, attribution notices, disclaimers of warranty, or limitations
- of liability ("notices") contained within the Program from any copy of
- the Program which they Distribute, provided that Contributors may add
- their own appropriate notices.
-
- 4. COMMERCIAL DISTRIBUTION
-
- Commercial distributors of software may accept certain responsibilities
- with respect to end users, business partners and the like. While this
- license is intended to facilitate the commercial use of the Program,
- the Contributor who includes the Program in a commercial product
- offering should do so in a manner which does not create potential
- liability for other Contributors. Therefore, if a Contributor includes
- the Program in a commercial product offering, such Contributor
- ("Commercial Contributor") hereby agrees to defend and indemnify every
- other Contributor ("Indemnified Contributor") against any losses,
- damages and costs (collectively "Losses") arising from claims, lawsuits
- and other legal actions brought by a third party against the Indemnified
- Contributor to the extent caused by the acts or omissions of such
- Commercial Contributor in connection with its distribution of the Program
- in a commercial product offering. The obligations in this section do not
- apply to any claims or Losses relating to any actual or alleged
- intellectual property infringement. In order to qualify, an Indemnified
- Contributor must: a) promptly notify the Commercial Contributor in
- writing of such claim, and b) allow the Commercial Contributor to control,
- and cooperate with the Commercial Contributor in, the defense and any
- related settlement negotiations. The Indemnified Contributor may
- participate in any such claim at its own expense.
-
- For example, a Contributor might include the Program in a commercial
- product offering, Product X. That Contributor is then a Commercial
- Contributor. If that Commercial Contributor then makes performance
- claims, or offers warranties related to Product X, those performance
- claims and warranties are such Commercial Contributor's responsibility
- alone. Under this section, the Commercial Contributor would have to
- defend claims against the other Contributors related to those performance
- claims and warranties, and if a court requires any other Contributor to
- pay any damages as a result, the Commercial Contributor must pay
- those damages.
-
- 5. NO WARRANTY
-
- EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
- PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS"
- BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
- IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF
- TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
- PURPOSE. Each Recipient is solely responsible for determining the
- appropriateness of using and distributing the Program and assumes all
- risks associated with its exercise of rights under this Agreement,
- including but not limited to the risks and costs of program errors,
- compliance with applicable laws, damage to or loss of data, programs
- or equipment, and unavailability or interruption of operations.
-
- 6. DISCLAIMER OF LIABILITY
-
- EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
- PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
- SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
- PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
- EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGES.
-
- 7. GENERAL
-
- If any provision of this Agreement is invalid or unenforceable under
- applicable law, it shall not affect the validity or enforceability of
- the remainder of the terms of this Agreement, and without further
- action by the parties hereto, such provision shall be reformed to the
- minimum extent necessary to make such provision valid and enforceable.
-
- If Recipient institutes patent litigation against any entity
- (including a cross-claim or counterclaim in a lawsuit) alleging that the
- Program itself (excluding combinations of the Program with other software
- or hardware) infringes such Recipient's patent(s), then such Recipient's
- rights granted under Section 2(b) shall terminate as of the date such
- litigation is filed.
-
- All Recipient's rights under this Agreement shall terminate if it
- fails to comply with any of the material terms or conditions of this
- Agreement and does not cure such failure in a reasonable period of
- time after becoming aware of such noncompliance. If all Recipient's
- rights under this Agreement terminate, Recipient agrees to cease use
- and distribution of the Program as soon as reasonably practicable.
- However, Recipient's obligations under this Agreement and any licenses
- granted by Recipient relating to the Program shall continue and survive.
-
- Everyone is permitted to copy and distribute copies of this Agreement,
- but in order to avoid inconsistency the Agreement is copyrighted and
- may only be modified in the following manner. The Agreement Steward
- reserves the right to publish new versions (including revisions) of
- this Agreement from time to time. No one other than the Agreement
- Steward has the right to modify this Agreement. The Eclipse Foundation
- is the initial Agreement Steward. The Eclipse Foundation may assign the
- responsibility to serve as the Agreement Steward to a suitable separate
- entity. Each new version of the Agreement will be given a distinguishing
- version number. The Program (including Contributions) may always be
- Distributed subject to the version of the Agreement under which it was
- received. In addition, after a new version of the Agreement is published,
- Contributor may elect to Distribute the Program (including its
- Contributions) under the new version.
-
- Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
- receives no rights or licenses to the intellectual property of any
- Contributor under this Agreement, whether expressly, by implication,
- estoppel or otherwise. All rights in the Program not expressly granted
- under this Agreement are reserved. Nothing in this Agreement is intended
- to be enforceable by any entity that is not a Contributor or Recipient.
- No third-party beneficiary rights are created under this Agreement.
-
- Exhibit A - Form of Secondary Licenses Notice
-
- "This Source Code may also be made available under the following
- Secondary Licenses when the conditions for such availability set forth
- in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
- version(s), and exceptions or additional permissions here}."
-
- Simply including a copy of this Agreement, including this Exhibit A
- is not sufficient to license the Source Code under Secondary Licenses.
-
- If it is not possible or desirable to put the notice in a particular
- file, then You may include the notice in a location (such as a LICENSE
- file in a relevant directory) where a recipient would be likely to
- look for such a notice.
-
- You may add additional accurate notices of copyright ownership.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-javassist.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-javassist.txt
deleted file mode 100644
index f45a423e3f..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-javassist.txt
+++ /dev/null
@@ -1,357 +0,0 @@
-
-
-Javassist License
-
-
-
-
-MOZILLA PUBLIC LICENSE Version
-1.1
-
-
-
-1. Definitions.
-
1.0.1. "Commercial Use" means distribution or otherwise making the
- Covered Code available to a third party.
- 1.1. ''Contributor'' means each entity that creates or contributes
- to the creation of Modifications.
-
1.2. ''Contributor Version'' means the combination of the Original
- Code, prior Modifications used by a Contributor, and the Modifications made by
- that particular Contributor.
-
1.3. ''Covered Code'' means the Original Code or Modifications or
- the combination of the Original Code and Modifications, in each case including
- portions thereof.
-
1.4. ''Electronic Distribution Mechanism'' means a mechanism
- generally accepted in the software development community for the electronic
- transfer of data.
-
1.5. ''Executable'' means Covered Code in any form other than Source
- Code.
-
1.6. ''Initial Developer'' means the individual or entity identified
- as the Initial Developer in the Source Code notice required by Exhibit
- A .
-
1.7. ''Larger Work'' means a work which combines Covered Code or
- portions thereof with code not governed by the terms of this License.
-
1.8. ''License'' means this document.
-
1.8.1. "Licensable" means having the right to grant, to the maximum
- extent possible, whether at the time of the initial grant or subsequently
- acquired, any and all of the rights conveyed herein.
-
1.9. ''Modifications'' means any addition to or deletion from the
- substance or structure of either the Original Code or any previous
- Modifications. When Covered Code is released as a series of files, a
- Modification is:
-
1.10. ''Original Code''
- means Source Code of computer software code which is described in the Source
- Code notice required by Exhibit A as Original Code, and which, at the
- time of its release under this License is not already Covered Code governed by
- this License.
- 1.10.1. "Patent Claims" means any patent claim(s), now owned or
- hereafter acquired, including without limitation, method, process, and
- apparatus claims, in any patent Licensable by grantor.
-
1.11. ''Source Code'' means the preferred form of the Covered Code
- for making modifications to it, including all modules it contains, plus any
- associated interface definition files, scripts used to control compilation and
- installation of an Executable, or source code differential comparisons against
- either the Original Code or another well known, available Covered Code of the
- Contributor's choice. The Source Code can be in a compressed or archival form,
- provided the appropriate decompression or de-archiving software is widely
- available for no charge.
-
1.12. "You'' (or "Your") means an individual or a legal entity
- exercising rights under, and complying with all of the terms of, this License
- or a future version of this License issued under Section 6.1. For legal
- entities, "You'' includes any entity which controls, is controlled by, or is
- under common control with You. For purposes of this definition, "control''
- means (a) the power, direct or indirect, to cause the direction or management
- of such entity, whether by contract or otherwise, or (b) ownership of more
- than fifty percent (50%) of the outstanding shares or beneficial ownership of
- such entity.
2. Source Code License.
-2.1. The Initial Developer Grant. The Initial Developer hereby
- grants You a world-wide, royalty-free, non-exclusive license, subject to third
- party intellectual property claims:
- (a) under intellectual property rights (other than
- patent or trademark) Licensable by Initial Developer to use, reproduce,
- modify, display, perform, sublicense and distribute the Original Code (or
- portions thereof) with or without Modifications, and/or as part of a Larger
- Work; and
- (b) under Patents Claims infringed by the making, using or selling
- of Original Code, to make, have made, use, practice, sell, and offer for
- sale, and/or otherwise dispose of the Original Code (or portions thereof).
-
(c) the licenses granted in this Section 2.1(a) and (b)
- are effective on the date Initial Developer first distributes Original Code
- under the terms of this License.
- (d) Notwithstanding Section 2.1(b) above, no patent license is
- granted: 1) for code that You delete from the Original Code; 2) separate
- from the Original Code; or 3) for infringements caused by: i) the
- modification of the Original Code or ii) the combination of the Original
- Code with other software or devices.
2.2. Contributor
- Grant. Subject to third party intellectual property claims, each
- Contributor hereby grants You a world-wide, royalty-free, non-exclusive
- license
- (a) under intellectual property rights (other
- than patent or trademark) Licensable by Contributor, to use, reproduce,
- modify, display, perform, sublicense and distribute the Modifications
- created by such Contributor (or portions thereof) either on an unmodified
- basis, with other Modifications, as Covered Code and/or as part of a Larger
- Work; and
- (b) under Patent Claims infringed by the making, using, or selling
- of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such
- combination), to make, use, sell, offer for sale, have made, and/or
- otherwise dispose of: 1) Modifications made by that Contributor (or portions
- thereof); and 2) the combination of Modifications made by that
- Contributor with its Contributor Version (or portions of such
- combination).
-
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
- effective on the date Contributor first makes Commercial Use of the Covered
- Code.
-
(d) Notwithstanding Section 2.2(b) above, no
- patent license is granted: 1) for any code that Contributor has deleted from
- the Contributor Version; 2) separate from the Contributor
- Version; 3) for infringements caused by: i) third party
- modifications of Contributor Version or ii) the combination of
- Modifications made by that Contributor with other software (except as
- part of the Contributor Version) or other devices; or 4) under Patent Claims
- infringed by Covered Code in the absence of Modifications made by that
- Contributor.
-3. Distribution Obligations.
-
3.1. Application of License. The Modifications which You create
- or to which You contribute are governed by the terms of this License,
- including without limitation Section 2.2 . The Source Code version of
- Covered Code may be distributed only under the terms of this License or a
- future version of this License released under Section 6.1 , and You must
- include a copy of this License with every copy of the Source Code You
- distribute. You may not offer or impose any terms on any Source Code version
- that alters or restricts the applicable version of this License or the
- recipients' rights hereunder. However, You may include an additional document
- offering the additional rights described in Section 3.5 .
- 3.2. Availability of Source Code. Any Modification which You
- create or to which You contribute must be made available in Source Code form
- under the terms of this License either on the same media as an Executable
- version or via an accepted Electronic Distribution Mechanism to anyone to whom
- you made an Executable version available; and if made available via Electronic
- Distribution Mechanism, must remain available for at least twelve (12) months
- after the date it initially became available, or at least six (6) months after
- a subsequent version of that particular Modification has been made available
- to such recipients. You are responsible for ensuring that the Source Code
- version remains available even if the Electronic Distribution Mechanism is
- maintained by a third party.
-
3.3. Description of Modifications. You must cause all Covered
- Code to which You contribute to contain a file documenting the changes You
- made to create that Covered Code and the date of any change. You must include
- a prominent statement that the Modification is derived, directly or
- indirectly, from Original Code provided by the Initial Developer and including
- the name of the Initial Developer in (a) the Source Code, and (b) in any
- notice in an Executable version or related documentation in which You describe
- the origin or ownership of the Covered Code.
-
3.4. Intellectual Property Matters
-
(a) Third Party Claims . If Contributor has knowledge that a
- license under a third party's intellectual property rights is required to
- exercise the rights granted by such Contributor under Sections 2.1 or 2.2,
- Contributor must include a text file with the Source Code distribution
- titled "LEGAL'' which describes the claim and the party making the claim in
- sufficient detail that a recipient will know whom to contact. If Contributor
- obtains such knowledge after the Modification is made available as described
- in Section 3.2, Contributor shall promptly modify the LEGAL file in all
- copies Contributor makes available thereafter and shall take other steps
- (such as notifying appropriate mailing lists or newsgroups) reasonably
- calculated to inform those who received the Covered Code that new knowledge
- has been obtained.
- (b) Contributor APIs . If Contributor's Modifications include
- an application programming interface and Contributor has knowledge of patent
- licenses which are reasonably necessary to implement that API, Contributor
- must also include this information in the LEGAL file.
-
- (c) Representations.
- Contributor represents that, except as disclosed pursuant to Section
- 3.4(a) above, Contributor believes that Contributor's Modifications are
- Contributor's original creation(s) and/or Contributor has sufficient rights
- to grant the rights conveyed by this License.
- 3.5. Required Notices. You must duplicate the notice in
- Exhibit A in each file of the Source Code. If it is not possible
- to put such notice in a particular Source Code file due to its structure, then
- You must include such notice in a location (such as a relevant directory)
- where a user would be likely to look for such a notice. If You created
- one or more Modification(s) You may add your name as a Contributor to the
- notice described in Exhibit A . You must also duplicate this
- License in any documentation for the Source Code where You describe
- recipients' rights or ownership rights relating to Covered Code. You may
- choose to offer, and to charge a fee for, warranty, support, indemnity or
- liability obligations to one or more recipients of Covered Code. However, You
- may do so only on Your own behalf, and not on behalf of the Initial Developer
- or any Contributor. You must make it absolutely clear than any such warranty,
- support, indemnity or liability obligation is offered by You alone, and You
- hereby agree to indemnify the Initial Developer and every Contributor for any
- liability incurred by the Initial Developer or such Contributor as a result of
- warranty, support, indemnity or liability terms You offer.
-
3.6. Distribution of Executable Versions. You may distribute
- Covered Code in Executable form only if the requirements of Section
- 3.1-3.5 have been met for that Covered Code, and if You include a
- notice stating that the Source Code version of the Covered Code is available
- under the terms of this License, including a description of how and where You
- have fulfilled the obligations of Section 3.2 . The notice must be
- conspicuously included in any notice in an Executable version, related
- documentation or collateral in which You describe recipients' rights relating
- to the Covered Code. You may distribute the Executable version of Covered Code
- or ownership rights under a license of Your choice, which may contain terms
- different from this License, provided that You are in compliance with the
- terms of this License and that the license for the Executable version does not
- attempt to limit or alter the recipient's rights in the Source Code version
- from the rights set forth in this License. If You distribute the Executable
- version under a different license You must make it absolutely clear that any
- terms which differ from this License are offered by You alone, not by the
- Initial Developer or any Contributor. You hereby agree to indemnify the
- Initial Developer and every Contributor for any liability incurred by the
- Initial Developer or such Contributor as a result of any such terms You offer.
-
-
3.7. Larger Works. You may create a Larger Work by combining
- Covered Code with other code not governed by the terms of this License and
- distribute the Larger Work as a single product. In such a case, You must make
- sure the requirements of this License are fulfilled for the Covered
-Code.
4. Inability to Comply Due to Statute or Regulation.
-If it is impossible for You to comply with any of the terms of this
- License with respect to some or all of the Covered Code due to statute,
- judicial order, or regulation then You must: (a) comply with the terms of this
- License to the maximum extent possible; and (b) describe the limitations and
- the code they affect. Such description must be included in the LEGAL file
- described in Section 3.4 and must be included with all distributions of
- the Source Code. Except to the extent prohibited by statute or regulation,
- such description must be sufficiently detailed for a recipient of ordinary
- skill to be able to understand it. 5. Application of this License.
-This License applies to code to which the Initial Developer has attached
- the notice in Exhibit A and to related Covered Code. 6. Versions
-of the License.
-6.1. New Versions . Netscape Communications Corporation
- (''Netscape'') may publish revised and/or new versions of the License from
- time to time. Each version will be given a distinguishing version number.
- 6.2. Effect of New Versions . Once Covered Code has been
- published under a particular version of the License, You may always continue
- to use it under the terms of that version. You may also choose to use such
- Covered Code under the terms of any subsequent version of the License
- published by Netscape. No one other than Netscape has the right to modify the
- terms applicable to Covered Code created under this License.
-
6.3. Derivative Works . If You create or use a modified version
- of this License (which you may only do in order to apply it to code which is
- not already Covered Code governed by this License), You must (a) rename Your
- license so that the phrases ''Mozilla'', ''MOZILLAPL'', ''MOZPL'',
- ''Netscape'', "MPL", ''NPL'' or any confusingly similar phrase do not appear
- in your license (except to note that your license differs from this License)
- and (b) otherwise make it clear that Your version of the license contains
- terms which differ from the Mozilla Public License and Netscape Public
- License. (Filling in the name of the Initial Developer, Original Code or
- Contributor in the notice described in Exhibit A shall not of
- themselves be deemed to be modifications of this License.)
7.
-DISCLAIMER OF WARRANTY.
-COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS, WITHOUT
- WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
- LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE,
- FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE
- QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED
- CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY
- OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR
- CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
- LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS
- DISCLAIMER. 8. TERMINATION.
-8.1. This License and the rights granted hereunder will
- terminate automatically if You fail to comply with terms herein and fail to
- cure such breach within 30 days of becoming aware of the breach. All
- sublicenses to the Covered Code which are properly granted shall survive any
- termination of this License. Provisions which, by their nature, must remain in
- effect beyond the termination of this License shall survive.
- 8.2. If You initiate litigation by asserting a patent
- infringement claim (excluding declatory judgment actions) against Initial
- Developer or a Contributor (the Initial Developer or Contributor against whom
- You file such action is referred to as "Participant") alleging that:
-
(a) such Participant's Contributor Version directly or
- indirectly infringes any patent, then any and all rights granted by such
- Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon
- 60 days notice from Participant terminate prospectively, unless if within 60
- days after receipt of notice You either: (i) agree in writing to pay
- Participant a mutually agreeable reasonable royalty for Your past and future
- use of Modifications made by such Participant, or (ii) withdraw Your
- litigation claim with respect to the Contributor Version against such
- Participant. If within 60 days of notice, a reasonable royalty and
- payment arrangement are not mutually agreed upon in writing by the parties or
- the litigation claim is not withdrawn, the rights granted by Participant to
- You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of
- the 60 day notice period specified above.
-
(b) any software, hardware, or device, other than such
- Participant's Contributor Version, directly or indirectly infringes any
- patent, then any rights granted to You by such Participant under Sections
- 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used,
- sold, distributed, or had made, Modifications made by that Participant.
-
8.3. If You assert a patent infringement claim against
- Participant alleging that such Participant's Contributor Version directly or
- indirectly infringes any patent where such claim is resolved (such as by
- license or settlement) prior to the initiation of patent infringement
- litigation, then the reasonable value of the licenses granted by such
- Participant under Sections 2.1 or 2.2 shall be taken into account in
- determining the amount or value of any payment or license.
-
8.4. In the event of termination under Sections 8.1 or 8.2
- above, all end user license agreements (excluding distributors and
- resellers) which have been validly granted by You or any distributor hereunder
- prior to termination shall survive termination.
9. LIMITATION OF
-LIABILITY.
-UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING
- NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY
- OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY
- OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL,
- INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
- LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
- MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH
- PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS
- LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL
- INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
- PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR
- LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND
- LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS.
-The Covered Code is a ''commercial item,'' as that term is defined in 48
- C.F.R. 2.101 (Oct. 1995), consisting of ''commercial computer software'' and
- ''commercial computer software documentation,'' as such terms are used in 48
- C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R.
- 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users
- acquire Covered Code with only those rights set forth herein. 11.
-MISCELLANEOUS.
-This License represents the complete agreement concerning subject matter
- hereof. If any provision of this License is held to be unenforceable, such
- provision shall be reformed only to the extent necessary to make it
- enforceable. This License shall be governed by California law provisions
- (except to the extent applicable law, if any, provides otherwise), excluding
- its conflict-of-law provisions. With respect to disputes in which at least one
- party is a citizen of, or an entity chartered or registered to do business in
- the United States of America, any litigation relating to this License shall be
- subject to the jurisdiction of the Federal Courts of the Northern District of
- California, with venue lying in Santa Clara County, California, with the
- losing party responsible for costs, including without limitation, court costs
- and reasonable attorneys' fees and expenses. The application of the United
- Nations Convention on Contracts for the International Sale of Goods is
- expressly excluded. Any law or regulation which provides that the language of
- a contract shall be construed against the drafter shall not apply to this
- License. 12. RESPONSIBILITY FOR CLAIMS.
-As between Initial Developer and the Contributors, each party is
- responsible for claims and damages arising, directly or indirectly, out of its
- utilization of rights under this License and You agree to work with Initial
- Developer and Contributors to distribute such responsibility on an equitable
- basis. Nothing herein is intended or shall be deemed to constitute any
- admission of liability. 13. MULTIPLE-LICENSED CODE.
-Initial Developer may designate portions of the Covered Code as
- "Multiple-Licensed". "Multiple-Licensed" means that the Initial
- Developer permits you to utilize portions of the Covered Code under Your
- choice of the MPL or the alternative licenses, if any, specified by the
- Initial Developer in the file described in Exhibit A.
-EXHIBIT A -Mozilla Public License.
-
The contents of this file are subject to the Mozilla Public License
- Version 1.1 (the "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
- Software distributed under the License is distributed on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- for the specific language governing rights and limitations under the
- License.
-
The Original Code is Javassist.
-
The Initial Developer of the Original Code is Shigeru Chiba.
- Portions created by the Initial Developer are
- Copyright (C) 1999- Shigeru Chiba. All Rights Reserved.
-
Contributor(s): __Bill Burke, Jason T. Greene______________.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-javax.activation-api-1.2.0-sources.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-javax.activation-api-1.2.0-sources.txt
deleted file mode 100644
index 596a510633..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-javax.activation-api-1.2.0-sources.txt
+++ /dev/null
@@ -1,362 +0,0 @@
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1
-
-1. Definitions.
-
- 1.1. "Contributor" means each individual or entity that creates or
- contributes to the creation of Modifications.
-
- 1.2. "Contributor Version" means the combination of the Original
- Software, prior Modifications used by a Contributor (if any), and
- the Modifications made by that particular Contributor.
-
- 1.3. "Covered Software" means (a) the Original Software, or (b)
- Modifications, or (c) the combination of files containing Original
- Software with files containing Modifications, in each case including
- portions thereof.
-
- 1.4. "Executable" means the Covered Software in any form other than
- Source Code.
-
- 1.5. "Initial Developer" means the individual or entity that first
- makes Original Software available under this License.
-
- 1.6. "Larger Work" means a work which combines Covered Software or
- portions thereof with code not governed by the terms of this License.
-
- 1.7. "License" means this document.
-
- 1.8. "Licensable" means having the right to grant, to the maximum
- extent possible, whether at the time of the initial grant or
- subsequently acquired, any and all of the rights conveyed herein.
-
- 1.9. "Modifications" means the Source Code and Executable form of
- any of the following:
-
- A. Any file that results from an addition to, deletion from or
- modification of the contents of a file containing Original Software
- or previous Modifications;
-
- B. Any new file that contains any part of the Original Software or
- previous Modification; or
-
- C. Any new file that is contributed or otherwise made available
- under the terms of this License.
-
- 1.10. "Original Software" means the Source Code and Executable form
- of computer software code that is originally released under this
- License.
-
- 1.11. "Patent Claims" means any patent claim(s), now owned or
- hereafter acquired, including without limitation, method, process,
- and apparatus claims, in any patent Licensable by grantor.
-
- 1.12. "Source Code" means (a) the common form of computer software
- code in which modifications are made and (b) associated
- documentation included in or with such code.
-
- 1.13. "You" (or "Your") means an individual or a legal entity
- exercising rights under, and complying with all of the terms of,
- this License. For legal entities, "You" includes any entity which
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants.
-
- 2.1. The Initial Developer Grant.
-
- Conditioned upon Your compliance with Section 3.1 below and subject
- to third party intellectual property claims, the Initial Developer
- hereby grants You a world-wide, royalty-free, non-exclusive license:
-
- (a) under intellectual property rights (other than patent or
- trademark) Licensable by Initial Developer, to use, reproduce,
- modify, display, perform, sublicense and distribute the Original
- Software (or portions thereof), with or without Modifications,
- and/or as part of a Larger Work; and
-
- (b) under Patent Claims infringed by the making, using or selling of
- Original Software, to make, have made, use, practice, sell, and
- offer for sale, and/or otherwise dispose of the Original Software
- (or portions thereof).
-
- (c) The licenses granted in Sections 2.1(a) and (b) are effective on
- the date Initial Developer first distributes or otherwise makes the
- Original Software available to a third party under the terms of this
- License.
-
- (d) Notwithstanding Section 2.1(b) above, no patent license is
- granted: (1) for code that You delete from the Original Software, or
- (2) for infringements caused by: (i) the modification of the
- Original Software, or (ii) the combination of the Original Software
- with other software or devices.
-
- 2.2. Contributor Grant.
-
- Conditioned upon Your compliance with Section 3.1 below and subject
- to third party intellectual property claims, each Contributor hereby
- grants You a world-wide, royalty-free, non-exclusive license:
-
- (a) under intellectual property rights (other than patent or
- trademark) Licensable by Contributor to use, reproduce, modify,
- display, perform, sublicense and distribute the Modifications
- created by such Contributor (or portions thereof), either on an
- unmodified basis, with other Modifications, as Covered Software
- and/or as part of a Larger Work; and
-
- (b) under Patent Claims infringed by the making, using, or selling
- of Modifications made by that Contributor either alone and/or in
- combination with its Contributor Version (or portions of such
- combination), to make, use, sell, offer for sale, have made, and/or
- otherwise dispose of: (1) Modifications made by that Contributor (or
- portions thereof); and (2) the combination of Modifications made by
- that Contributor with its Contributor Version (or portions of such
- combination).
-
- (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective
- on the date Contributor first distributes or otherwise makes the
- Modifications available to a third party.
-
- (d) Notwithstanding Section 2.2(b) above, no patent license is
- granted: (1) for any code that Contributor has deleted from the
- Contributor Version; (2) for infringements caused by: (i) third
- party modifications of Contributor Version, or (ii) the combination
- of Modifications made by that Contributor with other software
- (except as part of the Contributor Version) or other devices; or (3)
- under Patent Claims infringed by Covered Software in the absence of
- Modifications made by that Contributor.
-
-3. Distribution Obligations.
-
- 3.1. Availability of Source Code.
-
- Any Covered Software that You distribute or otherwise make available
- in Executable form must also be made available in Source Code form
- and that Source Code form must be distributed only under the terms
- of this License. You must include a copy of this License with every
- copy of the Source Code form of the Covered Software You distribute
- or otherwise make available. You must inform recipients of any such
- Covered Software in Executable form as to how they can obtain such
- Covered Software in Source Code form in a reasonable manner on or
- through a medium customarily used for software exchange.
-
- 3.2. Modifications.
-
- The Modifications that You create or to which You contribute are
- governed by the terms of this License. You represent that You
- believe Your Modifications are Your original creation(s) and/or You
- have sufficient rights to grant the rights conveyed by this License.
-
- 3.3. Required Notices.
-
- You must include a notice in each of Your Modifications that
- identifies You as the Contributor of the Modification. You may not
- remove or alter any copyright, patent or trademark notices contained
- within the Covered Software, or any notices of licensing or any
- descriptive text giving attribution to any Contributor or the
- Initial Developer.
-
- 3.4. Application of Additional Terms.
-
- You may not offer or impose any terms on any Covered Software in
- Source Code form that alters or restricts the applicable version of
- this License or the recipients' rights hereunder. You may choose to
- offer, and to charge a fee for, warranty, support, indemnity or
- liability obligations to one or more recipients of Covered Software.
- However, you may do so only on Your own behalf, and not on behalf of
- the Initial Developer or any Contributor. You must make it
- absolutely clear that any such warranty, support, indemnity or
- liability obligation is offered by You alone, and You hereby agree
- to indemnify the Initial Developer and every Contributor for any
- liability incurred by the Initial Developer or such Contributor as a
- result of warranty, support, indemnity or liability terms You offer.
-
- 3.5. Distribution of Executable Versions.
-
- You may distribute the Executable form of the Covered Software under
- the terms of this License or under the terms of a license of Your
- choice, which may contain terms different from this License,
- provided that You are in compliance with the terms of this License
- and that the license for the Executable form does not attempt to
- limit or alter the recipient's rights in the Source Code form from
- the rights set forth in this License. If You distribute the Covered
- Software in Executable form under a different license, You must make
- it absolutely clear that any terms which differ from this License
- are offered by You alone, not by the Initial Developer or
- Contributor. You hereby agree to indemnify the Initial Developer and
- every Contributor for any liability incurred by the Initial
- Developer or such Contributor as a result of any such terms You offer.
-
- 3.6. Larger Works.
-
- You may create a Larger Work by combining Covered Software with
- other code not governed by the terms of this License and distribute
- the Larger Work as a single product. In such a case, You must make
- sure the requirements of this License are fulfilled for the Covered
- Software.
-
-4. Versions of the License.
-
- 4.1. New Versions.
-
- Oracle is the initial license steward and may publish revised and/or
- new versions of this License from time to time. Each version will be
- given a distinguishing version number. Except as provided in Section
- 4.3, no one other than the license steward has the right to modify
- this License.
-
- 4.2. Effect of New Versions.
-
- You may always continue to use, distribute or otherwise make the
- Covered Software available under the terms of the version of the
- License under which You originally received the Covered Software. If
- the Initial Developer includes a notice in the Original Software
- prohibiting it from being distributed or otherwise made available
- under any subsequent version of the License, You must distribute and
- make the Covered Software available under the terms of the version
- of the License under which You originally received the Covered
- Software. Otherwise, You may also choose to use, distribute or
- otherwise make the Covered Software available under the terms of any
- subsequent version of the License published by the license steward.
-
- 4.3. Modified Versions.
-
- When You are an Initial Developer and You want to create a new
- license for Your Original Software, You may create and use a
- modified version of this License if You: (a) rename the license and
- remove any references to the name of the license steward (except to
- note that the license differs from this License); and (b) otherwise
- make it clear that the license contains terms which differ from this
- License.
-
-5. DISCLAIMER OF WARRANTY.
-
- COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
- INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE
- IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
- NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
- THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE
- DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY
- OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING,
- REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
- ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS
- AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
- 6.1. This License and the rights granted hereunder will terminate
- automatically if You fail to comply with terms herein and fail to
- cure such breach within 30 days of becoming aware of the breach.
- Provisions which, by their nature, must remain in effect beyond the
- termination of this License shall survive.
-
- 6.2. If You assert a patent infringement claim (excluding
- declaratory judgment actions) against Initial Developer or a
- Contributor (the Initial Developer or Contributor against whom You
- assert such claim is referred to as "Participant") alleging that the
- Participant Software (meaning the Contributor Version where the
- Participant is a Contributor or the Original Software where the
- Participant is the Initial Developer) directly or indirectly
- infringes any patent, then any and all rights granted directly or
- indirectly to You by such Participant, the Initial Developer (if the
- Initial Developer is not the Participant) and all Contributors under
- Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice
- from Participant terminate prospectively and automatically at the
- expiration of such 60 day notice period, unless if within such 60
- day period You withdraw Your claim with respect to the Participant
- Software against such Participant either unilaterally or pursuant to
- a written agreement with Participant.
-
- 6.3. If You assert a patent infringement claim against Participant
- alleging that the Participant Software directly or indirectly
- infringes any patent where such claim is resolved (such as by
- license or settlement) prior to the initiation of patent
- infringement litigation, then the reasonable value of the licenses
- granted by such Participant under Sections 2.1 or 2.2 shall be taken
- into account in determining the amount or value of any payment or
- license.
-
- 6.4. In the event of termination under Sections 6.1 or 6.2 above,
- all end user licenses that have been validly granted by You or any
- distributor hereunder prior to termination (excluding licenses
- granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY.
-
- UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
- (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
- INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
- COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE
- TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
- CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
- LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER
- FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
- LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE
- POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT
- APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH
- PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH
- LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR
- LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION
- AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
- The Covered Software is a "commercial item," as that term is defined
- in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
- software" (as that term is defined at 48 C.F.R. �
- 252.227-7014(a)(1)) and "commercial computer software documentation"
- as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent
- with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4
- (June 1995), all U.S. Government End Users acquire Covered Software
- with only those rights set forth herein. This U.S. Government Rights
- clause is in lieu of, and supersedes, any other FAR, DFAR, or other
- clause or provision that addresses Government rights in computer
- software under this License.
-
-9. MISCELLANEOUS.
-
- This License represents the complete agreement concerning subject
- matter hereof. If any provision of this License is held to be
- unenforceable, such provision shall be reformed only to the extent
- necessary to make it enforceable. This License shall be governed by
- the law of the jurisdiction specified in a notice contained within
- the Original Software (except to the extent applicable law, if any,
- provides otherwise), excluding such jurisdiction's conflict-of-law
- provisions. Any litigation relating to this License shall be subject
- to the jurisdiction of the courts located in the jurisdiction and
- venue specified in a notice contained within the Original Software,
- with the losing party responsible for costs, including, without
- limitation, court costs and reasonable attorneys' fees and expenses.
- The application of the United Nations Convention on Contracts for
- the International Sale of Goods is expressly excluded. Any law or
- regulation which provides that the language of a contract shall be
- construed against the drafter shall not apply to this License. You
- agree that You alone are responsible for compliance with the United
- States export administration regulations (and the export control
- laws and regulation of any other countries) when You use, distribute
- or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
- As between Initial Developer and the Contributors, each party is
- responsible for claims and damages arising, directly or indirectly,
- out of its utilization of rights under this License and You agree to
- work with Initial Developer and Contributors to distribute such
- responsibility on an equitable basis. Nothing herein is intended or
- shall be deemed to constitute any admission of liability.
-
-------------------------------------------------------------------------
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
-LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the
-State of California (excluding conflict-of-law provisions). Any
-litigation relating to this License shall be subject to the jurisdiction
-of the Federal Courts of the Northern District of California and the
-state courts of the State of California, with venue lying in Santa Clara
-County, California.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-joda-time.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-joda-time.txt
deleted file mode 100644
index 7a4a3ea242..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-joda-time.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jsonp.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jsonp.txt
deleted file mode 100644
index 4a00ba9482..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-jsonp.txt
+++ /dev/null
@@ -1,362 +0,0 @@
-COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1
-
-1. Definitions.
-
- 1.1. "Contributor" means each individual or entity that creates or
- contributes to the creation of Modifications.
-
- 1.2. "Contributor Version" means the combination of the Original
- Software, prior Modifications used by a Contributor (if any), and
- the Modifications made by that particular Contributor.
-
- 1.3. "Covered Software" means (a) the Original Software, or (b)
- Modifications, or (c) the combination of files containing Original
- Software with files containing Modifications, in each case including
- portions thereof.
-
- 1.4. "Executable" means the Covered Software in any form other than
- Source Code.
-
- 1.5. "Initial Developer" means the individual or entity that first
- makes Original Software available under this License.
-
- 1.6. "Larger Work" means a work which combines Covered Software or
- portions thereof with code not governed by the terms of this License.
-
- 1.7. "License" means this document.
-
- 1.8. "Licensable" means having the right to grant, to the maximum
- extent possible, whether at the time of the initial grant or
- subsequently acquired, any and all of the rights conveyed herein.
-
- 1.9. "Modifications" means the Source Code and Executable form of
- any of the following:
-
- A. Any file that results from an addition to, deletion from or
- modification of the contents of a file containing Original Software
- or previous Modifications;
-
- B. Any new file that contains any part of the Original Software or
- previous Modification; or
-
- C. Any new file that is contributed or otherwise made available
- under the terms of this License.
-
- 1.10. "Original Software" means the Source Code and Executable form
- of computer software code that is originally released under this
- License.
-
- 1.11. "Patent Claims" means any patent claim(s), now owned or
- hereafter acquired, including without limitation, method, process,
- and apparatus claims, in any patent Licensable by grantor.
-
- 1.12. "Source Code" means (a) the common form of computer software
- code in which modifications are made and (b) associated
- documentation included in or with such code.
-
- 1.13. "You" (or "Your") means an individual or a legal entity
- exercising rights under, and complying with all of the terms of,
- this License. For legal entities, "You" includes any entity which
- controls, is controlled by, or is under common control with You. For
- purposes of this definition, "control" means (a) the power, direct
- or indirect, to cause the direction or management of such entity,
- whether by contract or otherwise, or (b) ownership of more than
- fifty percent (50%) of the outstanding shares or beneficial
- ownership of such entity.
-
-2. License Grants.
-
- 2.1. The Initial Developer Grant.
-
- Conditioned upon Your compliance with Section 3.1 below and subject
- to third party intellectual property claims, the Initial Developer
- hereby grants You a world-wide, royalty-free, non-exclusive license:
-
- (a) under intellectual property rights (other than patent or
- trademark) Licensable by Initial Developer, to use, reproduce,
- modify, display, perform, sublicense and distribute the Original
- Software (or portions thereof), with or without Modifications,
- and/or as part of a Larger Work; and
-
- (b) under Patent Claims infringed by the making, using or selling of
- Original Software, to make, have made, use, practice, sell, and
- offer for sale, and/or otherwise dispose of the Original Software
- (or portions thereof).
-
- (c) The licenses granted in Sections 2.1(a) and (b) are effective on
- the date Initial Developer first distributes or otherwise makes the
- Original Software available to a third party under the terms of this
- License.
-
- (d) Notwithstanding Section 2.1(b) above, no patent license is
- granted: (1) for code that You delete from the Original Software, or
- (2) for infringements caused by: (i) the modification of the
- Original Software, or (ii) the combination of the Original Software
- with other software or devices.
-
- 2.2. Contributor Grant.
-
- Conditioned upon Your compliance with Section 3.1 below and subject
- to third party intellectual property claims, each Contributor hereby
- grants You a world-wide, royalty-free, non-exclusive license:
-
- (a) under intellectual property rights (other than patent or
- trademark) Licensable by Contributor to use, reproduce, modify,
- display, perform, sublicense and distribute the Modifications
- created by such Contributor (or portions thereof), either on an
- unmodified basis, with other Modifications, as Covered Software
- and/or as part of a Larger Work; and
-
- (b) under Patent Claims infringed by the making, using, or selling
- of Modifications made by that Contributor either alone and/or in
- combination with its Contributor Version (or portions of such
- combination), to make, use, sell, offer for sale, have made, and/or
- otherwise dispose of: (1) Modifications made by that Contributor (or
- portions thereof); and (2) the combination of Modifications made by
- that Contributor with its Contributor Version (or portions of such
- combination).
-
- (c) The licenses granted in Sections 2.2(a) and 2.2(b) are effective
- on the date Contributor first distributes or otherwise makes the
- Modifications available to a third party.
-
- (d) Notwithstanding Section 2.2(b) above, no patent license is
- granted: (1) for any code that Contributor has deleted from the
- Contributor Version; (2) for infringements caused by: (i) third
- party modifications of Contributor Version, or (ii) the combination
- of Modifications made by that Contributor with other software
- (except as part of the Contributor Version) or other devices; or (3)
- under Patent Claims infringed by Covered Software in the absence of
- Modifications made by that Contributor.
-
-3. Distribution Obligations.
-
- 3.1. Availability of Source Code.
-
- Any Covered Software that You distribute or otherwise make available
- in Executable form must also be made available in Source Code form
- and that Source Code form must be distributed only under the terms
- of this License. You must include a copy of this License with every
- copy of the Source Code form of the Covered Software You distribute
- or otherwise make available. You must inform recipients of any such
- Covered Software in Executable form as to how they can obtain such
- Covered Software in Source Code form in a reasonable manner on or
- through a medium customarily used for software exchange.
-
- 3.2. Modifications.
-
- The Modifications that You create or to which You contribute are
- governed by the terms of this License. You represent that You
- believe Your Modifications are Your original creation(s) and/or You
- have sufficient rights to grant the rights conveyed by this License.
-
- 3.3. Required Notices.
-
- You must include a notice in each of Your Modifications that
- identifies You as the Contributor of the Modification. You may not
- remove or alter any copyright, patent or trademark notices contained
- within the Covered Software, or any notices of licensing or any
- descriptive text giving attribution to any Contributor or the
- Initial Developer.
-
- 3.4. Application of Additional Terms.
-
- You may not offer or impose any terms on any Covered Software in
- Source Code form that alters or restricts the applicable version of
- this License or the recipients' rights hereunder. You may choose to
- offer, and to charge a fee for, warranty, support, indemnity or
- liability obligations to one or more recipients of Covered Software.
- However, you may do so only on Your own behalf, and not on behalf of
- the Initial Developer or any Contributor. You must make it
- absolutely clear that any such warranty, support, indemnity or
- liability obligation is offered by You alone, and You hereby agree
- to indemnify the Initial Developer and every Contributor for any
- liability incurred by the Initial Developer or such Contributor as a
- result of warranty, support, indemnity or liability terms You offer.
-
- 3.5. Distribution of Executable Versions.
-
- You may distribute the Executable form of the Covered Software under
- the terms of this License or under the terms of a license of Your
- choice, which may contain terms different from this License,
- provided that You are in compliance with the terms of this License
- and that the license for the Executable form does not attempt to
- limit or alter the recipient's rights in the Source Code form from
- the rights set forth in this License. If You distribute the Covered
- Software in Executable form under a different license, You must make
- it absolutely clear that any terms which differ from this License
- are offered by You alone, not by the Initial Developer or
- Contributor. You hereby agree to indemnify the Initial Developer and
- every Contributor for any liability incurred by the Initial
- Developer or such Contributor as a result of any such terms You offer.
-
- 3.6. Larger Works.
-
- You may create a Larger Work by combining Covered Software with
- other code not governed by the terms of this License and distribute
- the Larger Work as a single product. In such a case, You must make
- sure the requirements of this License are fulfilled for the Covered
- Software.
-
-4. Versions of the License.
-
- 4.1. New Versions.
-
- Oracle is the initial license steward and may publish revised and/or
- new versions of this License from time to time. Each version will be
- given a distinguishing version number. Except as provided in Section
- 4.3, no one other than the license steward has the right to modify
- this License.
-
- 4.2. Effect of New Versions.
-
- You may always continue to use, distribute or otherwise make the
- Covered Software available under the terms of the version of the
- License under which You originally received the Covered Software. If
- the Initial Developer includes a notice in the Original Software
- prohibiting it from being distributed or otherwise made available
- under any subsequent version of the License, You must distribute and
- make the Covered Software available under the terms of the version
- of the License under which You originally received the Covered
- Software. Otherwise, You may also choose to use, distribute or
- otherwise make the Covered Software available under the terms of any
- subsequent version of the License published by the license steward.
-
- 4.3. Modified Versions.
-
- When You are an Initial Developer and You want to create a new
- license for Your Original Software, You may create and use a
- modified version of this License if You: (a) rename the license and
- remove any references to the name of the license steward (except to
- note that the license differs from this License); and (b) otherwise
- make it clear that the license contains terms which differ from this
- License.
-
-5. DISCLAIMER OF WARRANTY.
-
- COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
- INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE
- IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
- NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
- THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE
- DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY
- OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING,
- REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
- ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS
- AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
-
-6. TERMINATION.
-
- 6.1. This License and the rights granted hereunder will terminate
- automatically if You fail to comply with terms herein and fail to
- cure such breach within 30 days of becoming aware of the breach.
- Provisions which, by their nature, must remain in effect beyond the
- termination of this License shall survive.
-
- 6.2. If You assert a patent infringement claim (excluding
- declaratory judgment actions) against Initial Developer or a
- Contributor (the Initial Developer or Contributor against whom You
- assert such claim is referred to as "Participant") alleging that the
- Participant Software (meaning the Contributor Version where the
- Participant is a Contributor or the Original Software where the
- Participant is the Initial Developer) directly or indirectly
- infringes any patent, then any and all rights granted directly or
- indirectly to You by such Participant, the Initial Developer (if the
- Initial Developer is not the Participant) and all Contributors under
- Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice
- from Participant terminate prospectively and automatically at the
- expiration of such 60 day notice period, unless if within such 60
- day period You withdraw Your claim with respect to the Participant
- Software against such Participant either unilaterally or pursuant to
- a written agreement with Participant.
-
- 6.3. If You assert a patent infringement claim against Participant
- alleging that the Participant Software directly or indirectly
- infringes any patent where such claim is resolved (such as by
- license or settlement) prior to the initiation of patent
- infringement litigation, then the reasonable value of the licenses
- granted by such Participant under Sections 2.1 or 2.2 shall be taken
- into account in determining the amount or value of any payment or
- license.
-
- 6.4. In the event of termination under Sections 6.1 or 6.2 above,
- all end user licenses that have been validly granted by You or any
- distributor hereunder prior to termination (excluding licenses
- granted to You by any distributor) shall survive termination.
-
-7. LIMITATION OF LIABILITY.
-
- UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
- (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE
- INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF
- COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE
- TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR
- CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT
- LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER
- FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR
- LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE
- POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT
- APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH
- PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH
- LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR
- LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION
- AND LIMITATION MAY NOT APPLY TO YOU.
-
-8. U.S. GOVERNMENT END USERS.
-
- The Covered Software is a "commercial item," as that term is defined
- in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
- software" (as that term is defined at 48 C.F.R. §
- 252.227-7014(a)(1)) and "commercial computer software documentation"
- as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent
- with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4
- (June 1995), all U.S. Government End Users acquire Covered Software
- with only those rights set forth herein. This U.S. Government Rights
- clause is in lieu of, and supersedes, any other FAR, DFAR, or other
- clause or provision that addresses Government rights in computer
- software under this License.
-
-9. MISCELLANEOUS.
-
- This License represents the complete agreement concerning subject
- matter hereof. If any provision of this License is held to be
- unenforceable, such provision shall be reformed only to the extent
- necessary to make it enforceable. This License shall be governed by
- the law of the jurisdiction specified in a notice contained within
- the Original Software (except to the extent applicable law, if any,
- provides otherwise), excluding such jurisdiction's conflict-of-law
- provisions. Any litigation relating to this License shall be subject
- to the jurisdiction of the courts located in the jurisdiction and
- venue specified in a notice contained within the Original Software,
- with the losing party responsible for costs, including, without
- limitation, court costs and reasonable attorneys' fees and expenses.
- The application of the United Nations Convention on Contracts for
- the International Sale of Goods is expressly excluded. Any law or
- regulation which provides that the language of a contract shall be
- construed against the drafter shall not apply to this License. You
- agree that You alone are responsible for compliance with the United
- States export administration regulations (and the export control
- laws and regulation of any other countries) when You use, distribute
- or otherwise make available any Covered Software.
-
-10. RESPONSIBILITY FOR CLAIMS.
-
- As between Initial Developer and the Contributors, each party is
- responsible for claims and damages arising, directly or indirectly,
- out of its utilization of rights under this License and You agree to
- work with Initial Developer and Contributors to distribute such
- responsibility on an equitable basis. Nothing herein is intended or
- shall be deemed to constitute any admission of liability.
-
-------------------------------------------------------------------------
-
-NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION
-LICENSE (CDDL)
-
-The code released under the CDDL shall be governed by the laws of the
-State of California (excluding conflict-of-law provisions). Any
-litigation relating to this License shall be subject to the jurisdiction
-of the Federal Courts of the Northern District of California and the
-state courts of the State of California, with venue lying in Santa Clara
-County, California.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-junit5.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-junit5.txt
deleted file mode 100644
index 8ebced110a..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-junit5.txt
+++ /dev/null
@@ -1,98 +0,0 @@
-Eclipse Public License - v 2.0
-==============================
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (“AGREEMENT”). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-### 1. Definitions
-
-“Contribution” means:
-* **a)** in the case of the initial Contributor, the initial content Distributed under this Agreement, and
-* **b)** in the case of each subsequent Contributor:
- * **i)** changes to the Program, and
- * **ii)** additions to the Program;
-where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution “originates” from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works.
-
-“Contributor” means any person or entity that Distributes the Program.
-
-“Licensed Patents” mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-“Program” means the Contributions Distributed in accordance with this Agreement.
-
-“Recipient” means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors.
-
-“Derivative Works” shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.
-
-“Modified Works” shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof.
-
-“Distribute” means the acts of **a)** distributing or **b)** making available in any manner that enables the transfer of a copy.
-
-“Source Code” means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-“Secondary License” means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor.
-
-### 2. Grant of Rights
-
-**a)** Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works.
-
-**b)** Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-
-**c)** Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
-
-**d)** Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-
-**e)** Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3).
-
-### 3. Requirements
-
-**3.1** If a Contributor Distributes the Program in any form, then:
-
-* **a)** the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and
-
-* **b)** the Contributor may Distribute the Program under a license different than this Agreement, provided that such license:
- * **i)** effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
- * **ii)** effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
- * **iii)** does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and
- * **iv)** requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3.
-
-**3.2** When the Program is Distributed as Source Code:
-
-* **a)** it must be made available under this Agreement, or if the Program **(i)** is combined with other material in a separate file or files made available under a Secondary License, and **(ii)** the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and
-* **b)** a copy of this Agreement must be included with each copy of the Program.
-
-**3.3** Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability (“notices”) contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices.
-
-### 4. Commercial Distribution
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (“Commercial Contributor”) hereby agrees to defend and indemnify every other Contributor (“Indemnified Contributor”) against any losses, damages and costs (collectively “Losses”) arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: **a)** promptly notify the Commercial Contributor in writing of such claim, and **b)** allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-### 5. No Warranty
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-### 6. Disclaimer of Liability
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-### 7. General
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version.
-
-Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement.
-
-#### Exhibit A - Form of Secondary Licenses Notice
-
-> “This Source Code may also be made available under the following Secondary Licenses when the conditions for such availability set forth in the Eclipse Public License, v. 2.0 are satisfied: {name license(s), version(s), and exceptions or additional permissions here}.”
-
-Simply including a copy of this Agreement, including this Exhibit A is not sufficient to license the Source Code under Secondary Licenses.
-
-If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice.
-
-You may add additional accurate notices of copyright ownership.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-log4j-core.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-log4j-core.txt
deleted file mode 100644
index 6279e5206d..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-log4j-core.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 1999-2005 The Apache Software Foundation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-netty.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-netty.txt
deleted file mode 100644
index e25e752cf1..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-netty.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- https://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- https://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-opentracing-java.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-opentracing-java.txt
deleted file mode 100644
index 8dada3edaf..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-opentracing-java.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "{}"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright {yyyy} {name of copyright owner}
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-perfmark.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-perfmark.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-perfmark.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-protobuf.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-protobuf.txt
deleted file mode 100644
index 97a6e3d199..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-protobuf.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-Copyright 2008 Google Inc. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Code generated by the Protocol Buffer compiler is owned by the owner
-of the input file used when generating it. This code is not
-standalone and requires a support library to be linked with it. This
-support library is itself covered by the above license.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-slf4j.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-slf4j.txt
deleted file mode 100644
index a51675a21c..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-slf4j.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright (c) 2004-2022 QOS.ch Sarl (Switzerland)
-All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-bolt.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-bolt.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-bolt.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-boot.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-boot.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-boot.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-common-tools.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-common-tools.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-common-tools.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-hessian.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-hessian.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-hessian.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-lookout.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-lookout.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-lookout.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-rpc.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-rpc.txt
deleted file mode 100644
index f49a4e16e6..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-sofa-rpc.txt
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-annotations.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-annotations.txt
deleted file mode 100644
index e280013182..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-annotations.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Copyright 2016 SmartBear Software
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at [apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-core.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-core.txt
deleted file mode 100644
index 3e5194180d..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-core.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright (c) 2015. SmartBear Software Inc.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-models.txt b/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-models.txt
deleted file mode 100644
index e280013182..0000000000
--- a/hugegraph-commons/hugegraph-dist/release-docs/licenses/LICENSE-swagger-models.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Copyright 2016 SmartBear Software
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at [apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
\ No newline at end of file
diff --git a/hugegraph-commons/hugegraph-dist/scripts/apache-release.sh b/hugegraph-commons/hugegraph-dist/scripts/apache-release.sh
deleted file mode 100755
index 66faae9ce9..0000000000
--- a/hugegraph-commons/hugegraph-dist/scripts/apache-release.sh
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-GROUP="hugegraph"
-# current repository name
-REPO="${GROUP}-commons"
-# release version (input by committer)
-RELEASE_VERSION=$1
-USERNAME=$2
-PASSWORD=$3
-# git release branch (check it carefully)
-GIT_BRANCH="release-${RELEASE_VERSION}"
-
-RELEASE_VERSION=${RELEASE_VERSION:?"Please input the release version behind script"}
-
-WORK_DIR=$(
- cd "$(dirname "$0")" || exit
- pwd
-)
-cd "${WORK_DIR}" || exit
-echo "In the work dir: $(pwd)"
-
-# clean old dir then build a new one
-rm -rf dist && mkdir -p dist/apache-${REPO}
-
-# step1: package the source code
-cd ../../ || exit
-git archive --format=tar.gz \
- --output="${GROUP}-dist/scripts/dist/apache-${REPO}/apache-${REPO}-incubating-${RELEASE_VERSION}-src.tar.gz" \
- --prefix="apache-${REPO}-incubating-${RELEASE_VERSION}-src/" "${GIT_BRANCH}" || exit
-
-cd - || exit
-
-# step2: copy the binary file (Optional)
-# Note: it's optional for project to generate binary package (skip this step if not need)
-#cp -v ../../target/apache-${REPO}-incubating-"${RELEASE_VERSION}".tar.gz \
-# dist/apache-${REPO} || exit
-
-# step3: sign + hash
-##### 3.1 sign in source & binary package
-gpg --version 1>/dev/null || exit
-cd ./dist/apache-${REPO} || exit
-for i in *.tar.gz; do
- echo "$i" && gpg --armor --output "$i".asc --detach-sig "$i"
-done
-
-##### 3.2 Generate SHA512 file
-shasum --version 1>/dev/null || exit
-for i in *.tar.gz; do
- shasum -a 512 "$i" | tee "$i".sha512
-done
-
-#### 3.3 check signature & sha512
-echo "#### start to check signature & hashcode ####"
-for i in *.tar.gz; do
- echo "$i"
- gpg --verify "$i".asc "$i" || exit
-done
-
-for i in *.tar.gz; do
- echo "$i"
- shasum -a 512 --check "$i".sha512 || exit
-done
-
-# step4: upload to Apache-SVN
-SVN_DIR="${GROUP}-svn-dev"
-cd ../
-rm -rfv ${SVN_DIR}
-
-##### 4.1 pull from remote & copy files
-svn co "https://dist.apache.org/repos/dist/dev/incubator/${GROUP}" ${SVN_DIR}
-mkdir -p ${SVN_DIR}/"${RELEASE_VERSION}"
-cp -v apache-${REPO}/*tar.gz* "${SVN_DIR}/${RELEASE_VERSION}"
-cd ${SVN_DIR} || exit
-
-##### 4.2 check status first
-svn status
-svn add --parents "${RELEASE_VERSION}"/apache-${REPO}-*
-# check status again
-svn status
-
-##### 4.3 commit & push files
-if [ "$USERNAME" = "" ]; then
- svn commit -m "submit files for ${REPO} ${RELEASE_VERSION}" || exit
-else
- svn commit -m "submit files for ${REPO} ${RELEASE_VERSION}" \
- --username "${USERNAME}" --password "${PASSWORD}" || exit
-fi
-
-echo "Finished all, please check all steps in script manually again!"
diff --git a/hugegraph-commons/hugegraph-dist/scripts/dependency/known-dependencies.txt b/hugegraph-commons/hugegraph-dist/scripts/dependency/known-dependencies.txt
deleted file mode 100644
index 5db5f373f8..0000000000
--- a/hugegraph-commons/hugegraph-dist/scripts/dependency/known-dependencies.txt
+++ /dev/null
@@ -1,75 +0,0 @@
-animal-sniffer-annotations-1.18.jar
-annotations-13.0.jar
-annotations-4.1.1.4.jar
-bolt-1.6.2.jar
-checker-qual-3.5.0.jar
-commons-beanutils-1.9.4.jar
-commons-codec-1.13.jar
-commons-collections-3.2.2.jar
-commons-configuration-1.10.jar
-commons-configuration2-2.8.0.jar
-commons-io-2.7.jar
-commons-lang-2.6.jar
-commons-lang3-3.12.0.jar
-commons-logging-1.1.1.jar
-commons-text-1.9.jar
-disruptor-3.3.7.jar
-error_prone_annotations-2.3.4.jar
-failureaccess-1.0.1.jar
-grpc-api-1.28.1.jar
-grpc-context-1.28.1.jar
-grpc-core-1.28.1.jar
-grpc-netty-shaded-1.28.0.jar
-grpc-protobuf-1.28.0.jar
-grpc-protobuf-lite-1.28.0.jar
-grpc-stub-1.28.0.jar
-gson-2.8.6.jar
-guava-30.0-jre.jar
-hamcrest-core-1.3.jar
-hessian-3.3.7.jar
-j2objc-annotations-1.3.jar
-jackson-annotations-2.14.0-rc1.jar
-jackson-core-2.14.0-rc1.jar
-jackson-databind-2.14.0-rc1.jar
-jackson-dataformat-yaml-2.9.3.jar
-jackson-jaxrs-base-2.14.0-rc1.jar
-jackson-jaxrs-json-provider-2.14.0-rc1.jar
-jackson-module-jaxb-annotations-2.14.0-rc1.jar
-jakarta.activation-2.0.1.jar
-jakarta.activation-api-1.2.2.jar
-javassist-3.28.0-GA.jar
-javax.json-1.0.jar
-jaxb-core-3.0.2.jar
-jaxb-impl-3.0.2.jar
-joda-time-2.10.8.jar
-jsr305-3.0.1.jar
-junit-4.13.1.jar
-kotlin-stdlib-1.6.20.jar
-kotlin-stdlib-common-1.5.31.jar
-kotlin-stdlib-jdk7-1.6.10.jar
-kotlin-stdlib-jdk8-1.6.10.jar
-listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
-log4j-api-2.18.0.jar
-log4j-core-2.18.0.jar
-log4j-slf4j-impl-2.18.0.jar
-logging-interceptor-4.10.0.jar
-lookout-api-1.4.1.jar
-netty-all-4.1.42.Final.jar
-okhttp-4.10.0.jar
-okio-jvm-3.0.0.jar
-opentracing-api-0.22.0.jar
-opentracing-mock-0.22.0.jar
-opentracing-noop-0.22.0.jar
-opentracing-util-0.22.0.jar
-perfmark-api-0.19.0.jar
-proto-google-common-protos-1.17.0.jar
-protobuf-java-3.11.0.jar
-slf4j-api-1.7.25.jar
-snakeyaml-1.18.jar
-sofa-common-tools-1.0.12.jar
-sofa-rpc-all-5.7.6.jar
-swagger-annotations-1.5.18.jar
-swagger-core-1.5.18.jar
-swagger-models-1.5.18.jar
-tracer-core-3.0.8.jar
-validation-api-1.1.0.Final.jar
diff --git a/hugegraph-commons/pom.xml b/hugegraph-commons/pom.xml
index 59d12b99ad..b9e780bd32 100644
--- a/hugegraph-commons/pom.xml
+++ b/hugegraph-commons/pom.xml
@@ -50,7 +50,7 @@
- Apache Hugegraph(Incubating)
+ Apache HugeGraph
dev-subscribe@hugegraph.apache.org
https://hugegraph.apache.org/
@@ -61,7 +61,7 @@
Developer List
dev-subscribe@hugegraph.apache.org
dev-unsubscribe@hugegraph.apache.org
- dev@hugegraph.incubator.apache.org
+ dev@hugegraph.apache.org
Commits List
diff --git a/hugegraph-pd/AGENTS.md b/hugegraph-pd/AGENTS.md
index e1d915491d..aaaa861f39 100644
--- a/hugegraph-pd/AGENTS.md
+++ b/hugegraph-pd/AGENTS.md
@@ -10,8 +10,6 @@ HugeGraph PD (Placement Driver) is a meta server for distributed HugeGraph deplo
- Store node monitoring and scheduling
- Metadata coordination using Raft consensus
-**Status**: BETA (since HugeGraph 1.5.0)
-
**Technology Stack**:
- Java 11+ (required)
- Apache Maven 3.5+
@@ -112,7 +110,7 @@ mvn clean install
# Build distribution package only
mvn clean package -pl hg-pd-dist -am -DskipTests
-# Output: hg-pd-dist/target/apache-hugegraph-pd-incubating-.tar.gz
+# Output: hugegraph-pd/apache-hugegraph-pd-.tar.gz
```
### Running Tests
@@ -167,7 +165,7 @@ mvn clean
After building, extract the tarball:
```
-apache-hugegraph-pd-incubating-/
+apache-hugegraph-pd-/
├── bin/
│ ├── start-hugegraph-pd.sh # Start PD server
│ ├── stop-hugegraph-pd.sh # Stop PD server
@@ -185,7 +183,7 @@ apache-hugegraph-pd-incubating-/
### Starting PD
```bash
-cd apache-hugegraph-pd-incubating-/
+cd apache-hugegraph-pd-/
bin/start-hugegraph-pd.sh
# With custom GC options
@@ -249,7 +247,7 @@ store:
### Common Configuration Errors
1. **Raft peer discovery failure**: `raft.peers-list` must include all PD nodes' `raft.address` values
-2. **Store connection issues**: `grpc.host` must be a reachable IP (not `127.0.0.1`) for distributed deployments
+2. **Store connection issues**: `grpc.host` must be a reachable IP (not `127.0.0.1`) for distributed deployments. In Docker bridge networking, use the container hostname (e.g., `pd0`) set via `HG_PD_GRPC_HOST` env var.
3. **Split-brain scenarios**: Always run 3 or 5 PD nodes in production for Raft quorum
4. **Partition imbalance**: Adjust `patrol-interval` for faster/slower rebalancing
@@ -333,7 +331,7 @@ docker run -d -p 8620:8620 -p 8686:8686 -p 8610:8610 \
hugegraph-pd:latest
# For production clusters, use Docker Compose or Kubernetes
-# See: hugegraph-server/hugegraph-dist/docker/example/
+# See: ../docker/docker-compose-3pd-3store-3server.yml and ../docker/README.md
```
Exposed ports: 8620 (REST), 8686 (gRPC), 8610 (Raft)
diff --git a/hugegraph-pd/Dockerfile b/hugegraph-pd/Dockerfile
index 0303252dbb..41cac1adb6 100644
--- a/hugegraph-pd/Dockerfile
+++ b/hugegraph-pd/Dockerfile
@@ -1,3 +1,4 @@
+# syntax=docker/dockerfile:1
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -19,32 +20,32 @@
# 1st stage: build source code
FROM maven:3.9.0-eclipse-temurin-11 AS build
-COPY . /pkg
WORKDIR /pkg
+
+COPY . .
+
ARG MAVEN_ARGS
-RUN mvn package $MAVEN_ARGS -e -B -ntp -Dmaven.test.skip=true -Dmaven.javadoc.skip=true && pwd && ls -l && rm \
- ./hugegraph-server/*.tar.gz && rm ./hugegraph-pd/*.tar.gz && rm ./hugegraph-store/*.tar.gz
+RUN --mount=type=cache,target=/root/.m2 \
+ mvn package $MAVEN_ARGS -e -B -ntp -Dmaven.test.skip=true -Dmaven.javadoc.skip=true \
+ && rm ./hugegraph-server/*.tar.gz ./hugegraph-pd/*.tar.gz ./hugegraph-store/*.tar.gz
# 2nd stage: runtime env
# Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13
-FROM openjdk:11-slim
+FROM eclipse-temurin:11-jre-jammy
-COPY --from=build /pkg/hugegraph-pd/apache-hugegraph-pd-incubating-*/ /hugegraph-pd/
+COPY --from=build /pkg/hugegraph-pd/apache-hugegraph-pd-*/ /hugegraph-pd/
LABEL maintainer="HugeGraph Docker Maintainers "
# TODO: use g1gc or zgc as default
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50 -XshowSettings:vm" \
- HUGEGRAPH_HOME="hugegraph-pd"
+ HUGEGRAPH_HOME="hugegraph-pd" \
+ STDOUT_MODE="true"
-#COPY . /hugegraph/hugegraph-pd
WORKDIR /hugegraph-pd/
-# 1. Install environment and init HugeGraph Sever
-RUN set -x \
- && rm /var/lib/dpkg/info/libc-bin.* \
- && apt-get -q clean \
- && apt-get -q update \
+# 1. Install runtime dependencies
+RUN apt-get -q update \
&& apt-get -q install -y --no-install-recommends --no-install-suggests \
dumb-init \
procps \
@@ -53,9 +54,7 @@ RUN set -x \
vim \
cron \
&& apt-get clean \
- && rm -rf /var/lib/apt/lists/* \
- && service cron start \
- && pwd && cd /hugegraph-pd/
+ && rm -rf /var/lib/apt/lists/*
# 2. Init docker script
COPY hugegraph-pd/hg-pd-dist/docker/docker-entrypoint.sh .
diff --git a/hugegraph-pd/README.md b/hugegraph-pd/README.md
index 3ff14b9e2a..b900673ace 100644
--- a/hugegraph-pd/README.md
+++ b/hugegraph-pd/README.md
@@ -3,8 +3,6 @@
[](https://www.apache.org/licenses/LICENSE-2.0.html)
[](https://github.com/apache/hugegraph)
-> **Note**: From revision 1.5.0, the HugeGraph-PD code has been adapted to this location.
-
## Overview
HugeGraph PD (Placement Driver) is a meta server that provides cluster management and coordination services for HugeGraph distributed deployments. It serves as the central control plane responsible for:
@@ -15,7 +13,7 @@ HugeGraph PD (Placement Driver) is a meta server that provides cluster managemen
- **Node Scheduling**: Intelligent scheduling and load balancing of graph operations
- **Health Monitoring**: Continuous health checks and failure detection via heartbeat mechanism
-PD uses [Apache JRaft](https://github.com/sofastack/sofa-jraft) for Raft consensus and RocksDB for persistent metadata storage, ensuring high availability and consistency in distributed environments.
+PD uses [SOFA-jraft](https://github.com/sofastack/sofa-jraft) for Raft consensus and RocksDB for persistent metadata storage, ensuring high availability and consistency in distributed environments.
## Architecture
@@ -156,6 +154,36 @@ raft:
For detailed configuration options and production tuning, see [Configuration Guide](docs/configuration.md).
+#### Docker Bridge Network Example
+
+When running PD in Docker with bridge networking (e.g., `docker/docker-compose-3pd-3store-3server.yml`), configuration is injected via environment variables instead of editing `application.yml` directly. Container hostnames are used instead of IP addresses:
+
+**pd0** container:
+```bash
+HG_PD_GRPC_HOST=pd0
+HG_PD_RAFT_ADDRESS=pd0:8610
+HG_PD_RAFT_PEERS_LIST=pd0:8610,pd1:8610,pd2:8610
+HG_PD_INITIAL_STORE_LIST=store0:8500,store1:8500,store2:8500
+```
+
+**pd1** container:
+```bash
+HG_PD_GRPC_HOST=pd1
+HG_PD_RAFT_ADDRESS=pd1:8610
+HG_PD_RAFT_PEERS_LIST=pd0:8610,pd1:8610,pd2:8610
+HG_PD_INITIAL_STORE_LIST=store0:8500,store1:8500,store2:8500
+```
+
+**pd2** container:
+```bash
+HG_PD_GRPC_HOST=pd2
+HG_PD_RAFT_ADDRESS=pd2:8610
+HG_PD_RAFT_PEERS_LIST=pd0:8610,pd1:8610,pd2:8610
+HG_PD_INITIAL_STORE_LIST=store0:8500,store1:8500,store2:8500
+```
+
+See [docker/README.md](../docker/README.md) for the full environment variable reference.
+
### Verify Deployment
Check if PD is running:
@@ -205,22 +233,25 @@ Build PD Docker image:
```bash
# From project root
-docker build -f hugegraph-pd/Dockerfile -t hugegraph-pd:latest .
+docker build -f hugegraph-pd/Dockerfile -t hugegraph/pd:latest .
# Run container
docker run -d \
-p 8620:8620 \
-p 8686:8686 \
-p 8610:8610 \
- -v /path/to/conf:/hugegraph-pd/conf \
+ -e HG_PD_GRPC_HOST= \
+ -e HG_PD_RAFT_ADDRESS=:8610 \
+ -e HG_PD_RAFT_PEERS_LIST=:8610 \
+ -e HG_PD_INITIAL_STORE_LIST=:8500 \
-v /path/to/data:/hugegraph-pd/pd_data \
--name hugegraph-pd \
- hugegraph-pd:latest
+ hugegraph/pd:latest
```
For Docker Compose examples with HugeGraph Store and Server, see:
```
-hugegraph-server/hugegraph-dist/docker/example/
+docker/docker-compose-3pd-3store-3server.yml
```
## Documentation
@@ -256,21 +287,9 @@ PD exposes metrics via REST API at:
## Community
-- **Website**: https://hugegraph.apache.org
- **Documentation**: https://hugegraph.apache.org/docs/
- **GitHub**: https://github.com/apache/hugegraph
-- **Mailing List**: dev@hugegraph.apache.org
## Contributing
Contributions are welcome! Please read our [Development Guide](docs/development.md) and follow the Apache HugeGraph contribution guidelines.
-
-## License
-
-HugeGraph PD is licensed under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0).
-
----
-
-**Status**: BETA (from v1.5.0+)
-
-For questions or issues, please contact the HugeGraph community via GitHub issues or mailing list.
diff --git a/hugegraph-pd/docs/configuration.md b/hugegraph-pd/docs/configuration.md
index f66ddbd043..e3ae4f6f25 100644
--- a/hugegraph-pd/docs/configuration.md
+++ b/hugegraph-pd/docs/configuration.md
@@ -53,7 +53,7 @@ grpc:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
-| `grpc.host` | String | `127.0.0.1` | **IMPORTANT**: Must be set to actual IP address (not `127.0.0.1`) for distributed deployments. Store and Server nodes connect to this address. |
+| `grpc.host` | String | `127.0.0.1` | **IMPORTANT**: Must be set to actual IP address (not `127.0.0.1`) for distributed deployments. Store and Server nodes connect to this address. In Docker bridge networking, set this to the container hostname (e.g., `pd0`) via `HG_PD_GRPC_HOST` env var. |
| `grpc.port` | Integer | `8686` | gRPC server port. Ensure this port is accessible from Store and Server nodes. |
**Production Notes**:
@@ -119,6 +119,31 @@ raft:
peers-list: 192.168.1.10:8610,192.168.1.11:8610,192.168.1.12:8610
```
+### Docker Bridge Network Deployment
+
+When deploying PD in Docker with bridge networking (e.g., `docker/docker-compose-3pd-3store-3server.yml`), container hostnames are used instead of IP addresses. Configuration is injected via `HG_PD_*` environment variables:
+
+```yaml
+# pd0 — set via HG_PD_RAFT_ADDRESS and HG_PD_RAFT_PEERS_LIST env vars
+raft:
+ address: pd0:8610
+ peers-list: pd0:8610,pd1:8610,pd2:8610
+
+# pd1
+raft:
+ address: pd1:8610
+ peers-list: pd0:8610,pd1:8610,pd2:8610
+
+# pd2
+raft:
+ address: pd2:8610
+ peers-list: pd0:8610,pd1:8610,pd2:8610
+```
+
+The `grpc.host` must also use the container hostname (e.g., `pd0`) set via `HG_PD_GRPC_HOST`. Do not use `127.0.0.1` or `0.0.0.0` in bridge networking mode.
+
+See [docker/README.md](../../docker/README.md) for the full environment variable reference.
+
### PD Core Settings
Controls PD-specific behavior.
@@ -726,7 +751,7 @@ pd_partition_count 36.0
### Pre-Deployment Checklist
-- [ ] `grpc.host` set to actual IP address (not `127.0.0.1`)
+- [ ] `grpc.host` set to actual IP address or container hostname (not `127.0.0.1`). For Docker bridge networking use container hostname via `HG_PD_GRPC_HOST` env var.
- [ ] `raft.address` unique for each PD node
- [ ] `raft.peers-list` identical on all PD nodes
- [ ] `raft.peers-list` contains all PD node addresses
diff --git a/hugegraph-pd/docs/development.md b/hugegraph-pd/docs/development.md
index 691fcd9b7c..3f01b902ea 100644
--- a/hugegraph-pd/docs/development.md
+++ b/hugegraph-pd/docs/development.md
@@ -63,9 +63,8 @@ cd hugegraph-pd
#### Configure Code Style
1. **File → Settings → Editor → Code Style**
-2. **Import Scheme → IntelliJ IDEA code style XML**
-3. Select `hugegraph-style.xml` from repository root
-4. **Apply** and **OK**
+2. Ensure **Enable EditorConfig support** is checked
+3. **Apply** and **OK**
#### Enable Annotation Processing
@@ -181,26 +180,26 @@ mvn test jacoco:report
```bash
# Core module tests
-mvn test -pl hg-pd-test -am -P pd-core-test
+mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-core-test
# Client module tests
-mvn test -pl hg-pd-test -am -P pd-client-test
+mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-client-test
# Common module tests
-mvn test -pl hg-pd-test -am -P pd-common-test
+mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-common-test
# REST API tests
-mvn test -pl hg-pd-test -am -P pd-rest-test
+mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-rest-test
```
#### Single Test Class
```bash
# Run specific test class
-mvn test -pl hg-pd-test -am -Dtest=PartitionServiceTest
+mvn -pl hugegraph-pd/hg-pd-test test -Dtest=PartitionServiceTest -DfailIfNoTests=false
# Run specific test method
-mvn test -pl hg-pd-test -am -Dtest=PartitionServiceTest#testSplitPartition
+mvn -pl hugegraph-pd/hg-pd-test test -Dtest=PartitionServiceTest#testSplitPartition -DfailIfNoTests=false
```
#### Test from IDE
@@ -227,15 +226,6 @@ open hg-pd-test/target/site/jacoco/index.html
- Utility classes: >70%
- Generated gRPC code: Excluded from coverage
-### Integration Tests
-
-Integration tests start embedded PD instances and verify end-to-end functionality.
-
-```bash
-# Run integration test suite
-mvn test -pl hg-pd-test -am -Dtest=PDCoreSuiteTest
-```
-
**What Integration Tests Cover**:
- Raft cluster formation and leader election
- Partition allocation and balancing
@@ -243,220 +233,6 @@ mvn test -pl hg-pd-test -am -Dtest=PDCoreSuiteTest
- Metadata persistence and recovery
- gRPC service interactions
-## Development Workflows
-
-### Adding a New gRPC Service
-
-#### 1. Define Protocol Buffers
-
-Create or modify `.proto` file in `hg-pd-grpc/src/main/proto/`:
-
-```protobuf
-// example_service.proto
-syntax = "proto3";
-
-package org.apache.hugegraph.pd.grpc;
-
-service ExampleService {
- rpc DoSomething(DoSomethingRequest) returns (DoSomethingResponse);
-}
-
-message DoSomethingRequest {
- string input = 1;
-}
-
-message DoSomethingResponse {
- string output = 1;
-}
-```
-
-#### 2. Generate Java Stubs
-
-```bash
-cd hugegraph-pd
-mvn clean compile -pl hg-pd-grpc
-
-# Generated files location:
-# hg-pd-grpc/target/generated-sources/protobuf/java/
-# hg-pd-grpc/target/generated-sources/protobuf/grpc-java/
-```
-
-**Note**: Generated files are excluded from source control (`.gitignore`)
-
-#### 3. Implement Service
-
-Create service implementation in `hg-pd-service`:
-
-```java
-// ExampleServiceImpl.java
-package org.apache.hugegraph.pd.service;
-
-import io.grpc.stub.StreamObserver;
-import org.apache.hugegraph.pd.grpc.ExampleServiceGrpc;
-
-public class ExampleServiceImpl extends ExampleServiceGrpc.ExampleServiceImplBase {
-
- @Override
- public void doSomething(DoSomethingRequest request,
- StreamObserver responseObserver) {
- String output = processInput(request.getInput());
-
- DoSomethingResponse response = DoSomethingResponse.newBuilder()
- .setOutput(output)
- .build();
-
- responseObserver.onNext(response);
- responseObserver.onCompleted();
- }
-
- private String processInput(String input) {
- // Business logic here
- return "Processed: " + input;
- }
-}
-```
-
-#### 4. Register Service
-
-Register service in gRPC server (in `hg-pd-service`):
-
-```java
-// In GrpcServerInitializer or similar
-ExampleServiceImpl exampleService = new ExampleServiceImpl();
-grpcServer.addService(exampleService);
-```
-
-#### 5. Add Tests
-
-Create test class in `hg-pd-test`:
-
-```java
-// ExampleServiceTest.java
-package org.apache.hugegraph.pd.service;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-public class ExampleServiceTest extends BaseTest {
-
- @Test
- public void testDoSomething() {
- ExampleServiceImpl service = new ExampleServiceImpl();
- // Test service logic...
- }
-}
-```
-
-#### 6. Update Documentation
-
-Document the new API in `docs/api-reference.md`.
-
-### Modifying Partition Logic
-
-Partition logic is in `hg-pd-core/.../PartitionService.java` (2000+ lines).
-
-**Key Methods**:
-- `splitPartition()`: Partition splitting
-- `balancePartitions()`: Auto-balancing
-- `updatePartitionLeader()`: Leader changes
-- `getPartitionByCode()`: Partition routing
-
-**Development Process**:
-
-1. **Understand Current Logic**:
- ```bash
- # Read relevant methods
- # File: hg-pd-core/src/main/java/.../PartitionService.java
- ```
-
-2. **Make Changes**:
- - Modify partition allocation algorithm
- - Update balancing logic
- - Add new partition operations
-
-3. **Test Changes**:
- ```bash
- # Run partition service tests
- mvn test -pl hg-pd-test -am -Dtest=PartitionServiceTest
-
- # Run integration tests
- mvn test -pl hg-pd-test -am -Dtest=PDCoreSuiteTest
- ```
-
-4. **Submit Raft Proposals**:
- All partition metadata changes must go through Raft:
- ```java
- // Example: Update partition metadata via Raft
- KVOperation operation = KVOperation.put(key, value);
- raftTaskHandler.submitTask(operation, closure);
- ```
-
-### Adding a New Metadata Store
-
-Metadata stores extend `MetadataRocksDBStore` (in `hg-pd-core/.../meta/`).
-
-**Example**: Creating `GraphMetaStore`:
-
-```java
-package org.apache.hugegraph.pd.meta;
-
-public class GraphMetaStore extends MetadataRocksDBStore {
-
- private static final String GRAPH_PREFIX = "@GRAPH@";
-
- public GraphMetaStore(PDConfig config) {
- super(config);
- }
-
- public void saveGraph(String graphName, Graph graph) throws PDException {
- String key = GRAPH_PREFIX + graphName;
- byte[] value = serialize(graph);
- put(key.getBytes(), value);
- }
-
- public Graph getGraph(String graphName) throws PDException {
- String key = GRAPH_PREFIX + graphName;
- byte[] value = get(key.getBytes());
- return deserialize(value, Graph.class);
- }
-
- public List listGraphs() throws PDException {
- List graphs = new ArrayList<>();
- String startKey = GRAPH_PREFIX;
- String endKey = GRAPH_PREFIX + "\uffff";
-
- scan(startKey.getBytes(), endKey.getBytes(), (key, value) -> {
- Graph graph = deserialize(value, Graph.class);
- graphs.add(graph);
- return true; // Continue scanning
- });
-
- return graphs;
- }
-
- private byte[] serialize(Object obj) {
- // Use Hessian2 or Protocol Buffers
- }
-
- private T deserialize(byte[] bytes, Class clazz) {
- // Deserialize bytes to object
- }
-}
-```
-
-**Testing**:
-```java
-@Test
-public void testGraphMetaStore() {
- GraphMetaStore store = new GraphMetaStore(config);
-
- Graph graph = new Graph("test_graph", 12);
- store.saveGraph("test_graph", graph);
-
- Graph retrieved = store.getGraph("test_graph");
- assertEquals("test_graph", retrieved.getName());
-}
-```
### Debugging Raft Issues
@@ -500,9 +276,9 @@ ls -lh pd_data/raft/snapshot/
HugeGraph PD follows Apache HugeGraph code style.
-**Import Code Style**:
+**IDE Configuration**:
1. IntelliJ IDEA: **File → Settings → Editor → Code Style**
-2. **Import Scheme** → Select `hugegraph-style.xml` (in repository root)
+2. Ensure **Enable EditorConfig support** is checked
**Key Style Rules**:
- **Indentation**: 4 spaces (no tabs)
diff --git a/hugegraph-pd/hg-pd-client/src/main/java/org/apache/hugegraph/pd/client/PDConfig.java b/hugegraph-pd/hg-pd-client/src/main/java/org/apache/hugegraph/pd/client/PDConfig.java
index a14c324251..6ab70192ff 100644
--- a/hugegraph-pd/hg-pd-client/src/main/java/org/apache/hugegraph/pd/client/PDConfig.java
+++ b/hugegraph-pd/hg-pd-client/src/main/java/org/apache/hugegraph/pd/client/PDConfig.java
@@ -101,9 +101,13 @@ public String toString() {
}
public PDConfig setAuthority(String userName, String pwd) {
+ // If userName is null or empty, keep default values for test environment
+ if (StringUtils.isEmpty(userName)) {
+ return this;
+ }
this.userName = userName;
String auth = userName + ':' + pwd;
- this.authority = new String(Base64.getEncoder().encode(auth.getBytes(UTF_8)));
+ this.authority = Base64.getEncoder().encodeToString(auth.getBytes(UTF_8));
return this;
}
diff --git a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
index 342594ef74..2b08de7d4e 100644
--- a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
+++ b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftEngine.java
@@ -23,9 +23,12 @@
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@@ -40,7 +43,6 @@
import com.alipay.sofa.jraft.JRaftUtils;
import com.alipay.sofa.jraft.Node;
import com.alipay.sofa.jraft.RaftGroupService;
-import com.alipay.sofa.jraft.ReplicatorGroup;
import com.alipay.sofa.jraft.Status;
import com.alipay.sofa.jraft.conf.Configuration;
import com.alipay.sofa.jraft.core.Replicator;
@@ -48,13 +50,11 @@
import com.alipay.sofa.jraft.entity.Task;
import com.alipay.sofa.jraft.error.RaftError;
import com.alipay.sofa.jraft.option.NodeOptions;
-import com.alipay.sofa.jraft.option.RaftOptions;
import com.alipay.sofa.jraft.option.RpcOptions;
import com.alipay.sofa.jraft.rpc.RaftRpcServerFactory;
import com.alipay.sofa.jraft.rpc.RpcServer;
import com.alipay.sofa.jraft.rpc.impl.BoltRpcServer;
import com.alipay.sofa.jraft.util.Endpoint;
-import com.alipay.sofa.jraft.util.ThreadId;
import com.alipay.sofa.jraft.util.internal.ThrowUtil;
import io.netty.channel.ChannelHandler;
@@ -86,8 +86,12 @@ public synchronized boolean init(PDConfig.Raft config) {
}
this.config = config;
+ // Wire configured rpc timeout into RaftRpcClient so the Bolt transport
+ // timeout and the future.get() caller timeout in getLeaderGrpcAddress() are consistent.
raftRpcClient = new RaftRpcClient();
- raftRpcClient.init(new RpcOptions());
+ RpcOptions rpcOptions = new RpcOptions();
+ rpcOptions.setRpcDefaultTimeout(config.getRpcTimeout());
+ raftRpcClient.init(rpcOptions);
String raftPath = config.getDataPath() + "/" + groupId;
new File(raftPath).mkdirs();
@@ -119,10 +123,7 @@ public synchronized boolean init(PDConfig.Raft config) {
nodeOptions.setRpcConnectTimeoutMs(config.getRpcTimeout());
nodeOptions.setRpcDefaultTimeout(config.getRpcTimeout());
nodeOptions.setRpcInstallSnapshotTimeout(config.getRpcTimeout());
- // Set the raft configuration
- RaftOptions raftOptions = nodeOptions.getRaftOptions();
-
- nodeOptions.setEnableMetrics(true);
+ // TODO: tune RaftOptions for PD (see hugegraph-store PartitionEngine for reference)
final PeerId serverId = JRaftUtils.getPeerId(config.getAddress());
@@ -228,7 +229,7 @@ public PeerId getLeader() {
}
/**
- * Send a message to the leader to get the grpc address;
+ * Send a message to the leader to get the grpc address.
*/
public String getLeaderGrpcAddress() throws ExecutionException, InterruptedException {
if (isLeader()) {
@@ -236,11 +237,49 @@ public String getLeaderGrpcAddress() throws ExecutionException, InterruptedExcep
}
if (raftNode.getLeaderId() == null) {
- waitingForLeader(10000);
+ waitingForLeader(config.getRpcTimeout());
+ }
+
+ // Cache leader to avoid repeated getLeaderId() calls and guard against
+ // waitingForLeader() returning without a leader being elected.
+ PeerId leader = raftNode.getLeaderId();
+ if (leader == null) {
+ throw new ExecutionException(new IllegalStateException("Leader is not ready"));
+ }
+
+ RaftRpcProcessor.GetMemberResponse response = null;
+ try {
+ // TODO: a more complete fix would need a source of truth for the leader's
+ // actual grpcAddress rather than deriving it from the local node's port config.
+ response = raftRpcClient
+ .getGrpcAddress(leader.getEndpoint().toString())
+ .get(config.getRpcTimeout(), TimeUnit.MILLISECONDS);
+ if (response != null && response.getGrpcAddress() != null) {
+ return response.getGrpcAddress();
+ }
+ if (response == null) {
+ log.warn("Leader RPC response is null for {}, falling back to derived address",
+ leader);
+ } else {
+ log.warn("Leader gRPC address field is null in RPC response for {}, "
+ + "falling back to derived address", leader);
+ }
+ } catch (TimeoutException e) {
+ log.warn("Timed out resolving leader gRPC address for {}, falling back to derived "
+ + "address", leader);
+ } catch (ExecutionException e) {
+ Throwable cause = e.getCause() != null ? e.getCause() : e;
+ log.warn("Failed to resolve leader gRPC address for {}, falling back to derived "
+ + "address", leader, cause);
}
- return raftRpcClient.getGrpcAddress(raftNode.getLeaderId().getEndpoint().toString()).get()
- .getGrpcAddress();
+ // Best-effort fallback: derive from leader raft endpoint IP + local gRPC port.
+ // WARNING: this may be incorrect in clusters where PD nodes use different grpc.port
+ // values, a proper fix requires a cluster-wide source of truth for gRPC addresses.
+ String derived = leader.getEndpoint().getIp() + ":" + config.getGrpcPort();
+ log.info("Using derived leader gRPC address {} - may be incorrect if nodes use different ports",
+ derived);
+ return derived;
}
/**
@@ -313,23 +352,55 @@ public List getMembers() throws ExecutionException, InterruptedEx
public Status changePeerList(String peerList) {
AtomicReference result = new AtomicReference<>();
+ Configuration newPeers = new Configuration();
try {
String[] peers = peerList.split(",", -1);
if ((peers.length & 1) != 1) {
throw new PDException(-1, "the number of peer list must be odd.");
}
- Configuration newPeers = new Configuration();
newPeers.parse(peerList);
CountDownLatch latch = new CountDownLatch(1);
this.raftNode.changePeers(newPeers, status -> {
- result.set(status);
+ result.compareAndSet(null, status);
+ if (status != null && status.isOk()) {
+ IpAuthHandler handler = IpAuthHandler.getInstance();
+ if (handler != null) {
+ Set newIps = newPeers.getPeers()
+ .stream()
+ .map(PeerId::getIp)
+ .collect(Collectors.toSet());
+ handler.refresh(newIps);
+ log.info("IpAuthHandler refreshed after peer list change to: {}",
+ peerList);
+ } else {
+ log.warn("IpAuthHandler not initialized, skipping refresh for "
+ + "peer list: {}", peerList);
+ }
+ }
latch.countDown();
});
- latch.await();
+ boolean completed = latch.await(3L * config.getRpcTimeout(), TimeUnit.MILLISECONDS);
+ if (!completed && result.get() == null) {
+ Status timeoutStatus = new Status(RaftError.EINTERNAL,
+ "changePeerList timed out after %d ms",
+ 3L * config.getRpcTimeout());
+ if (!result.compareAndSet(null, timeoutStatus)) {
+ timeoutStatus = null;
+ }
+ if (timeoutStatus != null) {
+ log.error("changePeerList to {} timed out after {} ms",
+ peerList, 3L * config.getRpcTimeout());
+ }
+ }
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ result.set(new Status(RaftError.EINTERNAL, "changePeerList interrupted"));
+ log.error("changePeerList to {} was interrupted", peerList, e);
} catch (Exception e) {
log.error("failed to changePeerList to {},{}", peerList, e);
result.set(new Status(-1, e.getMessage()));
}
+
return result.get();
}
@@ -344,7 +415,8 @@ public PeerId waitingForLeader(long timeOut) {
long start = System.currentTimeMillis();
while ((System.currentTimeMillis() - start < timeOut) && (leader == null)) {
try {
- this.wait(1000);
+ long remaining = timeOut - (System.currentTimeMillis() - start);
+ this.wait(Math.min(1000, Math.max(0, remaining)));
} catch (InterruptedException e) {
log.error("Raft wait for leader exception", e);
}
@@ -352,7 +424,6 @@ public PeerId waitingForLeader(long timeOut) {
}
return leader;
}
-
}
public Node getRaftNode() {
@@ -366,54 +437,11 @@ private boolean peerEquals(PeerId p1, PeerId p2) {
if (p1 == null || p2 == null) {
return false;
}
- return Objects.equals(p1.getIp(), p2.getIp()) && Objects.equals(p1.getPort(), p2.getPort());
+ return Objects.equals(p1.getIp(), p2.getIp()) &&
+ Objects.equals(p1.getPort(), p2.getPort());
}
private Replicator.State getReplicatorState(PeerId peerId) {
- var replicateGroup = getReplicatorGroup();
- if (replicateGroup == null) {
- return null;
- }
-
- ThreadId threadId = replicateGroup.getReplicator(peerId);
- if (threadId == null) {
- return null;
- } else {
- Replicator r = (Replicator) threadId.lock();
- if (r == null) {
- return Replicator.State.Probe;
- }
- Replicator.State result = getState(r);
- threadId.unlock();
- return result;
- }
- }
-
- private ReplicatorGroup getReplicatorGroup() {
- var clz = this.raftNode.getClass();
- try {
- var f = clz.getDeclaredField("replicatorGroup");
- f.setAccessible(true);
- var group = (ReplicatorGroup) f.get(this.raftNode);
- f.setAccessible(false);
- return group;
- } catch (NoSuchFieldException | IllegalAccessException e) {
- log.info("getReplicatorGroup: error {}", e.getMessage());
- return null;
- }
- }
-
- private Replicator.State getState(Replicator r) {
- var clz = r.getClass();
- try {
- var f = clz.getDeclaredField("state");
- f.setAccessible(true);
- var state = (Replicator.State) f.get(this.raftNode);
- f.setAccessible(false);
- return state;
- } catch (NoSuchFieldException | IllegalAccessException e) {
- log.info("getReplicatorGroup: error {}", e.getMessage());
- return null;
- }
+ return RaftReflectionUtil.getReplicatorState(this.raftNode, peerId);
}
}
diff --git a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtil.java b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtil.java
new file mode 100644
index 0000000000..16cb5941d6
--- /dev/null
+++ b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtil.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import com.alipay.sofa.jraft.Node;
+import com.alipay.sofa.jraft.ReplicatorGroup;
+import com.alipay.sofa.jraft.core.Replicator;
+import com.alipay.sofa.jraft.entity.PeerId;
+import com.alipay.sofa.jraft.util.ThreadId;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class RaftReflectionUtil {
+
+ public static Replicator.State getReplicatorState(Node node, PeerId peerId) {
+ if (node == null || peerId == null) {
+ return null;
+ }
+
+ // Get ReplicatorGroup from Node
+ var clz = node.getClass();
+ ReplicatorGroup replicateGroup = null;
+ try {
+ var f = clz.getDeclaredField("replicatorGroup");
+ f.setAccessible(true);
+ try {
+ replicateGroup = (ReplicatorGroup)f.get(node);
+ }
+ finally {
+ f.setAccessible(false);
+ }
+ }
+ catch (NoSuchFieldException | IllegalAccessException e) {
+ log.warn("Failed to get replicator state via reflection: {}", e.getMessage(), e);
+ return null;
+ }
+
+ if (replicateGroup == null) {
+ return null;
+ }
+
+ ThreadId threadId = replicateGroup.getReplicator(peerId);
+ if (threadId == null) {
+ return null;
+ }
+ else {
+ Replicator r = (Replicator)threadId.lock();
+ try {
+ if (r == null) {
+ return Replicator.State.Probe;
+ }
+ Replicator.State result = null;
+
+ // Get state from Replicator
+
+ var replicatorClz = r.getClass();
+ try {
+ var f = replicatorClz.getDeclaredField("state");
+ f.setAccessible(true);
+ try {
+ result = (Replicator.State)f.get(r);
+ }catch (Exception e){
+ log.warn("Failed to get replicator state for peerId: {}, error: {}", peerId, e.getMessage());
+ }
+ finally {
+ f.setAccessible(false);
+ }
+ }
+ catch (NoSuchFieldException e) {
+ log.warn("Failed to get replicator state via reflection: {}", e.getMessage(), e);
+ result = null;
+ }
+ return result;
+ } finally {
+ threadId.unlock();
+ }
+ }
+ }
+}
diff --git a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftRpcClient.java b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftRpcClient.java
index ad6129236b..8c7398a53a 100644
--- a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftRpcClient.java
+++ b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/RaftRpcClient.java
@@ -60,7 +60,7 @@ public synchronized boolean init(final RpcOptions rpcOptions) {
private void internalCallAsyncWithRpc(final Endpoint endpoint,
final RaftRpcProcessor.BaseRequest request,
final FutureClosureAdapter closure) {
- final InvokeContext invokeCtx = null;
+ final InvokeContext invokeCtx = new InvokeContext();
final InvokeCallback invokeCallback = new InvokeCallback() {
@Override
diff --git a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/auth/IpAuthHandler.java b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/auth/IpAuthHandler.java
index 2ac384541d..bdccb6dd7f 100644
--- a/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/auth/IpAuthHandler.java
+++ b/hugegraph-pd/hg-pd-core/src/main/java/org/apache/hugegraph/pd/raft/auth/IpAuthHandler.java
@@ -17,8 +17,11 @@
package org.apache.hugegraph.pd.raft.auth;
+import java.net.InetAddress;
import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Set;
import io.netty.channel.ChannelDuplexHandler;
@@ -30,11 +33,11 @@
@ChannelHandler.Sharable
public class IpAuthHandler extends ChannelDuplexHandler {
- private final Set allowedIps;
+ private volatile Set resolvedIps;
private static volatile IpAuthHandler instance;
private IpAuthHandler(Set allowedIps) {
- this.allowedIps = Collections.unmodifiableSet(allowedIps);
+ this.resolvedIps = resolveAll(allowedIps);
}
public static IpAuthHandler getInstance(Set allowedIps) {
@@ -48,6 +51,25 @@ public static IpAuthHandler getInstance(Set allowedIps) {
return instance;
}
+ /**
+ * Returns the existing singleton instance, or null if not yet initialized.
+ * Should only be called after getInstance(Set) has been called during startup.
+ */
+ public static IpAuthHandler getInstance() {
+ return instance;
+ }
+
+ /**
+ * Refreshes the resolved IP allowlist from a new set of hostnames or IPs.
+ * Should be called when the Raft peer list changes via RaftEngine#changePeerList().
+ * Note: DNS-only changes (e.g. container restart with new IP, same hostname)
+ * are not automatically detected and still require a process restart.
+ */
+ public void refresh(Set newAllowedIps) {
+ this.resolvedIps = resolveAll(newAllowedIps);
+ log.info("IpAuthHandler allowlist refreshed, resolved {} entries", resolvedIps.size());
+ }
+
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
String clientIp = getClientIp(ctx);
@@ -65,7 +87,25 @@ private static String getClientIp(ChannelHandlerContext ctx) {
}
private boolean isIpAllowed(String ip) {
- return allowedIps.isEmpty() || allowedIps.contains(ip);
+ Set resolved = this.resolvedIps;
+ // Empty allowlist means no restriction is configured — allow all
+ return resolved.isEmpty() || resolved.contains(ip);
+ }
+
+ private static Set resolveAll(Set entries) {
+ Set result = new HashSet<>(entries);
+
+ for (String entry : entries) {
+ try {
+ for (InetAddress addr : InetAddress.getAllByName(entry)) {
+ result.add(addr.getHostAddress());
+ }
+ } catch (UnknownHostException e) {
+ log.warn("Could not resolve allowlist entry '{}': {}", entry, e.getMessage());
+ }
+ }
+
+ return Collections.unmodifiableSet(result);
}
@Override
diff --git a/hugegraph-pd/hg-pd-dist/docker/docker-entrypoint.sh b/hugegraph-pd/hg-pd-dist/docker/docker-entrypoint.sh
old mode 100644
new mode 100755
index fd894d5518..d1ae5c3c3a
--- a/hugegraph-pd/hg-pd-dist/docker/docker-entrypoint.sh
+++ b/hugegraph-pd/hg-pd-dist/docker/docker-entrypoint.sh
@@ -15,8 +15,72 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+set -euo pipefail
-# start hugegraph pd
-./bin/start-hugegraph-pd.sh -j "$JAVA_OPTS"
+log() { echo "[hugegraph-pd-entrypoint] $*"; }
+require_env() {
+ local name="$1"
+ if [[ -z "${!name:-}" ]]; then
+ echo "ERROR: missing required env '${name}'" >&2; exit 2
+ fi
+}
+
+json_escape() {
+ local s="$1"
+ s=${s//\\/\\\\}; s=${s//\"/\\\"}; s=${s//$'\n'/}
+ printf "%s" "$s"
+}
+
+migrate_env() {
+ local old_name="$1" new_name="$2"
+
+ if [[ -n "${!old_name:-}" && -z "${!new_name:-}" ]]; then
+ log "WARN: deprecated env '${old_name}' detected; mapping to '${new_name}'"
+ export "${new_name}=${!old_name}"
+ fi
+}
+
+migrate_env "GRPC_HOST" "HG_PD_GRPC_HOST"
+migrate_env "RAFT_ADDRESS" "HG_PD_RAFT_ADDRESS"
+migrate_env "RAFT_PEERS" "HG_PD_RAFT_PEERS_LIST"
+migrate_env "PD_INITIAL_STORE_LIST" "HG_PD_INITIAL_STORE_LIST"
+
+# ── Required vars ─────────────────────────────────────────────────────
+require_env "HG_PD_GRPC_HOST"
+require_env "HG_PD_RAFT_ADDRESS"
+require_env "HG_PD_RAFT_PEERS_LIST"
+require_env "HG_PD_INITIAL_STORE_LIST"
+
+: "${HG_PD_GRPC_PORT:=8686}"
+: "${HG_PD_REST_PORT:=8620}"
+: "${HG_PD_DATA_PATH:=/hugegraph-pd/pd_data}"
+: "${HG_PD_INITIAL_STORE_COUNT:=1}"
+
+SPRING_APPLICATION_JSON="$(cat <> ${OUTPUT} 2>&1 &
-
-PID="$!"
-# Write pid to file
-echo "$PID" > "$PID_FILE"
-echo "[+pid] $PID"
+if [[ $DAEMON == "true" ]]; then
+ echo "Starting HugeGraphPDServer in daemon mode..."
+ if [[ "${STDOUT_MODE:-false}" == "true" ]]; then
+ exec ${JAVA} -Dname="HugeGraphPD" ${JVM_OPTIONS} ${JAVA_OPTIONS} -jar \
+ -Dspring.config.location=${CONF}/application.yml ${LIB}/hg-pd-service-*.jar &
+ else
+ exec ${JAVA} -Dname="HugeGraphPD" ${JVM_OPTIONS} ${JAVA_OPTIONS} -jar \
+ -Dspring.config.location=${CONF}/application.yml ${LIB}/hg-pd-service-*.jar >> ${OUTPUT} 2>&1 &
+ fi
+ PID="$!"
+ # Write pid to file
+ echo "$PID" > "$PID_FILE"
+ echo "[+pid] $PID"
+else
+ echo "Starting HugeGraphPDServer in foreground mode..."
+ # Write $$ before exec — exec replaces this shell with Java, so $$ becomes Java's PID
+ echo "$$" > "$PID_FILE"
+ echo "[+pid] $$"
+ if [[ "${STDOUT_MODE:-false}" == "true" ]]; then
+ exec ${JAVA} -Dname="HugeGraphPD" ${JVM_OPTIONS} ${JAVA_OPTIONS} -jar \
+ -Dspring.config.location=${CONF}/application.yml ${LIB}/hg-pd-service-*.jar
+ else
+ exec ${JAVA} -Dname="HugeGraphPD" ${JVM_OPTIONS} ${JAVA_OPTIONS} -jar \
+ -Dspring.config.location=${CONF}/application.yml ${LIB}/hg-pd-service-*.jar >> ${OUTPUT} 2>&1
+ fi
+fi
diff --git a/hugegraph-pd/hg-pd-dist/src/assembly/static/bin/util.sh b/hugegraph-pd/hg-pd-dist/src/assembly/static/bin/util.sh
index 5cc0c355be..0b7ad0f0f0 100644
--- a/hugegraph-pd/hg-pd-dist/src/assembly/static/bin/util.sh
+++ b/hugegraph-pd/hg-pd-dist/src/assembly/static/bin/util.sh
@@ -83,7 +83,7 @@ function process_id() {
# check the port of rest server is occupied
function check_port() {
- local port=`echo $1 | awk -F':' '{print $3}'`
+ local port=$(echo "$1" | sed 's|.*:||' | sed 's|/.*||')
if ! command_available "lsof"; then
echo "Required lsof but it is unavailable"
exit 1
diff --git a/hugegraph-pd/hg-pd-dist/src/assembly/static/conf/log4j2.xml b/hugegraph-pd/hg-pd-dist/src/assembly/static/conf/log4j2.xml
index a804948703..e0b5d9dc98 100644
--- a/hugegraph-pd/hg-pd-dist/src/assembly/static/conf/log4j2.xml
+++ b/hugegraph-pd/hg-pd-dist/src/assembly/static/conf/log4j2.xml
@@ -115,6 +115,7 @@
+
diff --git a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/IndexAPI.java b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/IndexAPI.java
index a0448965f1..bee39f23ed 100644
--- a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/IndexAPI.java
+++ b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/IndexAPI.java
@@ -66,9 +66,35 @@ public BriefStatistics index() throws PDException, ExecutionException, Interrupt
BriefStatistics statistics = new BriefStatistics();
statistics.leader = RaftEngine.getInstance().getLeaderGrpcAddress();
statistics.state = pdService.getStoreNodeService().getClusterStats().getState().toString();
+
+ // Use pdService (consistent with cluster()) rather than RaftEngine directly
+ CallStreamObserverWrap membersResp =
+ new CallStreamObserverWrap<>();
+ pdService.getMembers(Pdpb.GetMembersRequest.newBuilder().build(), membersResp);
+ statistics.memberSize = membersResp.get().get(0).getMembersList().size();
+
statistics.storeSize = pdService.getStoreNodeService().getActiveStores().size();
- statistics.graphSize = pdService.getPartitionService().getGraphs().size();
+ // Filter to user-facing graphs only (consistent with cluster())
+ List graphs = pdRestService.getGraphs();
+ statistics.graphSize = (int) graphs.stream()
+ .filter(g -> g.getGraphName() != null &&
+ g.getGraphName().endsWith("/g"))
+ .count();
statistics.partitionSize = pdService.getStoreNodeService().getShardGroups().size();
+
+ // Derive worst partition health state across all graphs
+ Metapb.PartitionState dataState = Metapb.PartitionState.PState_Normal;
+ for (Metapb.Graph graph : graphs) {
+ if (graph.getState() == Metapb.PartitionState.UNRECOGNIZED) {
+ continue;
+ }
+ if (graph.getState() != null &&
+ graph.getState().getNumber() > dataState.getNumber()) {
+ dataState = graph.getState();
+ }
+ }
+ statistics.dataState = dataState.name();
+
return statistics;
}
@@ -157,9 +183,13 @@ public RestApiResponse cluster() throws InterruptedException, ExecutionException
class BriefStatistics {
String state;
+ /** Worst partition health state across all graphs (mirrors cluster().dataState) */
+ String dataState;
String leader;
int memberSize;
+ /** Active (online) store count only */
int storeSize;
+ /** User-facing graphs count (graphName ending with /g) */
int graphSize;
int partitionSize;
}
diff --git a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/MemberAPI.java b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/MemberAPI.java
index 4a796c37ce..525b899c96 100644
--- a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/MemberAPI.java
+++ b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/rest/MemberAPI.java
@@ -113,6 +113,9 @@ public RestApiResponse getMembers() throws InterruptedException, ExecutionExcept
* @return Returns a JSON string containing the modification results
* @throws Exception If an exception occurs during request processing, service invocation, or Peer list modification, it is captured and returned as the JSON representation of the exception
*/
+ // TODO: this endpoint has no authentication check — any caller with network
+ // access to the management port can trigger a peer list change.
+ // Wire authentication here as part of the planned auth refactor.
@PostMapping(value = "/members/change", consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
diff --git a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/PDService.java b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/PDService.java
index 98bc2ee803..94d136a844 100644
--- a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/PDService.java
+++ b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/PDService.java
@@ -25,6 +25,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -85,6 +86,7 @@
import org.apache.hugegraph.pd.raft.PeerUtil;
import org.apache.hugegraph.pd.raft.RaftEngine;
import org.apache.hugegraph.pd.raft.RaftStateListener;
+import org.apache.hugegraph.pd.raft.auth.IpAuthHandler;
import org.apache.hugegraph.pd.util.grpc.StreamObserverUtil;
import org.apache.hugegraph.pd.watch.PDWatchSubject;
import org.lognet.springboot.grpc.GRpcService;
@@ -1735,6 +1737,17 @@ public void updatePdRaft(Pdpb.UpdatePdRaftRequest request,
node.changePeers(config, status -> {
if (status.isOk()) {
log.info("updatePdRaft, change peers success");
+ // Refresh IpAuthHandler so newly added peers are not blocked
+ IpAuthHandler handler = IpAuthHandler.getInstance();
+ if (handler != null) {
+ Set newIps = new HashSet<>();
+ config.getPeers().forEach(p -> newIps.add(p.getIp()));
+ config.getLearners().forEach(p -> newIps.add(p.getIp()));
+ handler.refresh(newIps);
+ log.info("IpAuthHandler refreshed after updatePdRaft peer change");
+ } else {
+ log.warn("IpAuthHandler not initialized, skipping refresh");
+ }
} else {
log.error("changePeers status: {}, msg:{}, code: {}, raft error:{}",
status, status.getErrorMsg(), status.getCode(),
diff --git a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/interceptor/Authentication.java b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/interceptor/Authentication.java
index 83901bca1a..48bcf38683 100644
--- a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/interceptor/Authentication.java
+++ b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/service/interceptor/Authentication.java
@@ -77,6 +77,8 @@ protected T authenticate(String authority, String token, Function
}
String name = info.substring(0, delim);
+ // TODO: password validation is skipped — only service name is checked against
+ // innerModules. Full credential validation should be added as part of the auth refactor.
//String pwd = info.substring(delim + 1);
if (innerModules.contains(name)) {
return call.get();
diff --git a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/util/grpc/GRpcServerConfig.java b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/util/grpc/GRpcServerConfig.java
index fce6d2379d..2b1103739b 100644
--- a/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/util/grpc/GRpcServerConfig.java
+++ b/hugegraph-pd/hg-pd-service/src/main/java/org/apache/hugegraph/pd/util/grpc/GRpcServerConfig.java
@@ -40,6 +40,8 @@ public void configure(ServerBuilder> serverBuilder) {
HgExecutorUtil.createExecutor(EXECUTOR_NAME, poolGrpc.getCore(), poolGrpc.getMax(),
poolGrpc.getQueue()));
serverBuilder.maxInboundMessageSize(MAX_INBOUND_MESSAGE_SIZE);
+ // TODO: GrpcAuthentication is instantiated as a Spring bean but never registered
+ // here — add serverBuilder.intercept(grpcAuthentication) once auth is refactored.
}
}
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/core/PDCoreSuiteTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/core/PDCoreSuiteTest.java
index 5098645128..87d1500bcb 100644
--- a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/core/PDCoreSuiteTest.java
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/core/PDCoreSuiteTest.java
@@ -19,6 +19,9 @@
import org.apache.hugegraph.pd.core.meta.MetadataKeyHelperTest;
import org.apache.hugegraph.pd.core.store.HgKVStoreImplTest;
+import org.apache.hugegraph.pd.raft.IpAuthHandlerTest;
+import org.apache.hugegraph.pd.raft.RaftEngineIpAuthIntegrationTest;
+import org.apache.hugegraph.pd.raft.RaftEngineLeaderAddressTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@@ -36,6 +39,9 @@
StoreMonitorDataServiceTest.class,
StoreServiceTest.class,
TaskScheduleServiceTest.class,
+ IpAuthHandlerTest.class,
+ RaftEngineIpAuthIntegrationTest.class,
+ RaftEngineLeaderAddressTest.class,
// StoreNodeServiceTest.class,
})
@Slf4j
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/IpAuthHandlerTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/IpAuthHandlerTest.java
new file mode 100644
index 0000000000..31647b6d39
--- /dev/null
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/IpAuthHandlerTest.java
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import java.net.InetAddress;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.hugegraph.pd.raft.auth.IpAuthHandler;
+import org.apache.hugegraph.testutil.Whitebox;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class IpAuthHandlerTest {
+
+ @Before
+ public void setUp() {
+ // Must reset BEFORE each test — earlier suite classes (e.g. ConfigServiceTest)
+ // initialize RaftEngine which creates the IpAuthHandler singleton with their
+ // own peer IPs. Without this reset, our getInstance() calls return the stale
+ // singleton and ignore the allowlist passed by the test.
+ Whitebox.setInternalState(IpAuthHandler.class, "instance", null);
+ }
+
+ @After
+ public void tearDown() {
+ // Must reset AFTER each test — prevents our test singleton from leaking
+ // into later suite classes that also depend on IpAuthHandler state.
+ Whitebox.setInternalState(IpAuthHandler.class, "instance", null);
+ }
+
+ private boolean isIpAllowed(IpAuthHandler handler, String ip) {
+ return Whitebox.invoke(IpAuthHandler.class,
+ new Class[]{String.class},
+ "isIpAllowed", handler, ip);
+ }
+
+ @Test
+ public void testHostnameResolvesToIp() throws Exception {
+ // "localhost" should resolve to one or more IPs via InetAddress.getAllByName()
+ // This verifies the core fix: hostname allowlists match numeric remote addresses
+ // Using dynamic resolution avoids hardcoding "127.0.0.1" which may not be
+ // returned on IPv6-only or custom resolver environments
+ IpAuthHandler handler = IpAuthHandler.getInstance(
+ Collections.singleton("localhost"));
+ InetAddress[] addresses = InetAddress.getAllByName("localhost");
+ // All resolved addresses should be allowed — resolveAll() adds every address
+ // returned by getAllByName() so none should be blocked
+ Assert.assertTrue("Expected at least one resolved address",
+ addresses.length > 0);
+ for (InetAddress address : addresses) {
+ Assert.assertTrue(
+ "Expected " + address.getHostAddress() + " to be allowed",
+ isIpAllowed(handler, address.getHostAddress()));
+ }
+ }
+
+ @Test
+ public void testUnresolvableHostnameDoesNotCrash() {
+ // Should log a warning and skip — no exception thrown during construction
+ // Uses .invalid TLD which is RFC-2606 reserved and guaranteed to never resolve
+ IpAuthHandler handler = IpAuthHandler.getInstance(
+ Collections.singleton("nonexistent.invalid"));
+ // Handler was still created successfully despite bad hostname
+ Assert.assertNotNull(handler);
+ // Unresolvable entry is skipped so no IPs should be allowed
+ Assert.assertFalse(isIpAllowed(handler, "127.0.0.1"));
+ Assert.assertFalse(isIpAllowed(handler, "192.168.0.1"));
+ }
+
+ @Test
+ public void testRefreshUpdatesResolvedIps() {
+ // Start with 127.0.0.1
+ IpAuthHandler handler = IpAuthHandler.getInstance(
+ Collections.singleton("127.0.0.1"));
+ Assert.assertTrue(isIpAllowed(handler, "127.0.0.1"));
+
+ // Refresh with a different IP — verifies refresh() swaps the set correctly
+ Set newIps = new HashSet<>();
+ newIps.add("192.168.0.1");
+ handler.refresh(newIps);
+
+ // Old IP should no longer be allowed
+ Assert.assertFalse(isIpAllowed(handler, "127.0.0.1"));
+ // New IP should now be allowed
+ Assert.assertTrue(isIpAllowed(handler, "192.168.0.1"));
+ }
+
+ @Test
+ public void testEmptyAllowlistAllowsAll() {
+ // Empty allowlist = no restriction configured = allow all connections
+ // This is intentional fallback behavior and must be explicitly tested
+ // because it is a security-relevant boundary
+ IpAuthHandler handler = IpAuthHandler.getInstance(
+ Collections.emptySet());
+ Assert.assertTrue(isIpAllowed(handler, "1.2.3.4"));
+ Assert.assertTrue(isIpAllowed(handler, "192.168.99.99"));
+ }
+
+ @Test
+ public void testGetInstanceReturnsSingletonIgnoresNewAllowlist() {
+ // First call creates the singleton with 127.0.0.1
+ IpAuthHandler first = IpAuthHandler.getInstance(
+ Collections.singleton("127.0.0.1"));
+ // Second call with a different set must return the same instance
+ // and must NOT reinitialize or override the existing allowlist
+ IpAuthHandler second = IpAuthHandler.getInstance(
+ Collections.singleton("192.168.0.1"));
+ Assert.assertSame(first, second);
+ // Original allowlist still in effect
+ Assert.assertTrue(isIpAllowed(second, "127.0.0.1"));
+ // New set was ignored — 192.168.0.1 should not be allowed
+ Assert.assertFalse(isIpAllowed(second, "192.168.0.1"));
+ }
+}
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftEngineIpAuthIntegrationTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftEngineIpAuthIntegrationTest.java
new file mode 100644
index 0000000000..1f9857df0f
--- /dev/null
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftEngineIpAuthIntegrationTest.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import java.util.Collections;
+
+import org.apache.hugegraph.pd.raft.auth.IpAuthHandler;
+import org.apache.hugegraph.testutil.Whitebox;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.alipay.sofa.jraft.Closure;
+import com.alipay.sofa.jraft.Node;
+import com.alipay.sofa.jraft.Status;
+import com.alipay.sofa.jraft.conf.Configuration;
+import com.alipay.sofa.jraft.error.RaftError;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.mock;
+
+public class RaftEngineIpAuthIntegrationTest {
+
+ private Node originalRaftNode;
+
+ @Before
+ public void setUp() {
+ // Save original raftNode so we can restore it after the test
+ originalRaftNode = RaftEngine.getInstance().getRaftNode();
+ // Reset IpAuthHandler singleton for a clean state
+ Whitebox.setInternalState(IpAuthHandler.class, "instance", null);
+ }
+
+ @After
+ public void tearDown() {
+ // Restore original raftNode
+ Whitebox.setInternalState(RaftEngine.getInstance(), "raftNode", originalRaftNode);
+ // Reset IpAuthHandler singleton
+ Whitebox.setInternalState(IpAuthHandler.class, "instance", null);
+ }
+
+ @Test
+ public void testChangePeerListRefreshesIpAuthHandler() throws Exception {
+ // Initialize IpAuthHandler with an old IP
+ IpAuthHandler handler = IpAuthHandler.getInstance(
+ Collections.singleton("10.0.0.1"));
+ Assert.assertTrue(invokeIsIpAllowed(handler, "10.0.0.1"));
+ Assert.assertFalse(invokeIsIpAllowed(handler, "127.0.0.1"));
+
+ // Mock Node to fire the changePeers callback synchronously with Status.OK()
+ // This simulates a successful peer change without a real Raft cluster
+
+ // Important: fire the closure synchronously or changePeerList() will
+ // block on latch.await(...) until the configured timeout elapses
+ Node mockNode = mock(Node.class);
+ doAnswer(invocation -> {
+ Closure closure = invocation.getArgument(1);
+ closure.run(Status.OK());
+ return null;
+ }).when(mockNode).changePeers(any(Configuration.class), any(Closure.class));
+
+ // Inject mock node into RaftEngine
+ Whitebox.setInternalState(RaftEngine.getInstance(), "raftNode", mockNode);
+
+ // Call changePeerList with new peer — must be odd count
+ RaftEngine.getInstance().changePeerList("127.0.0.1:8610");
+
+ // Verify IpAuthHandler was refreshed with the new peer IP
+ Assert.assertTrue(invokeIsIpAllowed(handler, "127.0.0.1"));
+ // Old IP should no longer be allowed
+ Assert.assertFalse(invokeIsIpAllowed(handler, "10.0.0.1"));
+ }
+
+ @Test
+ public void testChangePeerListDoesNotRefreshOnFailure() throws Exception {
+ // Initialize IpAuthHandler with original IP
+ IpAuthHandler handler = IpAuthHandler.getInstance(
+ Collections.singleton("10.0.0.1"));
+ Assert.assertTrue(invokeIsIpAllowed(handler, "10.0.0.1"));
+
+ // Mock Node to fire callback with a failed status
+ // Simulates a failed peer change — handler should NOT be refreshed
+
+ // Important: fire the closure synchronously or changePeerList() will
+ // block on latch.await(...) until the configured timeout elapses
+ Node mockNode = mock(Node.class);
+ doAnswer(invocation -> {
+ Closure closure = invocation.getArgument(1);
+ closure.run(new Status(RaftError.EINTERNAL, "simulated failure"));
+ return null;
+ }).when(mockNode).changePeers(any(Configuration.class), any(Closure.class));
+
+ Whitebox.setInternalState(RaftEngine.getInstance(), "raftNode", mockNode);
+
+ RaftEngine.getInstance().changePeerList("127.0.0.1:8610");
+
+ // Handler should NOT be refreshed — old IP still allowed
+ Assert.assertTrue(invokeIsIpAllowed(handler, "10.0.0.1"));
+ Assert.assertFalse(invokeIsIpAllowed(handler, "127.0.0.1"));
+ }
+
+ private boolean invokeIsIpAllowed(IpAuthHandler handler, String ip) {
+ return Whitebox.invoke(IpAuthHandler.class,
+ new Class[]{String.class},
+ "isIpAllowed", handler, ip);
+ }
+}
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftEngineLeaderAddressTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftEngineLeaderAddressTest.java
new file mode 100644
index 0000000000..420b106a27
--- /dev/null
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftEngineLeaderAddressTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.hugegraph.pd.config.PDConfig;
+import org.apache.hugegraph.testutil.Whitebox;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.alipay.sofa.jraft.Node;
+import com.alipay.sofa.jraft.entity.PeerId;
+import com.alipay.sofa.jraft.util.Endpoint;
+
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class RaftEngineLeaderAddressTest {
+
+ private static final String LEADER_IP = "10.0.0.1";
+ private static final int GRPC_PORT = 8686;
+ private static final String LEADER_GRPC_ADDRESS = "10.0.0.1:8686";
+
+ private Node originalRaftNode;
+ private RaftRpcClient originalRaftRpcClient;
+ private PDConfig.Raft originalConfig;
+
+ private Node mockNode;
+ private RaftRpcClient mockRpcClient;
+ private PDConfig.Raft mockConfig;
+ private PeerId mockLeader;
+
+ @Before
+ public void setUp() {
+ RaftEngine engine = RaftEngine.getInstance();
+
+ // Save originals
+ originalRaftNode = engine.getRaftNode();
+ originalRaftRpcClient = Whitebox.getInternalState(engine, "raftRpcClient");
+ originalConfig = Whitebox.getInternalState(engine, "config");
+
+ // Build mock leader PeerId with real Endpoint
+ mockLeader = mock(PeerId.class);
+ Endpoint endpoint = new Endpoint(LEADER_IP, 8610);
+ when(mockLeader.getEndpoint()).thenReturn(endpoint);
+
+ // Build mock Node that reports itself as follower with a known leader
+ mockNode = mock(Node.class);
+ when(mockNode.isLeader(true)).thenReturn(false);
+ when(mockNode.getLeaderId()).thenReturn(mockLeader);
+
+ // Build mock config
+ // Use a short default timeout (100ms); specific tests may override getRpcTimeout()
+ mockConfig = mock(PDConfig.Raft.class);
+ when(mockConfig.getGrpcAddress()).thenReturn("127.0.0.1:" + GRPC_PORT);
+ when(mockConfig.getGrpcPort()).thenReturn(GRPC_PORT);
+ when(mockConfig.getRpcTimeout()).thenReturn(100);
+
+ // Build mock RpcClient
+ mockRpcClient = mock(RaftRpcClient.class);
+
+ // Inject mocks
+ Whitebox.setInternalState(engine, "raftNode", mockNode);
+ Whitebox.setInternalState(engine, "raftRpcClient", mockRpcClient);
+ Whitebox.setInternalState(engine, "config", mockConfig);
+ }
+
+ @After
+ public void tearDown() {
+ RaftEngine engine = RaftEngine.getInstance();
+ Whitebox.setInternalState(engine, "raftNode", originalRaftNode);
+ Whitebox.setInternalState(engine, "raftRpcClient", originalRaftRpcClient);
+ Whitebox.setInternalState(engine, "config", originalConfig);
+ }
+
+ @Test
+ public void testSuccessReturnsGrpcAddress() throws Exception {
+ // RPC succeeds and returns a valid gRPC address
+ RaftRpcProcessor.GetMemberResponse response =
+ mock(RaftRpcProcessor.GetMemberResponse.class);
+ when(response.getGrpcAddress()).thenReturn(LEADER_GRPC_ADDRESS);
+
+ CompletableFuture future =
+ CompletableFuture.completedFuture(response);
+ when(mockRpcClient.getGrpcAddress(anyString())).thenReturn(future);
+
+ String result = RaftEngine.getInstance().getLeaderGrpcAddress();
+ Assert.assertEquals(LEADER_GRPC_ADDRESS, result);
+ }
+
+ @Test
+ public void testTimeoutFallsBackToDerivedAddress() throws Exception {
+ // RPC times out — should fall back to leaderIp:grpcPort
+ CompletableFuture future =
+ mock(CompletableFuture.class);
+ when(future.get(anyLong(), eq(TimeUnit.MILLISECONDS)))
+ .thenThrow(new TimeoutException("simulated timeout"));
+ when(mockRpcClient.getGrpcAddress(anyString())).thenReturn(future);
+
+ String result = RaftEngine.getInstance().getLeaderGrpcAddress();
+ Assert.assertEquals(LEADER_IP + ":" + GRPC_PORT, result);
+ }
+
+ @Test
+ public void testRpcExceptionFallsBackToDerivedAddress() throws Exception {
+ // RPC throws ExecutionException — should fall back to leaderIp:grpcPort
+ CompletableFuture future =
+ mock(CompletableFuture.class);
+ when(future.get(anyLong(), eq(TimeUnit.MILLISECONDS)))
+ .thenThrow(new ExecutionException("simulated rpc failure",
+ new RuntimeException("bolt error")));
+ when(mockRpcClient.getGrpcAddress(anyString())).thenReturn(future);
+
+ String result = RaftEngine.getInstance().getLeaderGrpcAddress();
+ Assert.assertEquals(LEADER_IP + ":" + GRPC_PORT, result);
+ }
+
+ @Test
+ public void testNullResponseFallsBackToDerivedAddress() throws Exception {
+ // RPC returns null response — should fall back to leaderIp:grpcPort
+ CompletableFuture future =
+ CompletableFuture.completedFuture(null);
+ when(mockRpcClient.getGrpcAddress(anyString())).thenReturn(future);
+
+ String result = RaftEngine.getInstance().getLeaderGrpcAddress();
+ Assert.assertEquals(LEADER_IP + ":" + GRPC_PORT, result);
+ }
+
+ @Test
+ public void testNullGrpcAddressInResponseFallsBackToDerivedAddress() throws Exception {
+ // RPC returns a response but grpcAddress field is null — should fall back
+ RaftRpcProcessor.GetMemberResponse response =
+ mock(RaftRpcProcessor.GetMemberResponse.class);
+ when(response.getGrpcAddress()).thenReturn(null);
+
+ CompletableFuture future =
+ CompletableFuture.completedFuture(response);
+ when(mockRpcClient.getGrpcAddress(anyString())).thenReturn(future);
+
+ String result = RaftEngine.getInstance().getLeaderGrpcAddress();
+ Assert.assertEquals(LEADER_IP + ":" + GRPC_PORT, result);
+ }
+
+ @Test
+ public void testNullLeaderAfterWaitThrowsExecutionException() throws Exception {
+ // Use 0ms timeout so waitingForLeader(0) skips the wait loop and returns immediately
+ when(mockConfig.getRpcTimeout()).thenReturn(0);
+ // Leader is still null after waitingForLeader() — should throw ExecutionException
+ when(mockNode.getLeaderId()).thenReturn(null);
+
+ try {
+ RaftEngine.getInstance().getLeaderGrpcAddress();
+ Assert.fail("Expected ExecutionException");
+ } catch (ExecutionException e) {
+ Assert.assertTrue(e.getCause() instanceof IllegalStateException);
+ Assert.assertEquals("Leader is not ready", e.getCause().getMessage());
+ }
+ }
+}
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtilTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtilTest.java
new file mode 100644
index 0000000000..c29e2a95a6
--- /dev/null
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/raft/RaftReflectionUtilTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hugegraph.pd.raft;
+
+import com.alipay.sofa.jraft.Node;
+import com.alipay.sofa.jraft.core.Replicator;
+import com.alipay.sofa.jraft.entity.PeerId;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.mockito.Mockito.mock;
+
+public class RaftReflectionUtilTest {
+
+ @Test
+ public void testGetReplicatorStateWithNullNode() {
+ // Setup
+ PeerId peerId = mock(PeerId.class);
+
+ // Run the test
+ Replicator.State result = RaftReflectionUtil.getReplicatorState(null, peerId);
+
+ // Verify the results
+ Assert.assertNull(result);
+ }
+
+ @Test
+ public void testGetReplicatorStateWithNullPeerId() {
+ // Setup
+ Node node = mock(Node.class);
+
+ // Run the test
+ Replicator.State result = RaftReflectionUtil.getReplicatorState(node, null);
+
+ // Verify the results
+ Assert.assertNull(result);
+ }
+
+ @Test
+ public void testGetReplicatorStateWithBothNull() {
+ // Run the test
+ Replicator.State result = RaftReflectionUtil.getReplicatorState(null, null);
+
+ // Verify the results
+ Assert.assertNull(result);
+ }
+}
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/rest/RestApiTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/rest/RestApiTest.java
index 2d6f4f054b..fb2b71d480 100644
--- a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/rest/RestApiTest.java
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/rest/RestApiTest.java
@@ -29,6 +29,25 @@
public class RestApiTest extends BaseServerTest {
+ @Test
+ public void testQueryIndexInfo() throws URISyntaxException, IOException, InterruptedException,
+ JSONException {
+ String url = pdRestAddr + "/";
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI(url))
+ .header("Authorization", "Basic c3RvcmU6MTIz")
+ .GET()
+ .build();
+ HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assert response.statusCode() == 200;
+ JSONObject obj = new JSONObject(response.body());
+ assert obj.getString("state") != null;
+ assert obj.getString("leader") != null;
+ assert obj.getInt("memberSize") > 0 : "memberSize should be > 0 for a running cluster";
+ // storeSize can be 0 in PD-only test environments with no store nodes registered
+ assert obj.getInt("storeSize") >= 0;
+ }
+
@Test
public void testQueryClusterInfo() throws URISyntaxException, IOException, InterruptedException,
JSONException {
diff --git a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/service/RestApiTest.java b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/service/RestApiTest.java
index d4c9cd121e..b899c09194 100644
--- a/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/service/RestApiTest.java
+++ b/hugegraph-pd/hg-pd-test/src/main/java/org/apache/hugegraph/pd/service/RestApiTest.java
@@ -29,6 +29,24 @@
public class RestApiTest extends BaseServerTest {
+ @Test
+ public void testQueryIndexInfo() throws URISyntaxException, IOException, InterruptedException,
+ JSONException {
+ String url = pdRestAddr + "/";
+ HttpRequest request = HttpRequest.newBuilder()
+ .uri(new URI(url)).header(key, value)
+ .GET()
+ .build();
+ HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ assert response.statusCode() == 200;
+ JSONObject obj = new JSONObject(response.body());
+ assert obj.getString("state") != null;
+ assert obj.getString("leader") != null;
+ assert obj.getInt("memberSize") > 0 : "memberSize should be > 0 for a running cluster";
+ // storeSize can be 0 in PD-only test environments with no store nodes registered
+ assert obj.getInt("storeSize") >= 0;
+ }
+
@Test
public void testQueryClusterInfo() throws URISyntaxException, IOException, InterruptedException,
JSONException {
diff --git a/hugegraph-pd/pom.xml b/hugegraph-pd/pom.xml
index 4af7896bb2..ceb8af33b2 100644
--- a/hugegraph-pd/pom.xml
+++ b/hugegraph-pd/pom.xml
@@ -44,7 +44,7 @@
2.17.0
- apache-${release.name}-pd-incubating-${project.version}
+ apache-${release.name}-pd-${project.version}
3.12.0
4.13.2
diff --git a/hugegraph-server/Dockerfile b/hugegraph-server/Dockerfile
index 65644d75b3..4b06bdad6c 100644
--- a/hugegraph-server/Dockerfile
+++ b/hugegraph-server/Dockerfile
@@ -1,3 +1,4 @@
+# syntax=docker/dockerfile:1
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -19,32 +20,33 @@
# 1st stage: build source code
FROM maven:3.9.0-eclipse-temurin-11 AS build
-COPY . /pkg
WORKDIR /pkg
+
+COPY . .
+
ARG MAVEN_ARGS
-RUN mvn package $MAVEN_ARGS -e -B -ntp -Dmaven.test.skip=true -Dmaven.javadoc.skip=true && pwd && ls -l && rm \
- ./hugegraph-server/*.tar.gz && rm ./hugegraph-pd/*.tar.gz && rm ./hugegraph-store/*.tar.gz
+RUN --mount=type=cache,target=/root/.m2 \
+ mvn package $MAVEN_ARGS -e -B -ntp -Dmaven.test.skip=true -Dmaven.javadoc.skip=true \
+ && rm ./hugegraph-server/*.tar.gz ./hugegraph-pd/*.tar.gz ./hugegraph-store/*.tar.gz
# 2nd stage: runtime env
-# Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13
-FROM openjdk:11-slim
+# Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13
+FROM eclipse-temurin:11-jre-jammy
-COPY --from=build /pkg/hugegraph-server/apache-hugegraph-server-incubating-*/ /hugegraph-server/
+COPY --from=build /pkg/hugegraph-server/apache-hugegraph-server-*/ /hugegraph-server/
LABEL maintainer="HugeGraph Docker Maintainers "
# TODO: use g1gc or zgc as default
-ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50 -XshowSettings:vm" \
- HUGEGRAPH_HOME="hugegraph-server"
+# Note: --add-exports is required for Java 11+ to access jdk.internal.reflect for auth proxy
+ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50 -XshowSettings:vm --add-exports=java.base/jdk.internal.reflect=ALL-UNNAMED" \
+ HUGEGRAPH_HOME="hugegraph-server" \
+ STDOUT_MODE="true"
-#COPY . /hugegraph/hugegraph-server
WORKDIR /hugegraph-server/
-# 1. Install environment and init HugeGraph Sever
-RUN set -x \
- && rm /var/lib/dpkg/info/libc-bin.* \
- && apt-get -q clean \
- && apt-get -q update \
+# 1. Install runtime dependencies and configure server
+RUN apt-get -q update \
&& apt-get -q install -y --no-install-recommends --no-install-suggests \
dumb-init \
procps \
@@ -54,8 +56,6 @@ RUN set -x \
cron \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
- && service cron start \
- && pwd && cd /hugegraph-server/ \
&& sed -i "s/^restserver.url.*$/restserver.url=http:\/\/0.0.0.0:8080/g" ./conf/rest-server.properties
# 2. Init docker script
diff --git a/hugegraph-server/Dockerfile-hstore b/hugegraph-server/Dockerfile-hstore
index 47f758b0d5..54494dbad2 100644
--- a/hugegraph-server/Dockerfile-hstore
+++ b/hugegraph-server/Dockerfile-hstore
@@ -1,3 +1,4 @@
+# syntax=docker/dockerfile:1
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
@@ -15,22 +16,25 @@
# limitations under the License.
#
-# Dockerfile for HugeGraph Server
+# Dockerfile for HugeGraph Server (hstore backend)
# 1st stage: build source code
FROM maven:3.9.0-eclipse-temurin-11 AS build
-COPY . /pkg
WORKDIR /pkg
+
+COPY . .
+
ARG MAVEN_ARGS
-RUN mvn package $MAVEN_ARGS -e -B -ntp -DskipTests -Dmaven.javadoc.skip=true && pwd && ls -l && rm \
- ./hugegraph-server/*.tar.gz && rm ./hugegraph-pd/*.tar.gz && rm ./hugegraph-store/*.tar.gz
+RUN --mount=type=cache,target=/root/.m2 \
+ mvn package $MAVEN_ARGS -e -B -ntp -DskipTests -Dmaven.javadoc.skip=true \
+ && rm ./hugegraph-server/*.tar.gz ./hugegraph-pd/*.tar.gz ./hugegraph-store/*.tar.gz
# 2nd stage: runtime env
-# Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13
-FROM openjdk:11-slim
+# Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13
+FROM eclipse-temurin:11-jre-jammy
-COPY --from=build /pkg/hugegraph-server/apache-hugegraph-server-incubating-*/ /hugegraph-server/
+COPY --from=build /pkg/hugegraph-server/apache-hugegraph-server-*/ /hugegraph-server/
# remove hugegraph.properties and rename hstore.properties.template for default hstore backend
RUN cd /hugegraph-server/conf/graphs \
&& rm hugegraph.properties && mv hstore.properties.template hugegraph.properties
@@ -41,12 +45,10 @@ LABEL maintainer="HugeGraph Docker Maintainers "
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=50 -XshowSettings:vm" \
HUGEGRAPH_HOME="hugegraph-server"
-#COPY . /hugegraph/hugegraph-server
WORKDIR /hugegraph-server/
-# 1. Install environment and init HugeGraph Sever
-RUN set -x \
- && apt-get -q update \
+# 1. Install runtime dependencies and configure server
+RUN apt-get -q update \
&& apt-get -q install -y --no-install-recommends --no-install-suggests \
dumb-init \
procps \
@@ -56,13 +58,11 @@ RUN set -x \
cron \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
- && service cron start \
- && pwd && cd /hugegraph-server/ \
&& sed -i "s/^restserver.url.*$/restserver.url=http:\/\/0.0.0.0:8080/g" ./conf/rest-server.properties
# 2. Init docker script
COPY hugegraph-server/hugegraph-dist/docker/scripts/remote-connect.groovy ./scripts
-COPY hugegraph-server/hugegraph-dist/docker/scripts/detect-storage.groovy ./scripts
+#COPY hugegraph-server/hugegraph-dist/docker/scripts/detect-storage.groovy ./scripts
COPY hugegraph-server/hugegraph-dist/docker/docker-entrypoint.sh .
RUN chmod 755 ./docker-entrypoint.sh
diff --git a/hugegraph-server/README.md b/hugegraph-server/README.md
index 597d412940..c145190bf0 100644
--- a/hugegraph-server/README.md
+++ b/hugegraph-server/README.md
@@ -9,3 +9,24 @@ HugeGraph Server consists of two layers of functionality: the graph engine layer
- Storage Layer:
- Storage Backend: Supports multiple built-in storage backends (RocksDB/Memory/HStore/HBase/...) and allows users to extend custom backends without modifying the existing source code.
+
+## Docker
+
+### Standalone Mode
+
+```bash
+docker run -itd --name=hugegraph -p 8080:8080 hugegraph/hugegraph:1.7.0
+```
+
+> Use release tags (e.g., `1.7.0`) for stable deployments. The `latest` tag is intended for testing or development only.
+
+### Distributed Mode (PD + Store + Server)
+
+For a full distributed deployment, use the compose file in the `docker/` directory at the repository root:
+
+```bash
+cd docker
+HUGEGRAPH_VERSION=1.7.0 docker compose -f docker-compose-3pd-3store-3server.yml up -d
+```
+
+See [docker/README.md](../docker/README.md) for the full setup guide.
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/API.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/API.java
index c476864711..3220cf6b02 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/API.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/API.java
@@ -86,6 +86,8 @@ public class API {
MetricsUtil.registerMeter(API.class, "expected-error");
private static final Meter unknownErrorMeter =
MetricsUtil.registerMeter(API.class, "unknown-error");
+ private static final String STANDALONE_ERROR =
+ "GraphSpace management is not supported in standalone mode";
public static HugeGraph graph(GraphManager manager, String graphSpace,
String graph) {
@@ -241,6 +243,20 @@ public static boolean checkAndParseAction(String action) {
}
}
+ /**
+ * Ensures the graph manager is available and PD mode is enabled.
+ *
+ * @param manager the graph manager of current request
+ * @throws IllegalArgumentException if the graph manager is null
+ * @throws HugeException if PD mode is disabled
+ */
+ protected static void ensurePdModeEnabled(GraphManager manager) {
+ E.checkArgumentNotNull(manager, "Graph manager can't be null");
+ if (!manager.isPDEnabled()) {
+ throw new HugeException(STANDALONE_ERROR);
+ }
+ }
+
public static boolean hasAdminPerm(GraphManager manager, String user) {
return manager.authManager().isAdminManager(user);
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/AccessAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/AccessAPI.java
index 8813f2017a..35b05eedb1 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/AccessAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/AccessAPI.java
@@ -19,7 +19,6 @@
import java.util.List;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
import org.apache.hugegraph.auth.HugeAccess;
@@ -36,6 +35,8 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -50,7 +51,7 @@
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth/accesses")
+@Path("graphspaces/{graphspace}/auth/accesses")
@Singleton
@Tag(name = "AccessAPI")
public class AccessAPI extends API {
@@ -63,16 +64,15 @@ public class AccessAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonAccess jsonAccess) {
- LOG.debug("Graph [{}] create access: {}", graph, jsonAccess);
+ LOG.debug("GraphSpace [{}] create access: {}", graphSpace, jsonAccess);
checkCreatingBody(jsonAccess);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeAccess access = jsonAccess.build();
access.id(manager.authManager().createAccess(access));
- return manager.serializer(g).writeAuthElement(access);
+ return manager.serializer().writeAuthElement(access);
}
@PUT
@@ -81,14 +81,14 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The access id")
@PathParam("id") String id,
JsonAccess jsonAccess) {
- LOG.debug("Graph [{}] update access: {}", graph, jsonAccess);
+ LOG.debug("GraphSpace [{}] update access: {}", graphSpace, jsonAccess);
checkUpdatingBody(jsonAccess);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeAccess access;
try {
access = manager.authManager().getAccess(UserAPI.parseId(id));
@@ -97,24 +97,26 @@ public String update(@Context GraphManager manager,
}
access = jsonAccess.build(access);
manager.authManager().updateAccess(access);
- return manager.serializer(g).writeAuthElement(access);
+ return manager.serializer().writeAuthElement(access);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The group id to filter by")
@QueryParam("group") String group,
+ @Parameter(description = "The target id to filter by")
@QueryParam("target") String target,
+ @Parameter(description = "The limit of results to return")
@QueryParam("limit") @DefaultValue("100") long limit) {
- LOG.debug("Graph [{}] list belongs by group {} or target {}",
- graph, group, target);
+ LOG.debug("GraphSpace [{}] list accesses by group {} or target {}",
+ graphSpace, group, target);
E.checkArgument(group == null || target == null,
"Can't pass both group and target at the same time");
- HugeGraph g = graph(manager, graphSpace, graph);
List belongs;
if (group != null) {
Id id = UserAPI.parseId(group);
@@ -125,7 +127,7 @@ public String list(@Context GraphManager manager,
} else {
belongs = manager.authManager().listAllAccess(limit);
}
- return manager.serializer(g).writeAuthElements("accesses", belongs);
+ return manager.serializer().writeAuthElements("accesses", belongs);
}
@GET
@@ -133,14 +135,14 @@ public String list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The access id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get access: {}", graph, id);
+ LOG.debug("GraphSpace [{}] get access: {}", graphSpace, id);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeAccess access = manager.authManager().getAccess(UserAPI.parseId(id));
- return manager.serializer(g).writeAuthElement(access);
+ return manager.serializer().writeAuthElement(access);
}
@DELETE
@@ -148,13 +150,12 @@ public String get(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The access id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] delete access: {}", graph, id);
+ LOG.debug("GraphSpace [{}] delete access: {}", graphSpace, id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
try {
manager.authManager().deleteAccess(UserAPI.parseId(id));
} catch (NotFoundException e) {
@@ -167,12 +168,16 @@ public void delete(@Context GraphManager manager,
private static class JsonAccess implements Checkable {
@JsonProperty("group")
+ @Schema(description = "The group id", required = true)
private String group;
@JsonProperty("target")
+ @Schema(description = "The target id", required = true)
private String target;
@JsonProperty("access_permission")
+ @Schema(description = "The access permission", required = true)
private HugePermission permission;
@JsonProperty("access_description")
+ @Schema(description = "The access description")
private String description;
public HugeAccess build(HugeAccess access) {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/BelongAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/BelongAPI.java
index df3b3a11dd..09af7f51c9 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/BelongAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/BelongAPI.java
@@ -19,7 +19,6 @@
import java.util.List;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
import org.apache.hugegraph.auth.HugeBelong;
@@ -35,6 +34,8 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -49,7 +50,7 @@
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth/belongs")
+@Path("graphspaces/{graphspace}/auth/belongs")
@Singleton
@Tag(name = "BelongAPI")
public class BelongAPI extends API {
@@ -62,16 +63,15 @@ public class BelongAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonBelong jsonBelong) {
- LOG.debug("Graph [{}] create belong: {}", graph, jsonBelong);
+ LOG.debug("GraphSpace [{}] create belong: {}", graphSpace, jsonBelong);
checkCreatingBody(jsonBelong);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeBelong belong = jsonBelong.build();
belong.id(manager.authManager().createBelong(belong));
- return manager.serializer(g).writeAuthElement(belong);
+ return manager.serializer().writeAuthElement(belong);
}
@PUT
@@ -80,14 +80,14 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The belong id")
@PathParam("id") String id,
JsonBelong jsonBelong) {
- LOG.debug("Graph [{}] update belong: {}", graph, jsonBelong);
+ LOG.debug("GraphSpace [{}] update belong: {}", graphSpace, jsonBelong);
checkUpdatingBody(jsonBelong);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeBelong belong;
try {
belong = manager.authManager().getBelong(UserAPI.parseId(id));
@@ -96,24 +96,26 @@ public String update(@Context GraphManager manager,
}
belong = jsonBelong.build(belong);
manager.authManager().updateBelong(belong);
- return manager.serializer(g).writeAuthElement(belong);
+ return manager.serializer().writeAuthElement(belong);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The user id to filter by")
@QueryParam("user") String user,
+ @Parameter(description = "The group id to filter by")
@QueryParam("group") String group,
+ @Parameter(description = "The limit of results to return")
@QueryParam("limit") @DefaultValue("100") long limit) {
- LOG.debug("Graph [{}] list belongs by user {} or group {}",
- graph, user, group);
+ LOG.debug("GraphSpace [{}] list belongs by user {} or group {}",
+ graphSpace, user, group);
E.checkArgument(user == null || group == null,
"Can't pass both user and group at the same time");
- HugeGraph g = graph(manager, graphSpace, graph);
List belongs;
if (user != null) {
Id id = UserAPI.parseId(user);
@@ -124,7 +126,7 @@ public String list(@Context GraphManager manager,
} else {
belongs = manager.authManager().listAllBelong(limit);
}
- return manager.serializer(g).writeAuthElements("belongs", belongs);
+ return manager.serializer().writeAuthElements("belongs", belongs);
}
@GET
@@ -132,14 +134,14 @@ public String list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The belong id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get belong: {}", graph, id);
+ LOG.debug("GraphSpace [{}] get belong: {}", graphSpace, id);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeBelong belong = manager.authManager().getBelong(UserAPI.parseId(id));
- return manager.serializer(g).writeAuthElement(belong);
+ return manager.serializer().writeAuthElement(belong);
}
@DELETE
@@ -147,13 +149,12 @@ public String get(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The belong id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] delete belong: {}", graph, id);
+ LOG.debug("GraphSpace [{}] delete belong: {}", graphSpace, id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
try {
manager.authManager().deleteBelong(UserAPI.parseId(id));
} catch (NotFoundException e) {
@@ -166,10 +167,13 @@ public void delete(@Context GraphManager manager,
private static class JsonBelong implements Checkable {
@JsonProperty("user")
+ @Schema(description = "The user id", required = true)
private String user;
@JsonProperty("group")
+ @Schema(description = "The group id", required = true)
private String group;
@JsonProperty("belong_description")
+ @Schema(description = "The belong description")
private String description;
public HugeBelong build(HugeBelong belong) {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/GroupAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/GroupAPI.java
index 2c84a0310f..ae13beb4a6 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/GroupAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/GroupAPI.java
@@ -19,7 +19,6 @@
import java.util.List;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
import org.apache.hugegraph.auth.HugeGroup;
@@ -35,7 +34,10 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
@@ -49,7 +51,7 @@
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth/groups")
+@Path("/auth/groups")
@Singleton
@Tag(name = "GroupAPI")
public class GroupAPI extends API {
@@ -61,17 +63,15 @@ public class GroupAPI extends API {
@Status(Status.CREATED)
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
+ @RolesAllowed({"admin"})
public String create(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonGroup jsonGroup) {
- LOG.debug("Graph [{}] create group: {}", graph, jsonGroup);
+ LOG.debug("create group: {}", jsonGroup);
checkCreatingBody(jsonGroup);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeGroup group = jsonGroup.build();
group.id(manager.authManager().createGroup(group));
- return manager.serializer(g).writeAuthElement(group);
+ return manager.serializer().writeAuthElement(group);
}
@PUT
@@ -79,15 +79,14 @@ public String create(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
+ @RolesAllowed({"admin"})
public String update(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The group id")
@PathParam("id") String id,
JsonGroup jsonGroup) {
- LOG.debug("Graph [{}] update group: {}", graph, jsonGroup);
+ LOG.debug("update group: {}", jsonGroup);
checkUpdatingBody(jsonGroup);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeGroup group;
try {
group = manager.authManager().getGroup(UserAPI.parseId(id));
@@ -96,50 +95,46 @@ public String update(@Context GraphManager manager,
}
group = jsonGroup.build(group);
manager.authManager().updateGroup(group);
- return manager.serializer(g).writeAuthElement(group);
+ return manager.serializer().writeAuthElement(group);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
+ @RolesAllowed({"admin"})
public String list(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The limit of results to return")
@QueryParam("limit") @DefaultValue("100") long limit) {
- LOG.debug("Graph [{}] list groups", graph);
+ LOG.debug("list groups");
- HugeGraph g = graph(manager, graphSpace, graph);
List groups = manager.authManager().listAllGroups(limit);
- return manager.serializer(g).writeAuthElements("groups", groups);
+ return manager.serializer().writeAuthElements("groups", groups);
}
@GET
@Timed
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
+ @RolesAllowed({"admin"})
public String get(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The group id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get group: {}", graph, id);
+ LOG.debug("get group: {}", id);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeGroup group = manager.authManager().getGroup(IdGenerator.of(id));
- return manager.serializer(g).writeAuthElement(group);
+ return manager.serializer().writeAuthElement(group);
}
@DELETE
@Timed
@Path("{id}")
@Consumes(APPLICATION_JSON)
+ @RolesAllowed({"admin"})
public void delete(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The group id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] delete group: {}", graph, id);
+ LOG.debug("delete group: {}", id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
try {
manager.authManager().deleteGroup(IdGenerator.of(id));
} catch (NotFoundException e) {
@@ -152,8 +147,10 @@ public void delete(@Context GraphManager manager,
private static class JsonGroup implements Checkable {
@JsonProperty("group_name")
+ @Schema(description = "The group name", required = true)
private String name;
@JsonProperty("group_description")
+ @Schema(description = "The group description")
private String description;
public HugeGroup build(HugeGroup group) {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/LoginAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/LoginAPI.java
index faf09a312a..faf62c4064 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/LoginAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/LoginAPI.java
@@ -20,7 +20,6 @@
import javax.security.sasl.AuthenticationException;
import org.apache.commons.lang3.StringUtils;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.AuthenticationFilter;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
@@ -36,6 +35,7 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.BadRequestException;
@@ -46,12 +46,11 @@
import jakarta.ws.rs.NotAuthorizedException;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.HttpHeaders;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth")
+@Path("/auth")
@Singleton
@Tag(name = "LoginAPI")
public class LoginAPI extends API {
@@ -65,17 +64,14 @@ public class LoginAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String login(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonLogin jsonLogin) {
- LOG.debug("Graph [{}] user login: {}", graph, jsonLogin);
+ LOG.debug("user login: {}", jsonLogin);
checkCreatingBody(jsonLogin);
try {
String token = manager.authManager()
.loginUser(jsonLogin.name, jsonLogin.password, jsonLogin.expire);
- HugeGraph g = graph(manager, graphSpace, graph);
- return manager.serializer(g).writeMap(ImmutableMap.of("token", token));
+ return manager.serializer().writeMap(ImmutableMap.of("token", token));
} catch (AuthenticationException e) {
throw new NotAuthorizedException(e.getMessage(), e);
}
@@ -87,11 +83,11 @@ public String login(@Context GraphManager manager,
@Status(Status.OK)
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
- public void logout(@Context GraphManager manager, @PathParam("graph") String graph,
+ public void logout(@Context GraphManager manager,
@HeaderParam(HttpHeaders.AUTHORIZATION) String auth) {
E.checkArgument(StringUtils.isNotEmpty(auth),
"Request header Authorization must not be null");
- LOG.debug("Graph [{}] user logout: {}", graph, auth);
+ LOG.debug("user logout: {}", auth);
if (!auth.startsWith(AuthenticationFilter.BEARER_TOKEN_PREFIX)) {
throw new BadRequestException("Only HTTP Bearer authentication is supported");
@@ -108,12 +104,10 @@ public void logout(@Context GraphManager manager, @PathParam("graph") String gra
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String verifyToken(@Context GraphManager manager,
- @PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
@HeaderParam(HttpHeaders.AUTHORIZATION) String token) {
E.checkArgument(StringUtils.isNotEmpty(token),
"Request header Authorization must not be null");
- LOG.debug("Graph [{}] get user: {}", graph, token);
+ LOG.debug("get user: {}", token);
if (!token.startsWith(AuthenticationFilter.BEARER_TOKEN_PREFIX)) {
throw new BadRequestException("Only HTTP Bearer authentication is supported");
@@ -122,8 +116,7 @@ public String verifyToken(@Context GraphManager manager,
token = token.substring(AuthenticationFilter.BEARER_TOKEN_PREFIX.length());
UserWithRole userWithRole = manager.authManager().validateUser(token);
- HugeGraph g = graph(manager, graphSpace, graph);
- return manager.serializer(g)
+ return manager.serializer()
.writeMap(ImmutableMap.of(AuthConstant.TOKEN_USER_NAME,
userWithRole.username(),
AuthConstant.TOKEN_USER_ID,
@@ -133,10 +126,13 @@ public String verifyToken(@Context GraphManager manager,
private static class JsonLogin implements Checkable {
@JsonProperty("user_name")
+ @Schema(description = "The user name")
private String name;
@JsonProperty("user_password")
+ @Schema(description = "The user password")
private String password;
@JsonProperty("token_expire")
+ @Schema(description = "Token expiration time in seconds")
private long expire;
@Override
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ManagerAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ManagerAPI.java
new file mode 100644
index 0000000000..071e4b8a66
--- /dev/null
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ManagerAPI.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2017 HugeGraph Authors
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.hugegraph.api.auth;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.hugegraph.api.API;
+import org.apache.hugegraph.api.filter.StatusFilter;
+import org.apache.hugegraph.auth.AuthManager;
+import org.apache.hugegraph.auth.HugeGraphAuthProxy;
+import org.apache.hugegraph.auth.HugePermission;
+import org.apache.hugegraph.core.GraphManager;
+import org.apache.hugegraph.define.Checkable;
+import org.apache.hugegraph.util.E;
+import org.apache.hugegraph.util.Log;
+import org.slf4j.Logger;
+
+import com.codahale.metrics.annotation.Timed;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.common.collect.ImmutableMap;
+
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.inject.Singleton;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.Context;
+
+@Path("graphspaces/{graphspace}/auth/managers")
+@Singleton
+@Tag(name = "ManagerAPI")
+public class ManagerAPI extends API {
+
+ private static final Logger LOG = Log.logger(ManagerAPI.class);
+
+ @POST
+ @Timed
+ @StatusFilter.Status(StatusFilter.Status.CREATED)
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON_WITH_CHARSET)
+ public String createManager(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
+ @PathParam("graphspace") String graphSpace,
+ JsonManager jsonManager) {
+ LOG.debug("Create manager: {}", jsonManager);
+ ensurePdModeEnabled(manager);
+ String user = jsonManager.user;
+ HugePermission type = jsonManager.type;
+ // graphSpace now comes from @PathParam instead of JsonManager
+
+ validType(type);
+ AuthManager authManager = manager.authManager();
+ validUser(authManager, user);
+
+ String creator = HugeGraphAuthProxy.username();
+ switch (type) {
+ case SPACE:
+ validGraphSpace(manager, graphSpace);
+ validPermission(
+ hasAdminOrSpaceManagerPerm(manager, graphSpace, creator),
+ creator, "manager.create");
+ if (authManager.isSpaceMember(graphSpace, user)) {
+ authManager.deleteSpaceMember(graphSpace, user);
+ }
+ authManager.createSpaceManager(graphSpace, user);
+ break;
+ case SPACE_MEMBER:
+ validGraphSpace(manager, graphSpace);
+ validPermission(
+ hasAdminOrSpaceManagerPerm(manager, graphSpace, creator),
+ creator, "manager.create");
+ if (authManager.isSpaceManager(graphSpace, user)) {
+ authManager.deleteSpaceManager(graphSpace, user);
+ }
+ authManager.createSpaceMember(graphSpace, user);
+ break;
+ case ADMIN:
+ validPermission(hasAdminPerm(manager, creator),
+ creator, "manager.create");
+ authManager.createAdminManager(user);
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid type");
+ }
+
+ return manager.serializer()
+ .writeMap(ImmutableMap.of("user", user, "type", type,
+ "graphspace", graphSpace));
+ }
+
+ @DELETE
+ @Timed
+ @Consumes(APPLICATION_JSON)
+ public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
+ @PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The user name")
+ @QueryParam("user") String user,
+ @Parameter(description = "The manager type: SPACE, SPACE_MEMBER, or ADMIN")
+ @QueryParam("type") HugePermission type) {
+ LOG.debug("Delete graph manager: {} {} {}", user, type, graphSpace);
+ ensurePdModeEnabled(manager);
+ E.checkArgument(!"admin".equals(user) ||
+ type != HugePermission.ADMIN,
+ "User 'admin' can't be removed from ADMIN");
+
+ AuthManager authManager = manager.authManager();
+ validType(type);
+ validUser(authManager, user);
+ String actionUser = HugeGraphAuthProxy.username();
+
+ switch (type) {
+ case SPACE:
+ // only space manager and admin can delete user permission
+ validGraphSpace(manager, graphSpace);
+ validPermission(
+ hasAdminOrSpaceManagerPerm(manager, graphSpace, actionUser),
+ actionUser, "manager.delete");
+ authManager.deleteSpaceManager(graphSpace, user);
+ break;
+ case SPACE_MEMBER:
+ validGraphSpace(manager, graphSpace);
+ validPermission(
+ hasAdminOrSpaceManagerPerm(manager, graphSpace, actionUser),
+ actionUser, "manager.delete");
+ authManager.deleteSpaceMember(graphSpace, user);
+ break;
+ case ADMIN:
+ validPermission(
+ hasAdminPerm(manager, actionUser),
+ actionUser, "manager.delete");
+ authManager.deleteAdminManager(user);
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid type");
+ }
+ }
+
+ @GET
+ @Timed
+ @Consumes(APPLICATION_JSON)
+ public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
+ @PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The manager type: SPACE, SPACE_MEMBER or ADMIN")
+ @QueryParam("type") HugePermission type) {
+ LOG.debug("list graph manager: {} {}", type, graphSpace);
+ ensurePdModeEnabled(manager);
+ AuthManager authManager = manager.authManager();
+ validType(type);
+ List adminManagers;
+ switch (type) {
+ case SPACE:
+ validGraphSpace(manager, graphSpace);
+ adminManagers = authManager.listSpaceManager(graphSpace);
+ break;
+ case SPACE_MEMBER:
+ validGraphSpace(manager, graphSpace);
+ adminManagers = authManager.listSpaceMember(graphSpace);
+ break;
+ case ADMIN:
+ adminManagers = authManager.listAdminManager();
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid type");
+ }
+ return manager.serializer().writeList("admins", adminManagers);
+ }
+
+ @GET
+ @Timed
+ @Path("check")
+ @Consumes(APPLICATION_JSON)
+ public String checkRole(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
+ @PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The manager type: " +
+ "SPACE, SPACE_MEMBER, or ADMIN")
+ @QueryParam("type") HugePermission type) {
+ LOG.debug("check if current user is graph manager: {} {}", type, graphSpace);
+ ensurePdModeEnabled(manager);
+ validType(type);
+ AuthManager authManager = manager.authManager();
+ String user = HugeGraphAuthProxy.username();
+
+ boolean result;
+ switch (type) {
+ case SPACE:
+ validGraphSpace(manager, graphSpace);
+ result = authManager.isSpaceManager(graphSpace, user);
+ break;
+ case SPACE_MEMBER:
+ validGraphSpace(manager, graphSpace);
+ result = authManager.isSpaceMember(graphSpace, user);
+ break;
+ case ADMIN:
+ result = authManager.isAdminManager(user);
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid type");
+ }
+ return manager.serializer().writeMap(ImmutableMap.of("check", result));
+ }
+
+ @GET
+ @Timed
+ @Path("role")
+ @Consumes(APPLICATION_JSON)
+ public String getRolesInGs(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
+ @PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The user name") @QueryParam("user")
+ String user) {
+ LOG.debug("get user [{}]'s role in graph space [{}]", user, graphSpace);
+ ensurePdModeEnabled(manager);
+ AuthManager authManager = manager.authManager();
+ List result = new ArrayList<>();
+ validGraphSpace(manager, graphSpace);
+
+ if (authManager.isAdminManager(user)) {
+ result.add(HugePermission.ADMIN);
+ }
+ if (authManager.isSpaceManager(graphSpace, user)) {
+ result.add(HugePermission.SPACE);
+ }
+ if (authManager.isSpaceMember(graphSpace, user)) {
+ result.add(HugePermission.SPACE_MEMBER);
+ }
+ if (result.isEmpty()) {
+ result.add(HugePermission.NONE);
+ }
+ return manager.serializer().writeMap(
+ ImmutableMap.of("user", user, "graphspace", graphSpace, "roles",
+ result));
+ }
+
+ private void validUser(AuthManager authManager, String user) {
+ E.checkArgument(authManager.findUser(user) != null ||
+ authManager.findGroup(user) != null,
+ "The user or group is not exist");
+ }
+
+ private void validType(HugePermission type) {
+ E.checkArgument(type == HugePermission.SPACE ||
+ type == HugePermission.SPACE_MEMBER ||
+ type == HugePermission.ADMIN,
+ "The type must be in [SPACE, SPACE_MEMBER, ADMIN]");
+ }
+
+ private void validGraphSpace(GraphManager manager, String graphSpace) {
+ E.checkArgument(manager.graphSpace(graphSpace) != null,
+ "The graph space is not exist");
+ }
+
+ private static class JsonManager implements Checkable {
+
+ @JsonProperty("user")
+ @Schema(description = "The user or group name", required = true)
+ private String user;
+ @JsonProperty("type")
+ @Schema(description = "The manager type: SPACE, SPACE_MEMBER, or ADMIN", required = true)
+ private HugePermission type;
+
+ @Override
+ public void checkCreate(boolean isBatch) {
+ }
+
+ @Override
+ public void checkUpdate() {
+ }
+ }
+}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ProjectAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ProjectAPI.java
index 97bf81e58c..4380093ba0 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ProjectAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/ProjectAPI.java
@@ -23,7 +23,6 @@
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
import org.apache.hugegraph.auth.AuthManager;
@@ -40,6 +39,8 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -54,7 +55,7 @@
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth/projects")
+@Path("graphspaces/{graphspace}/auth/projects")
@Singleton
@Tag(name = "ProjectAPI")
public class ProjectAPI extends API {
@@ -69,13 +70,12 @@ public class ProjectAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonProject jsonProject) {
- LOG.debug("Graph [{}] create project: {}", graph, jsonProject);
+ LOG.debug("GraphSpace [{}] create project: {}", graphSpace, jsonProject);
checkCreatingBody(jsonProject);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeProject project = jsonProject.build();
Id projectId = manager.authManager().createProject(project);
/*
@@ -83,7 +83,7 @@ public String create(@Context GraphManager manager,
* created
*/
project = manager.authManager().getProject(projectId);
- return manager.serializer(g).writeAuthElement(project);
+ return manager.serializer().writeAuthElement(project);
}
@PUT
@@ -92,16 +92,21 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The project id")
@PathParam("id") String id,
+ @Parameter(
+ description = "The action to perform: " +
+ "add_graph, remove_graph, " +
+ "or empty for description " +
+ "update")
@QueryParam("action") String action,
JsonProject jsonProject) {
- LOG.debug("Graph [{}] update {} project: {}", graph, action,
+ LOG.debug("GraphSpace [{}] update {} project: {}", graphSpace, action,
jsonProject);
checkUpdatingBody(jsonProject);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeProject project;
Id projectId = UserAPI.parseId(id);
AuthManager authManager = manager.authManager();
@@ -124,22 +129,22 @@ public String update(@Context GraphManager manager,
project = jsonProject.buildUpdateDescription(project);
}
authManager.updateProject(project);
- return manager.serializer(g).writeAuthElement(project);
+ return manager.serializer().writeAuthElement(project);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The limit of results to return")
@QueryParam("limit") @DefaultValue("100") long limit) {
- LOG.debug("Graph [{}] list project", graph);
+ LOG.debug("GraphSpace [{}] list project", graphSpace);
- HugeGraph g = graph(manager, graphSpace, graph);
List projects = manager.authManager()
.listAllProject(limit);
- return manager.serializer(g).writeAuthElements("projects", projects);
+ return manager.serializer().writeAuthElements("projects", projects);
}
@GET
@@ -147,19 +152,19 @@ public String list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The project id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get project: {}", graph, id);
+ LOG.debug("GraphSpace [{}] get project: {}", graphSpace, id);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeProject project;
try {
project = manager.authManager().getProject(UserAPI.parseId(id));
} catch (NotFoundException e) {
throw new IllegalArgumentException("Invalid project id: " + id);
}
- return manager.serializer(g).writeAuthElement(project);
+ return manager.serializer().writeAuthElement(project);
}
@DELETE
@@ -167,13 +172,12 @@ public String get(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The project id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] delete project: {}", graph, id);
+ LOG.debug("GraphSpace [{}] delete project: {}", graphSpace, id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
try {
manager.authManager().deleteProject(UserAPI.parseId(id));
} catch (NotFoundException e) {
@@ -196,10 +200,13 @@ public static boolean isRemoveGraph(String action) {
private static class JsonProject implements Checkable {
@JsonProperty("project_name")
+ @Schema(description = "The project name", required = true)
private String name;
@JsonProperty("project_graphs")
+ @Schema(description = "Set of graph names associated with the project")
private Set graphs;
@JsonProperty("project_description")
+ @Schema(description = "The project description")
private String description;
public HugeProject build() {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/TargetAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/TargetAPI.java
index 8dfae357f8..7f673048dc 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/TargetAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/TargetAPI.java
@@ -20,7 +20,6 @@
import java.util.List;
import java.util.Map;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
import org.apache.hugegraph.auth.HugeTarget;
@@ -36,6 +35,8 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -50,7 +51,7 @@
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth/targets")
+@Path("graphspaces/{graphspace}/auth/targets")
@Singleton
@Tag(name = "TargetAPI")
public class TargetAPI extends API {
@@ -63,16 +64,15 @@ public class TargetAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonTarget jsonTarget) {
- LOG.debug("Graph [{}] create target: {}", graph, jsonTarget);
+ LOG.debug("GraphSpace [{}] create target: {}", graphSpace, jsonTarget);
checkCreatingBody(jsonTarget);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeTarget target = jsonTarget.build();
target.id(manager.authManager().createTarget(target));
- return manager.serializer(g).writeAuthElement(target);
+ return manager.serializer().writeAuthElement(target);
}
@PUT
@@ -81,14 +81,14 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The target id")
@PathParam("id") String id,
JsonTarget jsonTarget) {
- LOG.debug("Graph [{}] update target: {}", graph, jsonTarget);
+ LOG.debug("GraphSpace [{}] update target: {}", graphSpace, jsonTarget);
checkUpdatingBody(jsonTarget);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeTarget target;
try {
target = manager.authManager().getTarget(UserAPI.parseId(id));
@@ -97,21 +97,21 @@ public String update(@Context GraphManager manager,
}
target = jsonTarget.build(target);
manager.authManager().updateTarget(target);
- return manager.serializer(g).writeAuthElement(target);
+ return manager.serializer().writeAuthElement(target);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The limit of results to return")
@QueryParam("limit") @DefaultValue("100") long limit) {
- LOG.debug("Graph [{}] list targets", graph);
+ LOG.debug("GraphSpace [{}] list targets", graphSpace);
- HugeGraph g = graph(manager, graphSpace, graph);
List targets = manager.authManager().listAllTargets(limit);
- return manager.serializer(g).writeAuthElements("targets", targets);
+ return manager.serializer().writeAuthElements("targets", targets);
}
@GET
@@ -119,14 +119,14 @@ public String list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The target id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get target: {}", graph, id);
+ LOG.debug("GraphSpace [{}] get target: {}", graphSpace, id);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeTarget target = manager.authManager().getTarget(UserAPI.parseId(id));
- return manager.serializer(g).writeAuthElement(target);
+ return manager.serializer().writeAuthElement(target);
}
@DELETE
@@ -134,13 +134,12 @@ public String get(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The target id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] delete target: {}", graph, id);
+ LOG.debug("GraphSpace [{}] delete target: {}", graphSpace, id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
try {
manager.authManager().deleteTarget(UserAPI.parseId(id));
} catch (NotFoundException e) {
@@ -153,12 +152,16 @@ public void delete(@Context GraphManager manager,
private static class JsonTarget implements Checkable {
@JsonProperty("target_name")
+ @Schema(description = "The target name", required = true)
private String name;
@JsonProperty("target_graph")
+ @Schema(description = "The target graph name", required = true)
private String graph;
@JsonProperty("target_url")
+ @Schema(description = "The target URL", required = true)
private String url;
@JsonProperty("target_resources") // error when List
+ @Schema(description = "The target resources")
private List> resources;
public HugeTarget build(HugeTarget target) {
@@ -185,6 +188,16 @@ public HugeTarget build() {
return target;
}
+ @Override
+ public String toString() {
+ return "JsonTarget{" +
+ "name='" + name + '\'' +
+ ", graph='" + graph + '\'' +
+ ", url='" + url + '\'' +
+ ", resources=" + resources +
+ '}';
+ }
+
@Override
public void checkCreate(boolean isBatch) {
E.checkArgumentNotNull(this.name,
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java
index f098508da4..de51e6955d 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/auth/UserAPI.java
@@ -20,7 +20,6 @@
import java.util.List;
import org.apache.commons.lang3.StringUtils;
-import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
import org.apache.hugegraph.auth.HugeUser;
@@ -38,6 +37,8 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -52,7 +53,7 @@
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
-@Path("graphspaces/{graphspace}/graphs/{graph}/auth/users")
+@Path("graphspaces/{graphspace}/auth/users")
@Singleton
@Tag(name = "UserAPI")
public class UserAPI extends API {
@@ -65,16 +66,15 @@ public class UserAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
JsonUser jsonUser) {
- LOG.debug("Graph [{}] create user: {}", graph, jsonUser);
+ LOG.debug("GraphSpace [{}] create user: {}", graphSpace, jsonUser);
checkCreatingBody(jsonUser);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeUser user = jsonUser.build();
user.id(manager.authManager().createUser(user));
- return manager.serializer(g).writeAuthElement(user);
+ return manager.serializer().writeAuthElement(user);
}
@PUT
@@ -83,14 +83,14 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The user id")
@PathParam("id") String id,
JsonUser jsonUser) {
- LOG.debug("Graph [{}] update user: {}", graph, jsonUser);
+ LOG.debug("GraphSpace [{}] update user: {}", graphSpace, jsonUser);
checkUpdatingBody(jsonUser);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeUser user;
try {
user = manager.authManager().getUser(UserAPI.parseId(id));
@@ -99,21 +99,21 @@ public String update(@Context GraphManager manager,
}
user = jsonUser.build(user);
manager.authManager().updateUser(user);
- return manager.serializer(g).writeAuthElement(user);
+ return manager.serializer().writeAuthElement(user);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The limit of results to return")
@QueryParam("limit") @DefaultValue("100") long limit) {
- LOG.debug("Graph [{}] list users", graph);
+ LOG.debug("GraphSpace [{}] list users", graphSpace);
- HugeGraph g = graph(manager, graphSpace, graph);
List users = manager.authManager().listAllUsers(limit);
- return manager.serializer(g).writeAuthElements("users", users);
+ return manager.serializer().writeAuthElements("users", users);
}
@GET
@@ -121,14 +121,14 @@ public String list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The user id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get user: {}", graph, id);
+ LOG.debug("GraphSpace [{}] get user: {}", graphSpace, id);
- HugeGraph g = graph(manager, graphSpace, graph);
HugeUser user = manager.authManager().getUser(IdGenerator.of(id));
- return manager.serializer(g).writeAuthElement(user);
+ return manager.serializer().writeAuthElement(user);
}
@GET
@@ -136,13 +136,12 @@ public String get(@Context GraphManager manager,
@Path("{id}/role")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String role(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The user id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] get user role: {}", graph, id);
+ LOG.debug("GraphSpace [{}] get user role: {}", graphSpace, id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
HugeUser user = manager.authManager().getUser(IdGenerator.of(id));
return manager.authManager().rolePermission(user).toJson();
}
@@ -152,13 +151,12 @@ public String role(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
- @PathParam("graph") String graph,
+ @Parameter(description = "The user id")
@PathParam("id") String id) {
- LOG.debug("Graph [{}] delete user: {}", graph, id);
+ LOG.debug("GraphSpace [{}] delete user: {}", graphSpace, id);
- @SuppressWarnings("unused") // just check if the graph exists
- HugeGraph g = graph(manager, graphSpace, graph);
try {
manager.authManager().deleteUser(IdGenerator.of(id));
} catch (NotFoundException e) {
@@ -175,16 +173,22 @@ protected static Id parseId(String id) {
private static class JsonUser implements Checkable {
@JsonProperty("user_name")
+ @Schema(description = "The user name", required = true)
private String name;
@JsonProperty("user_password")
+ @Schema(description = "The user password", required = true)
private String password;
@JsonProperty("user_phone")
+ @Schema(description = "The user phone number")
private String phone;
@JsonProperty("user_email")
+ @Schema(description = "The user email address")
private String email;
@JsonProperty("user_avatar")
+ @Schema(description = "The user avatar URL")
private String avatar;
@JsonProperty("user_description")
+ @Schema(description = "The user description")
private String description;
public HugeUser build(HugeUser user) {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherAPI.java
index e8f760140a..a30bff73b8 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherAPI.java
@@ -33,6 +33,7 @@
import com.codahale.metrics.annotation.Timed;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -72,8 +73,11 @@ private CypherManager cypherManager() {
@CompressInterceptor.Compress(buffer = (1024 * 40))
@Produces(APPLICATION_JSON_WITH_CHARSET)
public CypherModel query(@Context HttpHeaders headers,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphspace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The cypher query string")
@QueryParam("cypher") String cypher) {
return this.queryByCypher(headers, graphspace, graph, cypher);
@@ -86,8 +90,11 @@ public CypherModel query(@Context HttpHeaders headers,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public CypherModel post(@Context HttpHeaders headers,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphspace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The cypher query string")
String cypher) {
return this.queryByCypher(headers, graphspace, graph, cypher);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherModel.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherModel.java
index cd5a769237..e7c3900605 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherModel.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherModel.java
@@ -21,13 +21,20 @@
import java.util.List;
import java.util.Map;
+import io.swagger.v3.oas.annotations.media.Schema;
+
/**
* As same as response of GremlinAPI
*/
public class CypherModel {
+ @Schema(description = "The request ID")
public String requestId;
+
+ @Schema(description = "The response status")
public Status status = new Status();
+
+ @Schema(description = "The query result")
public Result result = new Result();
public static CypherModel dataOf(String requestId, List data) {
@@ -51,14 +58,22 @@ private CypherModel() {
public static class Status {
+ @Schema(description = "The status message")
public String message = "";
+
+ @Schema(description = "The status code")
public int code;
+
+ @Schema(description = "Additional status attributes")
public Map attributes = Collections.EMPTY_MAP;
}
private static class Result {
+ @Schema(description = "The result data list")
public List data;
+
+ @Schema(description = "The result metadata")
public Map meta = Collections.EMPTY_MAP;
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/LoadDetectFilter.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/LoadDetectFilter.java
index 7ee5e7c0f7..1df19f5e5c 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/LoadDetectFilter.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/LoadDetectFilter.java
@@ -19,12 +19,16 @@
import java.util.List;
import java.util.Set;
+import java.util.function.BooleanSupplier;
+import java.util.function.LongSupplier;
import org.apache.hugegraph.config.HugeConfig;
import org.apache.hugegraph.config.ServerOptions;
import org.apache.hugegraph.define.WorkLoad;
import org.apache.hugegraph.util.Bytes;
import org.apache.hugegraph.util.E;
+import org.apache.hugegraph.util.Log;
+import org.slf4j.Logger;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.RateLimiter;
@@ -43,6 +47,8 @@
@PreMatching
public class LoadDetectFilter implements ContainerRequestFilter {
+ private static final Logger LOG = Log.logger(LoadDetectFilter.class);
+
private static final Set WHITE_API_LIST = ImmutableSet.of(
"",
"apis",
@@ -54,10 +60,44 @@ public class LoadDetectFilter implements ContainerRequestFilter {
private static final RateLimiter GC_RATE_LIMITER =
RateLimiter.create(1.0 / 30);
+ // Log at most 1 request per second to avoid too many logs when server is under heavy load
+ private static final RateLimiter BUSY_REJECT_LOG_RATE_LIMITER =
+ RateLimiter.create(1.0);
+ private static final RateLimiter MEMORY_REJECT_LOG_RATE_LIMITER =
+ RateLimiter.create(1.0);
+
@Context
private jakarta.inject.Provider configProvider;
@Context
private jakarta.inject.Provider loadProvider;
+ private BooleanSupplier gcTrigger = LoadDetectFilter::triggerGcIfNeeded;
+ private BooleanSupplier busyRejectLogPermit =
+ BUSY_REJECT_LOG_RATE_LIMITER::tryAcquire;
+ private BooleanSupplier memoryRejectLogPermit =
+ MEMORY_REJECT_LOG_RATE_LIMITER::tryAcquire;
+ private LongSupplier freeMemorySupplier = LoadDetectFilter::currentFreeMemoryInMB;
+
+ public static boolean isWhiteAPI(ContainerRequestContext context) {
+ List segments = context.getUriInfo().getPathSegments();
+ E.checkArgument(!segments.isEmpty(), "Invalid request uri '%s'",
+ context.getUriInfo().getPath());
+ String rootPath = segments.get(0).getPath();
+ return WHITE_API_LIST.contains(rootPath);
+ }
+
+ private static boolean triggerGcIfNeeded() {
+ if (GC_RATE_LIMITER.tryAcquire(1)) {
+ System.gc();
+ return true;
+ }
+ return false;
+ }
+
+ private static long currentFreeMemoryInMB() {
+ long allocatedMem = Runtime.getRuntime().totalMemory() -
+ Runtime.getRuntime().freeMemory();
+ return (Runtime.getRuntime().maxMemory() - allocatedMem) / Bytes.MB;
+ }
@Override
public void filter(ContainerRequestContext context) {
@@ -70,7 +110,14 @@ public void filter(ContainerRequestContext context) {
int maxWorkerThreads = config.get(ServerOptions.MAX_WORKER_THREADS);
WorkLoad load = this.loadProvider.get();
// There will be a thread doesn't work, dedicated to statistics
- if (load.incrementAndGet() >= maxWorkerThreads) {
+ int currentLoad = load.incrementAndGet();
+ if (currentLoad >= maxWorkerThreads) {
+ if (this.busyRejectLogPermit.getAsBoolean()) {
+ LOG.warn("Rejected request due to high worker load, method={}, path={}, " +
+ "currentLoad={}, maxWorkerThreads={}",
+ context.getMethod(), context.getUriInfo().getPath(),
+ currentLoad, maxWorkerThreads);
+ }
throw new ServiceUnavailableException(String.format(
"The server is too busy to process the request, " +
"you can config %s to adjust it or try again later",
@@ -78,12 +125,35 @@ public void filter(ContainerRequestContext context) {
}
long minFreeMemory = config.get(ServerOptions.MIN_FREE_MEMORY);
- long allocatedMem = Runtime.getRuntime().totalMemory() -
- Runtime.getRuntime().freeMemory();
- long presumableFreeMem = (Runtime.getRuntime().maxMemory() -
- allocatedMem) / Bytes.MB;
+ long presumableFreeMem = this.freeMemorySupplier.getAsLong();
if (presumableFreeMem < minFreeMemory) {
- gcIfNeeded();
+ boolean gcTriggered = this.gcTrigger.getAsBoolean();
+ if (gcTriggered) {
+ long recheckedFreeMem = this.freeMemorySupplier.getAsLong();
+ if (recheckedFreeMem >= minFreeMemory) {
+ if (this.memoryRejectLogPermit.getAsBoolean()) {
+ LOG.warn("Low free memory recovered after GC, method={}, path={}, " +
+ "presumableFreeMemMB={}, recheckedFreeMemMB={}, " +
+ "minFreeMemoryMB={}",
+ context.getMethod(), context.getUriInfo().getPath(),
+ presumableFreeMem, recheckedFreeMem, minFreeMemory);
+ }
+ return;
+ }
+ if (this.memoryRejectLogPermit.getAsBoolean()) {
+ LOG.warn("Rejected request due to low free memory after GC, " +
+ "method={}, path={}, presumableFreeMemMB={}, " +
+ "recheckedFreeMemMB={}, minFreeMemoryMB={}",
+ context.getMethod(), context.getUriInfo().getPath(),
+ presumableFreeMem, recheckedFreeMem, minFreeMemory);
+ }
+ presumableFreeMem = recheckedFreeMem;
+ } else if (this.memoryRejectLogPermit.getAsBoolean()) {
+ LOG.warn("Rejected request due to low free memory, method={}, path={}, " +
+ "presumableFreeMemMB={}, minFreeMemoryMB={}",
+ context.getMethod(), context.getUriInfo().getPath(),
+ presumableFreeMem, minFreeMemory);
+ }
throw new ServiceUnavailableException(String.format(
"The server available memory %s(MB) is below than " +
"threshold %s(MB) and can't process the request, " +
@@ -92,18 +162,4 @@ public void filter(ContainerRequestContext context) {
ServerOptions.MIN_FREE_MEMORY.name()));
}
}
-
- public static boolean isWhiteAPI(ContainerRequestContext context) {
- List segments = context.getUriInfo().getPathSegments();
- E.checkArgument(!segments.isEmpty(), "Invalid request uri '%s'",
- context.getUriInfo().getPath());
- String rootPath = segments.get(0).getPath();
- return WHITE_API_LIST.contains(rootPath);
- }
-
- private static void gcIfNeeded() {
- if (GC_RATE_LIMITER.tryAcquire(1)) {
- System.gc();
- }
- }
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java
index dda43b3fba..b69ff59596 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/PathFilter.java
@@ -18,11 +18,25 @@
package org.apache.hugegraph.api.filter;
import java.io.IOException;
+import java.net.URI;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.hugegraph.config.HugeConfig;
+import org.apache.hugegraph.config.ServerOptions;
+import org.apache.hugegraph.util.E;
+import org.apache.hugegraph.util.Log;
+import org.slf4j.Logger;
+
+import com.google.common.collect.ImmutableSet;
import jakarta.inject.Singleton;
import jakarta.ws.rs.container.ContainerRequestContext;
import jakarta.ws.rs.container.ContainerRequestFilter;
import jakarta.ws.rs.container.PreMatching;
+import jakarta.ws.rs.core.Context;
+import jakarta.ws.rs.core.PathSegment;
+import jakarta.ws.rs.core.UriInfo;
import jakarta.ws.rs.ext.Provider;
@Provider
@@ -30,29 +44,75 @@
@PreMatching
public class PathFilter implements ContainerRequestFilter {
+ private static final Logger LOG = Log.logger(PathFilter.class);
+
+ private static final String GRAPH_SPACE = "graphspaces";
+ private static final String ARTHAS_START = "arthas";
+
public static final String REQUEST_TIME = "request_time";
public static final String REQUEST_PARAMS_JSON = "request_params_json";
+ private static final String DELIMITER = "/";
+ private static final Set WHITE_API_LIST = ImmutableSet.of(
+ "",
+ "apis",
+ "metrics",
+ "versions",
+ "health",
+ "gremlin",
+ "graphs/auth",
+ "graphs/auth/users",
+ "auth/users",
+ "auth/managers",
+ "auth",
+ "hstore",
+ "pd",
+ "kafka",
+ "whiteiplist",
+ "vermeer",
+ "store",
+ "expiredclear",
+ "department",
+ "saas",
+ "trade",
+ "kvstore",
+ "openapi.json"
+ );
+
+ @Context
+ private jakarta.inject.Provider configProvider;
+
+ public static boolean isWhiteAPI(String rootPath) {
+
+ return WHITE_API_LIST.contains(rootPath);
+ }
+
@Override
- public void filter(ContainerRequestContext context) throws IOException {
+ public void filter(ContainerRequestContext context)
+ throws IOException {
context.setProperty(REQUEST_TIME, System.currentTimeMillis());
- // TODO: temporarily comment it to fix loader bug, handle it later
- /*// record the request json
- String method = context.getMethod();
- String requestParamsJson = "";
- if (method.equals(HttpMethod.POST)) {
- requestParamsJson = IOUtils.toString(context.getEntityStream(),
- Charsets.toCharset(CHARSET));
- // replace input stream because we have already read it
- InputStream in = IOUtils.toInputStream(requestParamsJson, Charsets.toCharset(CHARSET));
- context.setEntityStream(in);
- } else if (method.equals(HttpMethod.GET)) {
- MultivaluedMap pathParameters = context.getUriInfo()
- .getPathParameters();
- requestParamsJson = pathParameters.toString();
+ List segments = context.getUriInfo().getPathSegments();
+ E.checkArgument(segments.size() > 0, "Invalid request uri '%s'",
+ context.getUriInfo().getPath());
+ String rootPath = segments.get(0).getPath();
+
+ if (isWhiteAPI(rootPath) || GRAPH_SPACE.equals(rootPath) ||
+ ARTHAS_START.equals(rootPath)) {
+ return;
}
- context.setProperty(REQUEST_PARAMS_JSON, requestParamsJson);*/
+ UriInfo uriInfo = context.getUriInfo();
+ String defaultPathSpace =
+ this.configProvider.get().get(ServerOptions.PATH_GRAPH_SPACE);
+ String path = uriInfo.getBaseUri().getPath() +
+ String.join(DELIMITER, GRAPH_SPACE, defaultPathSpace);
+ for (PathSegment segment : segments) {
+ path = String.join(DELIMITER, path, segment.getPath());
+ }
+ LOG.debug("Redirect request uri from {} to {}",
+ uriInfo.getRequestUri().getPath(), path);
+ URI requestUri = uriInfo.getRequestUriBuilder().uri(path).build();
+ context.setRequestUri(uriInfo.getBaseUri(), requestUri);
}
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/BatchAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/BatchAPI.java
index 2ba95e5bc9..85beb142db 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/BatchAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/BatchAPI.java
@@ -40,6 +40,8 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
public class BatchAPI extends API {
private static final Logger LOG = Log.logger(BatchAPI.class);
@@ -78,14 +80,20 @@ public R commit(HugeConfig config, HugeGraph g, int size,
}
@JsonIgnoreProperties(value = {"type"})
+ @Schema(description = "Base class for vertex/edge in batch operations")
protected abstract static class JsonElement implements Checkable {
+ @Schema(description = "The vertex/edge ID. If not specified, " +
+ "it will be automatically generated based on ID strategy")
@JsonProperty("id")
public Object id;
+ @Schema(description = "The vertex/edge label")
@JsonProperty("label")
public String label;
+ @Schema(description = "The properties of the vertex/edge in key-value format")
@JsonProperty("properties")
public Map properties;
+ @Schema(description = "The type of element (vertex or edge)", hidden = true)
@JsonProperty("type")
public String type;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/EdgeAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/EdgeAPI.java
index 279c9c0e98..1f229cd6b1 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/EdgeAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/EdgeAPI.java
@@ -57,6 +57,8 @@
import com.codahale.metrics.annotation.Timed;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -85,9 +87,11 @@ public class EdgeAPI extends BatchAPI {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_write"})
+ "$action=edge_write"})
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
JsonEdge jsonEdge) {
LOG.debug("Graph [{}] create edge: {}", graph, jsonEdge);
@@ -114,7 +118,7 @@ public String create(@Context GraphManager manager,
jsonEdge.properties());
});
- return manager.serializer(g).writeEdge(edge);
+ return manager.serializer().writeEdge(edge);
}
@POST
@@ -125,11 +129,14 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_write"})
+ "$action=edge_write"})
public String create(@Context HugeConfig config,
@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "Whether to check if target vertices exist")
@QueryParam("check_vertex")
@DefaultValue("true") boolean checkVertex,
List jsonEdges) {
@@ -155,7 +162,7 @@ public String create(@Context HugeConfig config,
Edge edge = srcVertex.addEdge(jsonEdge.label, tgtVertex, jsonEdge.properties());
ids.add((Id) edge.id());
}
- return manager.serializer(g).writeIds(ids);
+ return manager.serializer().writeIds(ids);
});
}
@@ -169,10 +176,12 @@ public String create(@Context HugeConfig config,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_write"})
+ "$action=edge_write"})
public String update(@Context HugeConfig config,
@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
BatchEdgeRequest req) {
BatchEdgeRequest.checkUpdate(req);
@@ -213,7 +222,7 @@ public String update(@Context HugeConfig config,
});
// If return ids, the ids.size() maybe different with the origins'
- return manager.serializer(g).writeEdges(edges.iterator(), false);
+ return manager.serializer().writeEdges(edges.iterator(), false);
});
}
@@ -223,11 +232,15 @@ public String update(@Context HugeConfig config,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_write"})
+ "$action=edge_write"})
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge ID")
@PathParam("id") String id,
+ @Parameter(description = "Action to perform: 'append' or 'remove'")
@QueryParam("action") String action,
JsonEdge jsonEdge) {
LOG.debug("Graph [{}] update edge: {}", graph, jsonEdge);
@@ -255,7 +268,7 @@ public String update(@Context GraphManager manager,
}
commit(g, () -> updateProperties(edge, jsonEdge, append));
- return manager.serializer(g).writeEdge(edge);
+ return manager.serializer().writeEdge(edge);
}
@GET
@@ -263,18 +276,29 @@ public String update(@Context GraphManager manager,
@Compress
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_read"})
+ "$action=edge_read"})
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex ID to query edges. " +
+ "If not specified, query all edges")
@QueryParam("vertex_id") String vertexId,
+ @Parameter(description = "The direction of edges: BOTH, IN, or OUT")
@QueryParam("direction") String direction,
+ @Parameter(description = "Filter by edge label")
@QueryParam("label") String label,
+ @Parameter(description = "Filter by edge properties in JSON format")
@QueryParam("properties") String properties,
+ @Parameter(description = "Keep the starting predicate P in property query")
@QueryParam("keep_start_p")
@DefaultValue("false") boolean keepStartP,
+ @Parameter(description = "Offset for pagination")
@QueryParam("offset") @DefaultValue("0") long offset,
+ @Parameter(description = "Page number for pagination")
@QueryParam("page") String page,
+ @Parameter(description = "Limit the number of edges returned")
@QueryParam("limit") @DefaultValue("100") long limit) {
LOG.debug("Graph [{}] query edges by vertex: {}, direction: {}, " +
"label: {}, properties: {}, offset: {}, page: {}, limit: {}",
@@ -329,7 +353,7 @@ public String list(@Context GraphManager manager,
}
try {
- return manager.serializer(g).writeEdges(traversal, page != null);
+ return manager.serializer().writeEdges(traversal, page != null);
} finally {
if (g.tx().isOpen()) {
g.tx().close();
@@ -342,17 +366,20 @@ public String list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_read"})
+ "$action=edge_read"})
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge ID")
@PathParam("id") String id) {
LOG.debug("Graph [{}] get edge by id '{}'", graph, id);
HugeGraph g = graph(manager, graphSpace, graph);
try {
Edge edge = g.edge(id);
- return manager.serializer(g).writeEdge(edge);
+ return manager.serializer().writeEdge(edge);
} finally {
if (g.tx().isOpen()) {
g.tx().close();
@@ -365,11 +392,15 @@ public String get(@Context GraphManager manager,
@Path("{id}")
@Consumes(APPLICATION_JSON)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=edge_delete"})
+ "$action=edge_delete"})
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge ID")
@PathParam("id") String id,
+ @Parameter(description = "The edge label (used to verify edge identity)")
@QueryParam("label") String label) {
LOG.debug("Graph [{}] remove vertex by id '{}'", graph, id);
@@ -485,12 +516,16 @@ private Id getEdgeId(HugeGraph g, JsonEdge newEdge) {
protected static class BatchEdgeRequest {
+ @Schema(description = "List of edges to be created or updated", required = true)
@JsonProperty("edges")
public List jsonEdges;
+ @Schema(description = "Update strategies for each property key", required = true)
@JsonProperty("update_strategies")
public Map updateStrategies;
+ @Schema(description = "Whether to check if source/target vertices exist")
@JsonProperty("check_vertex")
public boolean checkVertex = false;
+ @Schema(description = "Whether to create edge if it does not exist")
@JsonProperty("create_if_not_exist")
public boolean createIfNotExist = true;
@@ -515,12 +550,16 @@ public String toString() {
private static class JsonEdge extends JsonElement {
+ @Schema(description = "The source vertex ID", required = true)
@JsonProperty("outV")
public Object source;
+ @Schema(description = "The source vertex label", required = true)
@JsonProperty("outVLabel")
public String sourceLabel;
+ @Schema(description = "The target vertex ID", required = true)
@JsonProperty("inV")
public Object target;
+ @Schema(description = "The target vertex label", required = true)
@JsonProperty("inVLabel")
public String targetLabel;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/VertexAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/VertexAPI.java
index 5adb33d65d..340f17de62 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/VertexAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/graph/VertexAPI.java
@@ -58,6 +58,8 @@
import com.codahale.metrics.annotation.Timed;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -87,7 +89,9 @@ public class VertexAPI extends BatchAPI {
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$owner=$graph $action=vertex_write"})
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
JsonVertex jsonVertex) {
LOG.debug("Graph [{}] create vertex: {}", graph, jsonVertex);
@@ -96,7 +100,7 @@ public String create(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
Vertex vertex = commit(g, () -> g.addVertex(jsonVertex.properties()));
- return manager.serializer(g).writeVertex(vertex);
+ return manager.serializer().writeVertex(vertex);
}
@POST
@@ -109,7 +113,9 @@ public String create(@Context GraphManager manager,
@RolesAllowed({"space_member", "$owner=$graph $action=vertex_write"})
public String create(@Context HugeConfig config,
@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
List jsonVertices) {
LOG.debug("Graph [{}] create vertices: {}", graph, jsonVertices);
@@ -123,7 +129,7 @@ public String create(@Context HugeConfig config,
for (JsonVertex vertex : jsonVertices) {
ids.add((Id) g.addVertex(vertex.properties()).id());
}
- return manager.serializer(g).writeIds(ids);
+ return manager.serializer().writeIds(ids);
});
}
@@ -142,7 +148,9 @@ public String create(@Context HugeConfig config,
@RolesAllowed({"space_member", "$owner=$graph $action=vertex_write"})
public String update(@Context HugeConfig config,
@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
BatchVertexRequest req) {
BatchVertexRequest.checkUpdate(req);
@@ -180,7 +188,7 @@ public String update(@Context HugeConfig config,
});
// If return ids, the ids.size() maybe different with the origins'
- return manager.serializer(g).writeVertices(vertices.iterator(), false);
+ return manager.serializer().writeVertices(vertices.iterator(), false);
});
}
@@ -191,9 +199,15 @@ public String update(@Context HugeConfig config,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$owner=$graph $action=vertex_write"})
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex ID")
@PathParam("id") String idValue,
+ @Parameter(description =
+ "Action to perform: 'append' to add new properties, " +
+ "'remove' to delete existing properties")
@QueryParam("action") String action,
JsonVertex jsonVertex) {
LOG.debug("Graph [{}] update vertex: {}", graph, jsonVertex);
@@ -217,7 +231,85 @@ public String update(@Context GraphManager manager,
commit(g, () -> updateProperties(vertex, jsonVertex, append));
- return manager.serializer(g).writeVertex(vertex);
+ return manager.serializer().writeVertex(vertex);
+ }
+
+ @POST
+ @Timed(name = "ann-search")
+ @Path("annsearch")
+ @Consumes(APPLICATION_JSON)
+ @Produces(APPLICATION_JSON_WITH_CHARSET)
+ @RolesAllowed({"admin", "$owner=$graph $action=vertex_read"})
+ public String annSearch(@Context GraphManager manager,
+ @PathParam("graphspace") String graphSpace,
+ @PathParam("graph") String graph,
+ AnnSearchRequest searchRequest) {
+ LOG.debug("Graph [{}] ANN search with request: {}", graph, searchRequest);
+
+ AnnSearchRequest.checkRequest(searchRequest);
+
+ HugeGraph g = graph(manager, graphSpace, graph);
+
+ // Check if vertex label exists
+ VertexLabel vertexLabel = g.vertexLabel(searchRequest.vertex_label);
+ if (vertexLabel == null) {
+ throw new IllegalArgumentException(
+ "Vertex label not found: " + searchRequest.vertex_label);
+ }
+
+ // Check if the property exists in the vertex label
+ PropertyKey propertyKey = g.propertyKey(searchRequest.properties);
+ if (propertyKey == null) {
+ throw new IllegalArgumentException(
+ "Property key not found: " + searchRequest.properties);
+ }
+
+ // Check if the property is defined in the vertex label
+ if (!vertexLabel.properties().contains(propertyKey.id())) {
+ throw new IllegalArgumentException("Property '" + searchRequest.properties +
+ "' is not defined in vertex label '" +
+ searchRequest.vertex_label + "'");
+ }
+
+ // Check if vector index exists for the property
+ boolean hasVectorIndex = g.indexLabels().stream().anyMatch(indexLabel ->
+ indexLabel.indexType() == IndexType.VECTOR &&
+ indexLabel.baseType() == HugeType.VERTEX_LABEL &&
+ indexLabel.baseValue()
+ .equals(vertexLabel.id()) &&
+ indexLabel.indexFields()
+ .contains(propertyKey.id()));
+
+ if (!hasVectorIndex) {
+ throw new IllegalArgumentException(
+ "No vector index found for property '" + searchRequest.properties +
+ "' in vertex label '" + searchRequest.vertex_label + "'");
+ }
+
+ // Log query information
+ LOG.debug(
+ "ANN query: vertex_label={}, property={}, vector_length={}, metric={}, " +
+ "dimension={}, hasVectorIndex={}",
+ searchRequest.vertex_label, searchRequest.properties,
+ searchRequest.user_vector.length,
+ searchRequest.metric, searchRequest.dimension, hasVectorIndex);
+
+ try {
+ // TODO: Here should call the actual ANN query from backend
+ LOG.debug("ANN query not yet implemented, returning empty result");
+
+ // Temporary: return empty result
+ return manager.serializer(g).writeVertices(g.traversal().V().limit(0), false);
+
+ // Future implementation:
+ // 1. Call JVector engine for similarity query
+ // 2. Return topk most similar vertices
+
+ } finally {
+ if (g.tx().isOpen()) {
+ g.tx().close();
+ }
+ }
}
@POST
@@ -304,14 +396,25 @@ public String annSearch(@Context GraphManager manager,
@RolesAllowed({"space", "$graphspace=$graphspace $owner=$graph " +
"$action=vertex_read"})
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "Filter by vertex label")
@QueryParam("label") String label,
+ @Parameter(description = "Filter by vertex properties in JSON format, " +
+ "e.g., {\"key\":\"value\"}")
@QueryParam("properties") String properties,
+ @Parameter(description =
+ "Keep the starting predicate P (like P.gt(), P.lt()) " +
+ "in property query or parse it to relational operators")
@QueryParam("keep_start_p")
@DefaultValue("false") boolean keepStartP,
+ @Parameter(description = "Offset for pagination")
@QueryParam("offset") @DefaultValue("0") long offset,
+ @Parameter(description = "Page number for pagination")
@QueryParam("page") String page,
+ @Parameter(description = "Limit the number of vertices returned")
@QueryParam("limit") @DefaultValue("100") long limit) {
LOG.debug("Graph [{}] query vertices by label: {}, properties: {}, " +
"offset: {}, page: {}, limit: {}",
@@ -351,7 +454,7 @@ public String list(@Context GraphManager manager,
}
try {
- return manager.serializer(g).writeVertices(traversal, page != null);
+ return manager.serializer().writeVertices(traversal, page != null);
} finally {
if (g.tx().isOpen()) {
g.tx().close();
@@ -365,8 +468,11 @@ public String list(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$owner=$graph $action=vertex_read"})
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex ID")
@PathParam("id") String idValue) {
LOG.debug("Graph [{}] get vertex by id '{}'", graph, idValue);
@@ -374,7 +480,7 @@ public String get(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
try {
Vertex vertex = g.vertex(id);
- return manager.serializer(g).writeVertex(vertex);
+ return manager.serializer().writeVertex(vertex);
} finally {
if (g.tx().isOpen()) {
g.tx().close();
@@ -388,9 +494,13 @@ public String get(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@RolesAllowed({"space_member", "$owner=$graph $action=vertex_delete"})
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex ID")
@PathParam("id") String idValue,
+ @Parameter(description = "The vertex label (used to verify vertex identity)")
@QueryParam("label") String label) {
LOG.debug("Graph [{}] remove vertex by id '{}'", graph, idValue);
@@ -469,10 +579,13 @@ private static Id getVertexId(HugeGraph g, JsonVertex vertex) {
private static class BatchVertexRequest {
+ @Schema(description = "List of vertices to be created or updated", required = true)
@JsonProperty("vertices")
public List jsonVertices;
+ @Schema(description = "Update strategies for each property key", required = true)
@JsonProperty("update_strategies")
public Map updateStrategies;
+ @Schema(description = "Whether to create vertex if it does not exist")
@JsonProperty("create_if_not_exist")
public boolean createIfNotExist = true;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinAPI.java
index 110a3ef5b8..c1701ea943 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinAPI.java
@@ -25,6 +25,7 @@
import com.codahale.metrics.Histogram;
import com.codahale.metrics.annotation.Timed;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -55,6 +56,7 @@ public class GremlinAPI extends GremlinQueryAPI {
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Response post(@Context HugeConfig conf,
@Context HttpHeaders headers,
+ @Parameter(description = "The Gremlin query request body")
String request) {
/* The following code is reserved for forwarding request */
// context.getRequestDispatcher(location).forward(request, response);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinQueryAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinQueryAPI.java
index 1f35da5f1c..2ab55f584a 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinQueryAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/gremlin/GremlinQueryAPI.java
@@ -43,7 +43,8 @@ public class GremlinQueryAPI extends API {
"java.util.concurrent.TimeoutException",
"groovy.lang.",
"org.codehaus.",
- "org.apache.hugegraph."
+ "org.apache.hugegraph.",
+ "org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException"
);
@Context
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/AlgorithmAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/AlgorithmAPI.java
index 82c0611f5f..79933bc371 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/AlgorithmAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/AlgorithmAPI.java
@@ -36,6 +36,7 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -61,9 +62,13 @@ public class AlgorithmAPI extends API {
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RedirectFilter.RedirectMasterRole
public Map post(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The algorithm name")
@PathParam("name") String algorithm,
+ @Parameter(description = "The algorithm parameters")
Map parameters) {
LOG.debug("Graph [{}] schedule algorithm job: {}", graph, parameters);
E.checkArgument(algorithm != null && !algorithm.isEmpty(),
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/ComputerAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/ComputerAPI.java
index 3e88f8ccb6..d5188385cc 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/ComputerAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/ComputerAPI.java
@@ -36,6 +36,7 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -61,9 +62,13 @@ public class ComputerAPI extends API {
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RedirectFilter.RedirectMasterRole
public Map post(@Context GraphManager manager,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The computer name")
@PathParam("name") String computer,
+ @Parameter(description = "The computer parameters")
Map parameters) {
LOG.debug("Graph [{}] schedule computer job: {}", graph, parameters);
E.checkArgument(computer != null && !computer.isEmpty(),
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/GremlinAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/GremlinAPI.java
index 2b28364b26..779cf19b66 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/GremlinAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/GremlinAPI.java
@@ -46,6 +46,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -77,8 +79,11 @@ public class GremlinAPI extends API {
"$action=gremlin_execute"})
@RedirectFilter.RedirectMasterRole
public Map post(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The Gremlin job request")
GremlinRequest request) {
LOG.debug("Graph [{}] schedule gremlin job: {}", graph, request);
checkCreatingBody(request);
@@ -99,12 +104,16 @@ public static class GremlinRequest implements Checkable {
// See org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer
@JsonProperty
+ @Schema(description = "The Gremlin script to execute", required = true)
private String gremlin;
@JsonProperty
+ @Schema(description = "The bindings for the Gremlin script")
private Map bindings = new HashMap<>();
@JsonProperty
+ @Schema(description = "The language of the Gremlin script", example = "gremlin-groovy")
private String language = "gremlin-groovy";
@JsonProperty
+ @Schema(description = "The aliases for graph references")
private Map aliases = new HashMap<>();
public String gremlin() {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/RebuildAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/RebuildAPI.java
index 35e0d2cadc..3219c8b3ab 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/RebuildAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/RebuildAPI.java
@@ -31,6 +31,7 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -56,9 +57,12 @@ public class RebuildAPI extends API {
"$action=index_label_write"})
@RedirectFilter.RedirectMasterRole
public Map vertexLabelRebuild(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace")
String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex label to rebuild")
@PathParam("name") String name) {
LOG.debug("Graph [{}] rebuild vertex label: {}", graph, name);
@@ -75,9 +79,12 @@ public Map vertexLabelRebuild(@Context GraphManager manager,
@RolesAllowed({"space", "$graphspace=$graphspace $owner=$graph " +
"$action=index_label_write"})
public Map edgeLabelRebuild(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace")
String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge label name to rebuild")
@PathParam("name") String name) {
LOG.debug("Graph [{}] rebuild edge label: {}", graph, name);
@@ -95,9 +102,12 @@ public Map edgeLabelRebuild(@Context GraphManager manager,
"$action=index_label_write"})
@RedirectFilter.RedirectMasterRole
public Map indexLabelRebuild(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace")
String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The index label name to rebuild")
@PathParam("name") String name) {
LOG.debug("Graph [{}] rebuild index label: {}", graph, name);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/TaskAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/TaskAPI.java
index 151d3356e8..d35cc9a955 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/TaskAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/job/TaskAPI.java
@@ -41,6 +41,7 @@
import com.codahale.metrics.annotation.Timed;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.BadRequestException;
@@ -69,12 +70,18 @@ public class TaskAPI extends API {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Map list(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The task status to filter")
@QueryParam("status") String status,
+ @Parameter(description = "The task ids to filter")
@QueryParam("ids") List ids,
+ @Parameter(description = "The maximum number of tasks")
@QueryParam("limit")
@DefaultValue("100") long limit,
+ @Parameter(description = "The page token for pagination")
@QueryParam("page") String page) {
LOG.debug("Graph [{}] list tasks with status {}, ids {}, " +
"limit {}, page {}", graph, status, ids, limit, page);
@@ -124,8 +131,11 @@ public Map list(@Context GraphManager manager,
@Path("{id}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Map get(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The task id")
@PathParam("id") long id) {
LOG.debug("Graph [{}] get task: {}", graph, id);
@@ -139,9 +149,13 @@ public Map get(@Context GraphManager manager,
@Path("{id}")
@RedirectFilter.RedirectMasterRole
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The task id")
@PathParam("id") long id,
+ @Parameter(description = "Force delete the task even if it's running")
@DefaultValue("false") @QueryParam("force") boolean force) {
LOG.debug("Graph [{}] delete task: {}", graph, id);
@@ -158,10 +172,14 @@ public void delete(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RedirectFilter.RedirectMasterRole
public Map update(@Context GraphManager manager,
+ @Parameter(description = "The graphspace name")
@PathParam("graphspace")
String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The task id")
@PathParam("id") long id,
+ @Parameter(description = "The action to perform on the task")
@QueryParam("action") String action) {
LOG.debug("Graph [{}] cancel task: {}", graph, id);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
index c6c6e8c962..b457b66bfc 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/metrics/MetricsAPI.java
@@ -71,6 +71,7 @@
import com.codahale.metrics.annotation.Timed;
import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -193,6 +194,8 @@ public String timers() {
@RolesAllowed({"space", "$owner= $action=metrics_read"})
@Operation(summary = "get all base metrics")
public String all(@Context GraphManager manager,
+ @Parameter(description = "Output format type: 'json' for JSON format, " +
+ "other values for Prometheus format")
@QueryParam("type") String type) {
if (type != null && type.equals(JSON_STR)) {
return baseMetricAll();
@@ -207,7 +210,9 @@ public String all(@Context GraphManager manager,
@Produces(APPLICATION_TEXT_WITH_CHARSET)
@RolesAllowed({"space", "$owner= $action=metrics_read"})
@Operation(summary = "get all statistics metrics")
- public String statistics(@QueryParam("type") String type) {
+ public String statistics(
+ @Parameter(description = "Output format type: 'json' for JSON format")
+ @QueryParam("type") String type) {
Map> metricMap = statistics();
if (type != null && type.equals(JSON_STR)) {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
index aef06dca9b..9316d7341b 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/GraphsAPI.java
@@ -29,6 +29,7 @@
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter;
import org.apache.hugegraph.auth.HugeAuthenticator.RequiredPerm;
+import org.apache.hugegraph.auth.HugeGraphAuthProxy;
import org.apache.hugegraph.auth.HugePermission;
import org.apache.hugegraph.config.HugeConfig;
import org.apache.hugegraph.core.GraphManager;
@@ -44,6 +45,7 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -87,6 +89,7 @@ private static Map convConfig(Map config) {
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$dynamic"})
public Object list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
@Context SecurityContext sc) {
LOG.debug("List graphs in graph space {}", graphSpace);
@@ -95,13 +98,13 @@ public Object list(@Context GraphManager manager,
}
Set graphs = manager.graphs(graphSpace);
LOG.debug("Get graphs list from graph manager with size {}",
- graphs.size());
+ graphs.size());
// Filter by user role
Set filterGraphs = new HashSet<>();
for (String graph : graphs) {
LOG.debug("Get graph {} and verify auth", graph);
String role = RequiredPerm.roleFor(graphSpace, graph,
- HugePermission.READ);
+ HugePermission.READ);
if (sc.isUserInRole(role)) {
try {
graph(manager, graphSpace, graph);
@@ -123,12 +126,14 @@ public Object list(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$owner=$name"})
public Object get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name) {
LOG.debug("Get graph by name '{}'", name);
HugeGraph g = graph(manager, graphSpace, name);
- return ImmutableMap.of("name", g.spaceGraphName(), "backend", g.backend());
+ return ImmutableMap.of("name", g.name(), "backend", g.backend());
}
@DELETE
@@ -137,8 +142,11 @@ public Object get(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space"})
public void drop(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name,
+ @Parameter(description = "Confirmation message to drop the graph")
@QueryParam("confirm_message") String message) {
LOG.debug("Drop graph by name '{}'", name);
@@ -153,12 +161,14 @@ public void drop(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"analyst"})
public Object reload(@Context GraphManager manager,
+ @Parameter(
+ description = "The action map containing 'action'='reload'")
Map actionMap) {
LOG.info("[SERVER] Manage graph with action map {}", actionMap);
E.checkArgument(actionMap != null &&
actionMap.containsKey(GRAPH_ACTION),
- "Please pass '%s' for graphs manage", GRAPH_ACTION);
+ "Please pass '%s' for graphs manage", GRAPH_ACTION);
String action = actionMap.get(GRAPH_ACTION);
if (action.equals(GRAPH_ACTION_RELOAD)) {
manager.reload();
@@ -176,12 +186,19 @@ public Object reload(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space"})
public Object create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name to create")
@PathParam("name") String name,
+ @Parameter(description = "The graph name to clone from (optional)")
@QueryParam("clone_graph_name") String clone,
+ @Parameter(
+ description = "The graph configuration options including " +
+ "'backend', 'serializer', 'store' and optionally " +
+ "'description'")
Map configs) {
LOG.debug("Create graph {} with config options '{}' in " +
- "graph space '{}'", name, configs, graphSpace);
+ "graph space '{}'", name, configs, graphSpace);
GraphSpace gs = manager.graphSpace(graphSpace);
HugeGraph graph;
E.checkArgumentNotNull(gs, "Not existed graph space: '%s'", graphSpace);
@@ -198,8 +215,7 @@ public Object create(@Context GraphManager manager,
}
}
- // todo: auth get actual user info
- String creator = "admin";
+ String creator = HugeGraphAuthProxy.username();
if (StringUtils.isNotEmpty(clone)) {
// Clone from existing graph
@@ -208,18 +224,18 @@ public Object create(@Context GraphManager manager,
} else {
// Create new graph
graph = manager.createGraph(graphSpace, name, creator,
- convConfig(configs), true);
+ convConfig(configs), true);
}
String description = (String) configs.get(GRAPH_DESCRIPTION);
if (description == null) {
description = Strings.EMPTY;
}
- Object result = ImmutableMap.of("name", graph.spaceGraphName(),
- "nickname", graph.nickname(),
- "backend", graph.backend(),
- "description", description);
+ Object result = ImmutableMap.of("name", graph.name(),
+ "nickname", graph.nickname(),
+ "backend", graph.backend(),
+ "description", description);
LOG.info("user [{}] create graph [{}] in graph space [{}] with config " +
- "[{}]", creator, name, graphSpace, configs);
+ "[{}]", creator, name, graphSpace, configs);
return result;
}
@@ -229,7 +245,9 @@ public Object create(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space"})
public File getConf(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name) {
LOG.debug("Get graph configuration by name '{}'", name);
@@ -250,8 +268,12 @@ public File getConf(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@RolesAllowed({"space"})
public void clear(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name,
+ @Parameter(description = "Confirmation message to clear all data, must be: " +
+ CONFIRM_CLEAR)
@QueryParam("confirm_message") String message) {
LOG.debug("Clear graph by name '{}'", name);
@@ -267,7 +289,9 @@ public void clear(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space", "$owner=$name"})
public Object createSnapshot(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name) {
LOG.debug("Create snapshot for graph '{}'", name);
@@ -282,7 +306,9 @@ public Object createSnapshot(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space", "$owner=$name"})
public Object resumeSnapshot(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name) {
LOG.debug("Resume snapshot for graph '{}'", name);
@@ -298,7 +324,9 @@ public Object resumeSnapshot(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space"})
public String compact(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name) {
LOG.debug("Manually compact graph '{}'", name);
@@ -313,7 +341,9 @@ public String compact(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space", "$owner=$name"})
public Map mode(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name,
GraphMode mode) {
LOG.debug("Set mode to: '{}' of graph '{}'", mode, name);
@@ -347,7 +377,9 @@ public Map mode(@Context GraphManager manager,
@RolesAllowed({"space"})
public Map graphReadMode(
@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("name") String name,
GraphReadMode readMode) {
LOG.debug("Set graph-read-mode to: '{}' of graph '{}'",
@@ -357,7 +389,7 @@ public Map graphReadMode(
"Graph-read-mode can't be null");
E.checkArgument(readMode == GraphReadMode.ALL ||
readMode == GraphReadMode.OLTP_ONLY,
- "Graph-read-mode could be ALL or OLTP_ONLY");
+ "Graph-read-mode could be ALL or OLTP_ONLY");
HugeGraph g = graph(manager, graphSpace, name);
manager.graphReadMode(graphSpace, name, readMode);
g.readMode(readMode);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/WhiteIpListAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/WhiteIpListAPI.java
index e965ed21a9..a0ee5af9cb 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/WhiteIpListAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/profile/WhiteIpListAPI.java
@@ -38,6 +38,7 @@
import com.google.common.collect.ImmutableMap;
import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -139,6 +140,9 @@ public Map updateWhiteIPs(@Context GraphManager manager,
@RolesAllowed("admin")
@Operation(summary = "enable/disable the white ip list")
public Map updateStatus(@Context GraphManager manager,
+ @Parameter(description = "Status to set: " +
+ "'true' to enable, " +
+ "'false' to disable")
@QueryParam("status") String status) {
LOG.debug("Enable or disable white ip list");
E.checkArgument("true".equals(status) ||
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/raft/RaftAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/raft/RaftAPI.java
index c981858be0..f868df522e 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/raft/RaftAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/raft/RaftAPI.java
@@ -40,6 +40,7 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -67,8 +68,11 @@ public class RaftAPI extends API {
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member"})
public Map> listPeers(@Context GraphManager manager,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The raft group name")
@QueryParam("group")
@DefaultValue("default")
String group) {
@@ -87,8 +91,11 @@ public Map> listPeers(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member"})
public Map getLeader(@Context GraphManager manager,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The raft group name")
@QueryParam("group")
@DefaultValue("default")
String group) {
@@ -108,11 +115,15 @@ public Map getLeader(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member"})
public Map transferLeader(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The raft group name")
@QueryParam("group")
@DefaultValue("default")
String group,
+ @Parameter(description = "The endpoint address")
@QueryParam("endpoint")
String endpoint) {
LOG.debug("Graph [{}] prepare to transfer leader to: {}",
@@ -133,11 +144,17 @@ public Map transferLeader(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member"})
public Map setLeader(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The raft group name")
@QueryParam("group")
@DefaultValue("default")
String group,
+ @Parameter(
+ description = "The endpoint address to set as " +
+ "leader")
@QueryParam("endpoint")
String endpoint) {
LOG.debug("Graph [{}] prepare to set leader to: {}",
@@ -158,10 +175,15 @@ public Map setLeader(@Context GraphManager manager,
@RolesAllowed({"space_member"})
@RedirectFilter.RedirectMasterRole
public Map addPeer(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The raft group name")
@QueryParam("group") @DefaultValue("default")
String group,
+ @Parameter(
+ description = "The endpoint address of the peer to add")
@QueryParam("endpoint") String endpoint) {
LOG.debug("Graph [{}] prepare to add peer: {}", graph, endpoint);
@@ -189,10 +211,16 @@ public Map addPeer(@Context GraphManager manager,
@RolesAllowed({"space_member"})
@RedirectFilter.RedirectMasterRole
public Map removePeer(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The raft group name")
@QueryParam("group")
@DefaultValue("default") String group,
+ @Parameter(
+ description = "The endpoint address of the peer to " +
+ "remove")
@QueryParam("endpoint") String endpoint) {
LOG.debug("Graph [{}] prepare to remove peer: {}", graph, endpoint);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/EdgeLabelAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/EdgeLabelAPI.java
index 09d7fe542e..f2026d58bd 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/EdgeLabelAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/EdgeLabelAPI.java
@@ -45,6 +45,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -75,7 +77,9 @@ public class EdgeLabelAPI extends API {
"$action=edge_label_write"})
@RedirectFilter.RedirectMasterRole
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
JsonEdgeLabel jsonEdgeLabel) {
LOG.debug("Graph [{}] create edge label: {}", graph, jsonEdgeLabel);
@@ -84,7 +88,7 @@ public String create(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
EdgeLabel.Builder builder = jsonEdgeLabel.convert2Builder(g);
EdgeLabel edgeLabel = builder.create();
- return manager.serializer(g).writeEdgeLabel(edgeLabel);
+ return manager.serializer().writeEdgeLabel(edgeLabel);
}
@PUT
@@ -96,9 +100,13 @@ public String create(@Context GraphManager manager,
"$action=edge_label_write"})
@RedirectFilter.RedirectMasterRole
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge label name")
@PathParam("name") String name,
+ @Parameter(description = "Action to perform: 'append' or 'remove'")
@QueryParam("action") String action,
JsonEdgeLabel jsonEdgeLabel) {
LOG.debug("Graph [{}] {} edge label: {}",
@@ -114,7 +122,7 @@ public String update(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
EdgeLabel.Builder builder = jsonEdgeLabel.convert2Builder(g);
EdgeLabel edgeLabel = append ? builder.append() : builder.eliminate();
- return manager.serializer(g).writeEdgeLabel(edgeLabel);
+ return manager.serializer().writeEdgeLabel(edgeLabel);
}
@GET
@@ -123,8 +131,11 @@ public String update(@Context GraphManager manager,
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
"$action=edge_label_read"})
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "Filter edge labels by names")
@QueryParam("names") List names) {
boolean listAll = CollectionUtils.isEmpty(names);
if (listAll) {
@@ -143,7 +154,7 @@ public String list(@Context GraphManager manager,
labels.add(g.schema().getEdgeLabel(name));
}
}
- return manager.serializer(g).writeEdgeLabels(labels);
+ return manager.serializer().writeEdgeLabels(labels);
}
@GET
@@ -153,14 +164,17 @@ public String list(@Context GraphManager manager,
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
"$action=edge_label_read"})
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge label name")
@PathParam("name") String name) {
LOG.debug("Graph [{}] get edge label by name '{}'", graph, name);
HugeGraph g = graph(manager, graphSpace, graph);
EdgeLabel edgeLabel = g.schema().getEdgeLabel(name);
- return manager.serializer(g).writeEdgeLabel(edgeLabel);
+ return manager.serializer().writeEdgeLabel(edgeLabel);
}
@DELETE
@@ -173,8 +187,11 @@ public String get(@Context GraphManager manager,
"$action=edge_label_delete"})
@RedirectFilter.RedirectMasterRole
public Map delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The edge label name to delete")
@PathParam("name") String name) {
LOG.debug("Graph [{}] remove edge label by name '{}'", graph, name);
@@ -189,38 +206,55 @@ public Map delete(@Context GraphManager manager,
* JsonEdgeLabel is only used to receive create and append requests
*/
@JsonIgnoreProperties(value = {"index_labels", "status"})
+ @Schema(description = "Edge label creation/update request")
private static class JsonEdgeLabel implements Checkable {
+ @Schema(description = "The edge label ID (only used in RESTORING mode)")
@JsonProperty("id")
public long id;
+ @Schema(description = "The edge label name", required = true)
@JsonProperty("name")
public String name;
+ @Schema(description = "The edge label type: NORMAL, EDGE, or RELATION")
@JsonProperty("edgelabel_type")
public EdgeLabelType edgeLabelType;
+ @Schema(description = "The parent edge label name (for inheritance)")
@JsonProperty("parent_label")
public String fatherLabel;
+ @Schema(description = "The source vertex label name", required = true)
@JsonProperty("source_label")
public String sourceLabel;
+ @Schema(description = "The target vertex label name", required = true)
@JsonProperty("target_label")
public String targetLabel;
+ @Schema(description = "Links between source and target vertex labels")
@JsonProperty("links")
public Set> links;
+ @Schema(description = "The frequency: NORMAL or ONE_DAILY")
@JsonProperty("frequency")
public Frequency frequency;
+ @Schema(description = "The property key names associated with this edge label")
@JsonProperty("properties")
public String[] properties;
+ @Schema(description = "The sort key names for edge properties")
@JsonProperty("sort_keys")
public String[] sortKeys;
+ @Schema(description = "The nullable property key names")
@JsonProperty("nullable_keys")
public String[] nullableKeys;
+ @Schema(description = "Time-to-live in seconds")
@JsonProperty("ttl")
public long ttl;
+ @Schema(description = "The property key name to use as TTL start time")
@JsonProperty("ttl_start_time")
public String ttlStartTime;
+ @Schema(description = "Whether to enable label indexing")
@JsonProperty("enable_label_index")
public Boolean enableLabelIndex;
+ @Schema(description = "User-defined metadata")
@JsonProperty("user_data")
public Userdata userdata;
+ @Schema(description = "Whether to check if edge label exists before creation")
@JsonProperty("check_exist")
public Boolean checkExist;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/IndexLabelAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/IndexLabelAPI.java
index 77a28b08a8..ec0e3a37eb 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/IndexLabelAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/IndexLabelAPI.java
@@ -45,6 +45,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -75,7 +77,9 @@ public class IndexLabelAPI extends API {
"$action=index_label_write"})
@RedirectFilter.RedirectMasterRole
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
JsonIndexLabel jsonIndexLabel) {
LOG.debug("Graph [{}] create index label: {}", graph, jsonIndexLabel);
@@ -85,7 +89,7 @@ public String create(@Context GraphManager manager,
IndexLabel.Builder builder = jsonIndexLabel.convert2Builder(g);
SchemaElement.TaskWithSchema il = builder.createWithTask();
il.indexLabel(mapIndexLabel(il.indexLabel()));
- return manager.serializer(g).writeTaskWithSchema(il);
+ return manager.serializer().writeTaskWithSchema(il);
}
@PUT
@@ -95,9 +99,13 @@ public String create(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RedirectFilter.RedirectMasterRole
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The index label name")
@PathParam("name") String name,
+ @Parameter(description = "Action to perform: 'append' or 'remove'")
@QueryParam("action") String action,
IndexLabelAPI.JsonIndexLabel jsonIndexLabel) {
LOG.debug("Graph [{}] {} index label: {}",
@@ -112,7 +120,7 @@ public String update(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
IndexLabel.Builder builder = jsonIndexLabel.convert2Builder(g);
IndexLabel indexLabel = append ? builder.append() : builder.eliminate();
- return manager.serializer(g).writeIndexlabel(mapIndexLabel(indexLabel));
+ return manager.serializer().writeIndexlabel(mapIndexLabel(indexLabel));
}
@GET
@@ -121,8 +129,11 @@ public String update(@Context GraphManager manager,
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
"$action=index_label_read"})
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "Filter index labels by names")
@QueryParam("names") List names) {
boolean listAll = CollectionUtils.isEmpty(names);
if (listAll) {
@@ -141,7 +152,7 @@ public String list(@Context GraphManager manager,
labels.add(g.schema().getIndexLabel(name));
}
}
- return manager.serializer(g).writeIndexlabels(mapIndexLabels(labels));
+ return manager.serializer().writeIndexlabels(mapIndexLabels(labels));
}
@GET
@@ -151,14 +162,17 @@ public String list(@Context GraphManager manager,
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
"$action=index_label_read"})
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The index label name")
@PathParam("name") String name) {
LOG.debug("Graph [{}] get index label by name '{}'", graph, name);
HugeGraph g = graph(manager, graphSpace, graph);
IndexLabel indexLabel = g.schema().getIndexLabel(name);
- return manager.serializer(g).writeIndexlabel(mapIndexLabel(indexLabel));
+ return manager.serializer().writeIndexlabel(mapIndexLabel(indexLabel));
}
@DELETE
@@ -171,8 +185,11 @@ public String get(@Context GraphManager manager,
"$action=index_label_delete"})
@RedirectFilter.RedirectMasterRole
public Map delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The index label name to delete")
@PathParam("name") String name) {
LOG.debug("Graph [{}] remove index label by name '{}'", graph, name);
@@ -206,24 +223,34 @@ private static IndexLabel mapIndexLabel(IndexLabel label) {
* JsonIndexLabel is only used to receive create and append requests
*/
@JsonIgnoreProperties(value = {"status"})
+ @Schema(description = "Index label creation/update request")
private static class JsonIndexLabel implements Checkable {
+ @Schema(description = "The index label ID (only used in RESTORING mode)")
@JsonProperty("id")
public long id;
+ @Schema(description = "The index label name", required = true)
@JsonProperty("name")
public String name;
+ @Schema(description = "The base type: VERTEX or EDGE", required = true)
@JsonProperty("base_type")
public HugeType baseType;
+ @Schema(description = "The base label name (vertex/edge label name)", required = true)
@JsonProperty("base_value")
public String baseValue;
+ @Schema(description = "The index type: SECONDARY, RANGE, SEARCH, or VECTOR")
@JsonProperty("index_type")
public IndexType indexType;
+ @Schema(description = "The property key names to build index on", required = true)
@JsonProperty("fields")
public String[] fields;
+ @Schema(description = "User-defined metadata")
@JsonProperty("user_data")
public Userdata userdata;
+ @Schema(description = "Whether to check if index label exists before creation")
@JsonProperty("check_exist")
public Boolean checkExist;
+ @Schema(description = "Whether to rebuild the index after creation")
@JsonProperty("rebuild")
public Boolean rebuild;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/PropertyKeyAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/PropertyKeyAPI.java
index c95e25339a..27d6ab1da2 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/PropertyKeyAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/PropertyKeyAPI.java
@@ -48,6 +48,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -75,10 +77,12 @@ public class PropertyKeyAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=property_key_write"})
+ "$action=property_key_write"})
@RedirectFilter.RedirectMasterRole
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
JsonPropertyKey jsonPropertyKey) {
LOG.debug("Graph [{}] create property key: {}", graph, jsonPropertyKey);
@@ -87,7 +91,7 @@ public String create(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
PropertyKey.Builder builder = jsonPropertyKey.convert2Builder(g);
SchemaElement.TaskWithSchema pk = builder.createWithTask();
- return manager.serializer(g).writeTaskWithSchema(pk);
+ return manager.serializer().writeTaskWithSchema(pk);
}
@PUT
@@ -97,12 +101,20 @@ public String create(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=property_key_write"})
+ "$action=property_key_write"})
@RedirectFilter.RedirectMasterRole
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The property key name")
@PathParam("name") String name,
+ @Parameter(
+ description =
+ "Action to perform: 'append' to add new properties, " +
+ "'remove' to delete existing properties, " +
+ "'clear' to clear OLAP property data")
@QueryParam("action") String action,
PropertyKeyAPI.JsonPropertyKey jsonPropertyKey) {
LOG.debug("Graph [{}] {} property key: {}",
@@ -121,7 +133,7 @@ public String update(@Context GraphManager manager,
Id id = g.clearPropertyKey(propertyKey);
SchemaElement.TaskWithSchema pk =
new SchemaElement.TaskWithSchema(propertyKey, id);
- return manager.serializer(g).writeTaskWithSchema(pk);
+ return manager.serializer().writeTaskWithSchema(pk);
}
// Parse action parameter
@@ -133,17 +145,20 @@ public String update(@Context GraphManager manager,
builder.eliminate();
SchemaElement.TaskWithSchema pk =
new SchemaElement.TaskWithSchema(propertyKey, IdGenerator.ZERO);
- return manager.serializer(g).writeTaskWithSchema(pk);
+ return manager.serializer().writeTaskWithSchema(pk);
}
@GET
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=property_key_read"})
+ "$action=property_key_read"})
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "Filter property keys by names")
@QueryParam("names") List names) {
boolean listAll = CollectionUtils.isEmpty(names);
if (listAll) {
@@ -162,7 +177,7 @@ public String list(@Context GraphManager manager,
propKeys.add(g.schema().getPropertyKey(name));
}
}
- return manager.serializer(g).writePropertyKeys(propKeys);
+ return manager.serializer().writePropertyKeys(propKeys);
}
@GET
@@ -170,7 +185,7 @@ public String list(@Context GraphManager manager,
@Path("{name}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=property_key_read"})
+ "$action=property_key_read"})
public String get(@Context GraphManager manager,
@PathParam("graphspace") String graphSpace,
@PathParam("graph") String graph,
@@ -179,7 +194,7 @@ public String get(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
PropertyKey propertyKey = g.schema().getPropertyKey(name);
- return manager.serializer(g).writePropertyKey(propertyKey);
+ return manager.serializer().writePropertyKey(propertyKey);
}
@DELETE
@@ -189,11 +204,14 @@ public String get(@Context GraphManager manager,
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
- "$action=property_key_delete"})
+ "$action=property_key_delete"})
@RedirectFilter.RedirectMasterRole
public Map delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The property key name to delete")
@PathParam("name") String name) {
LOG.debug("Graph [{}] remove property key by name '{}'", graph, name);
@@ -208,24 +226,36 @@ public Map delete(@Context GraphManager manager,
* JsonPropertyKey is only used to receive create and append requests
*/
@JsonIgnoreProperties(value = {"status"})
+ @Schema(description = "Property key creation/update request")
private static class JsonPropertyKey implements Checkable {
+ @Schema(description = "The property key ID (only used in RESTORING mode)")
@JsonProperty("id")
public long id;
+ @Schema(description = "The property key name", required = true)
@JsonProperty("name")
public String name;
+ @Schema(description = "The cardinality: SINGLE, LIST, or SET")
@JsonProperty("cardinality")
public Cardinality cardinality;
+ @Schema(description = "The data type: STRING, TEXT, INT, LONG, FLOAT, " +
+ "DOUBLE, BLOB, BOOLEAN, DATE, UUID")
@JsonProperty("data_type")
public DataType dataType;
+ @Schema(description = "The aggregate type: NONE, SUM, MAX, MIN, SUB, " +
+ "SET, INC, BIGDECIMAL")
@JsonProperty("aggregate_type")
public AggregateType aggregateType;
+ @Schema(description = "The write type: OLTP, OLAP, IMMUTABLE")
@JsonProperty("write_type")
public WriteType writeType;
+ @Schema(description = "Parent property keys for meta property")
@JsonProperty("properties")
public String[] properties;
+ @Schema(description = "User-defined metadata")
@JsonProperty("user_data")
public Userdata userdata;
+ @Schema(description = "Whether to check if property key exists before creation")
@JsonProperty("check_exist")
public Boolean checkExist;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/SchemaAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/SchemaAPI.java
index 0fb0b1cd15..07968925e7 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/SchemaAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/SchemaAPI.java
@@ -65,6 +65,6 @@ public String list(@Context GraphManager manager,
schemaMap.put("edgelabels", schema.getEdgeLabels());
schemaMap.put("indexlabels", schema.getIndexLabels());
- return manager.serializer(g).writeMap(schemaMap);
+ return manager.serializer().writeMap(schemaMap);
}
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/VertexLabelAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/VertexLabelAPI.java
index a845be7a66..c86622f7e5 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/VertexLabelAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/schema/VertexLabelAPI.java
@@ -43,6 +43,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -73,7 +75,9 @@ public class VertexLabelAPI extends API {
"$action=vertex_label_write"})
@RedirectFilter.RedirectMasterRole
public String create(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
JsonVertexLabel jsonVertexLabel) {
LOG.debug("Graph [{}] create vertex label: {}",
@@ -83,7 +87,7 @@ public String create(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
VertexLabel.Builder builder = jsonVertexLabel.convert2Builder(g);
VertexLabel vertexLabel = builder.create();
- return manager.serializer(g).writeVertexLabel(vertexLabel);
+ return manager.serializer().writeVertexLabel(vertexLabel);
}
@PUT
@@ -95,9 +99,13 @@ public String create(@Context GraphManager manager,
"$action=vertex_label_write"})
@RedirectFilter.RedirectMasterRole
public String update(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex label name")
@PathParam("name") String name,
+ @Parameter(description = "Action to perform: 'append' or 'remove'")
@QueryParam("action") String action,
JsonVertexLabel jsonVertexLabel) {
LOG.debug("Graph [{}] {} vertex label: {}",
@@ -115,7 +123,7 @@ public String update(@Context GraphManager manager,
VertexLabel vertexLabel = append ?
builder.append() :
builder.eliminate();
- return manager.serializer(g).writeVertexLabel(vertexLabel);
+ return manager.serializer().writeVertexLabel(vertexLabel);
}
@GET
@@ -124,8 +132,11 @@ public String update(@Context GraphManager manager,
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
"$action=vertex_label_read"})
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "Filter vertex labels by names")
@QueryParam("names") List names) {
boolean listAll = CollectionUtils.isEmpty(names);
if (listAll) {
@@ -144,7 +155,7 @@ public String list(@Context GraphManager manager,
labels.add(g.schema().getVertexLabel(name));
}
}
- return manager.serializer(g).writeVertexLabels(labels);
+ return manager.serializer().writeVertexLabels(labels);
}
@GET
@@ -154,14 +165,17 @@ public String list(@Context GraphManager manager,
@RolesAllowed({"space_member", "$graphspace=$graphspace $owner=$graph " +
"$action=vertex_label_read"})
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex label name")
@PathParam("name") String name) {
LOG.debug("Graph [{}] get vertex label by name '{}'", graph, name);
HugeGraph g = graph(manager, graphSpace, graph);
VertexLabel vertexLabel = g.schema().getVertexLabel(name);
- return manager.serializer(g).writeVertexLabel(vertexLabel);
+ return manager.serializer().writeVertexLabel(vertexLabel);
}
@DELETE
@@ -174,8 +188,11 @@ public String get(@Context GraphManager manager,
"$action=vertex_label_delete"})
@RedirectFilter.RedirectMasterRole
public Map delete(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex label name to delete")
@PathParam("name") String name) {
LOG.debug("Graph [{}] remove vertex label by name '{}'", graph, name);
@@ -190,28 +207,41 @@ public Map delete(@Context GraphManager manager,
* JsonVertexLabel is only used to receive create and append requests
*/
@JsonIgnoreProperties(value = {"index_labels", "status"})
+ @Schema(description = "Vertex label creation/update request")
private static class JsonVertexLabel implements Checkable {
+ @Schema(description = "The vertex label ID (only used in RESTORING mode)")
@JsonProperty("id")
public long id;
+ @Schema(description = "The vertex label name", required = true)
@JsonProperty("name")
public String name;
+ @Schema(description = "The ID strategy: AUTOMATIC, PRIMARY_KEY, " +
+ "CUSTOMIZE_STRING, CUSTOMIZE_NUMBER, CUSTOMIZE_UUID")
@JsonProperty("id_strategy")
public IdStrategy idStrategy;
+ @Schema(description = "The property key names associated with this vertex label")
@JsonProperty("properties")
public String[] properties;
+ @Schema(description = "The primary key names (used with PRIMARY_KEY strategy)")
@JsonProperty("primary_keys")
public String[] primaryKeys;
+ @Schema(description = "The nullable property key names")
@JsonProperty("nullable_keys")
public String[] nullableKeys;
+ @Schema(description = "Time-to-live in seconds")
@JsonProperty("ttl")
public long ttl;
+ @Schema(description = "The property key name to use as TTL start time")
@JsonProperty("ttl_start_time")
public String ttlStartTime;
+ @Schema(description = "Whether to enable label indexing")
@JsonProperty("enable_label_index")
public Boolean enableLabelIndex;
+ @Schema(description = "User-defined metadata")
@JsonProperty("user_data")
public Userdata userdata;
+ @Schema(description = "Whether to check if vertex label exists before creation")
@JsonProperty("check_exist")
public Boolean checkExist;
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
index c4f604aac9..35bc40aed0 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/space/GraphSpaceAPI.java
@@ -19,6 +19,9 @@
package org.apache.hugegraph.api.space;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -26,6 +29,8 @@
import org.apache.commons.lang.StringUtils;
import org.apache.hugegraph.api.API;
import org.apache.hugegraph.api.filter.StatusFilter.Status;
+import org.apache.hugegraph.auth.AuthManager;
+import org.apache.hugegraph.auth.HugeGraphAuthProxy;
import org.apache.hugegraph.core.GraphManager;
import org.apache.hugegraph.define.Checkable;
import org.apache.hugegraph.exception.NotFoundException;
@@ -40,6 +45,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Singleton;
@@ -51,6 +58,7 @@
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.core.SecurityContext;
@@ -70,6 +78,7 @@ public class GraphSpaceAPI extends API {
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Object list(@Context GraphManager manager,
@Context SecurityContext sc) {
+ ensurePdModeEnabled(manager);
Set spaces = manager.graphSpaces();
return ImmutableMap.of("graphSpaces", spaces);
}
@@ -79,7 +88,9 @@ public Object list(@Context GraphManager manager,
@Path("{graphspace}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Object get(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("graphspace") String graphSpace) {
+ ensurePdModeEnabled(manager);
manager.getSpaceStorage(graphSpace);
GraphSpace gs = space(manager, graphSpace);
@@ -92,6 +103,58 @@ public Object get(@Context GraphManager manager,
return gsInfo;
}
+ @GET
+ @Timed
+ @Path("profile")
+ @Produces(APPLICATION_JSON_WITH_CHARSET)
+ @RolesAllowed({"admin"})
+ public Object listProfile(@Context GraphManager manager,
+ @Parameter(description = "Filter graph spaces by " +
+ "name or nickname prefix")
+ @QueryParam("prefix") String prefix,
+ @Context SecurityContext sc) {
+ ensurePdModeEnabled(manager);
+ Set spaces = manager.graphSpaces();
+ List> spaceList = new ArrayList<>();
+ List> result = new ArrayList<>();
+ String user = HugeGraphAuthProxy.username();
+ AuthManager authManager = manager.authManager();
+ // FIXME: defaultSpace related interface is not implemented
+ // String defaultSpace = authManager.getDefaultSpace(user);
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ for (String sp : spaces) {
+ manager.getSpaceStorage(sp);
+ GraphSpace gs = space(manager, sp);
+ Map gsProfile = gs.info();
+ boolean isManager = verifyPermission(user, authManager, sp);
+
+ // 设置当前用户的是否允许访问该空间
+ if (gs.auth() && !isManager) {
+ gsProfile.put("authed", false);
+ } else {
+ gsProfile.put("authed", true);
+ }
+
+ gsProfile.put("create_time", format.format(gs.createTime()));
+ gsProfile.put("update_time", format.format(gs.updateTime()));
+ if (!isPrefix(gsProfile, prefix)) {
+ continue;
+ }
+
+ gsProfile.put("default", false);
+ result.add(gsProfile);
+ //boolean defaulted = StringUtils.equals(sp, defaultSpace);
+ //gsProfile.put("default", defaulted);
+ //if (defaulted) {
+ // result.add(gsProfile);
+ //} else {
+ // spaceList.add(gsProfile);
+ //}
+ }
+ result.addAll(spaceList);
+ return result;
+ }
+
@POST
@Timed
@Status(Status.CREATED)
@@ -100,10 +163,10 @@ public Object get(@Context GraphManager manager,
@RolesAllowed({"admin"})
public String create(@Context GraphManager manager,
JsonGraphSpace jsonGraphSpace) {
-
+ ensurePdModeEnabled(manager);
jsonGraphSpace.checkCreate(false);
- String creator = "admin";
+ String creator = HugeGraphAuthProxy.username();
GraphSpace exist = manager.graphSpace(jsonGraphSpace.name);
E.checkArgument(exist == null, "The graph space '%s' has existed",
jsonGraphSpace.name);
@@ -129,9 +192,10 @@ public boolean isPrefix(Map profile, String prefix) {
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"admin"})
public Map manage(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("name") String name,
Map actionMap) {
-
+ ensurePdModeEnabled(manager);
E.checkArgument(actionMap != null && actionMap.size() == 2 &&
actionMap.containsKey(GRAPH_SPACE_ACTION),
"Invalid request body '%s'", actionMap);
@@ -259,7 +323,9 @@ public Map manage(@Context GraphManager manager,
@Produces(APPLICATION_JSON_WITH_CHARSET)
@RolesAllowed({"admin"})
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("name") String name) {
+ ensurePdModeEnabled(manager);
manager.dropGraphSpace(name);
}
@@ -274,54 +340,79 @@ private String getDpUserName(String graphSpace) {
"_dp" : graphSpace.toLowerCase() + "_dp";
}
+ private boolean verifyPermission(String user, AuthManager authManager, String graphSpace) {
+ return authManager.isAdminManager(user) ||
+ authManager.isSpaceManager(graphSpace, user) ||
+ authManager.isSpaceMember(graphSpace, user);
+ }
+
private static class JsonGraphSpace implements Checkable {
@JsonProperty("name")
+ @Schema(description = "The name of the graph space", required = true)
public String name;
@JsonProperty("nickname")
+ @Schema(description = "The nickname of the graph space")
public String nickname;
@JsonProperty("description")
+ @Schema(description = "The description of the graph space")
public String description;
@JsonProperty("cpu_limit")
+ @Schema(description = "The CPU limit for the graph space", required = true)
public int cpuLimit;
@JsonProperty("memory_limit")
+ @Schema(description = "The memory limit for the graph space", required = true)
public int memoryLimit;
@JsonProperty("storage_limit")
+ @Schema(description = "The storage limit for the graph space", required = true)
public int storageLimit;
@JsonProperty("compute_cpu_limit")
+ @Schema(description = "The compute CPU limit for the graph space")
public int computeCpuLimit = 0;
@JsonProperty("compute_memory_limit")
+ @Schema(description = "The compute memory limit for the graph space")
public int computeMemoryLimit = 0;
@JsonProperty("oltp_namespace")
+ @Schema(description = "The OLTP namespace for the graph space")
public String oltpNamespace = "";
@JsonProperty("olap_namespace")
+ @Schema(description = "The OLAP namespace for the graph space")
public String olapNamespace = "";
@JsonProperty("storage_namespace")
+ @Schema(description = "The storage namespace for the graph space")
public String storageNamespace = "";
@JsonProperty("max_graph_number")
+ @Schema(description = "The maximum number of graphs allowed in the space", required = true)
public int maxGraphNumber;
@JsonProperty("max_role_number")
+ @Schema(description = "The maximum number of roles allowed in the space")
public int maxRoleNumber;
@JsonProperty("dp_username")
+ @Schema(description = "The data platform username for the graph space")
public String dpUserName;
@JsonProperty("dp_password")
+ @Schema(description = "The data platform password for the graph space")
public String dpPassWord;
@JsonProperty("auth")
+ @Schema(description = "Whether authentication is enabled for the graph space")
public boolean auth = false;
@JsonProperty("configs")
+ @Schema(description = "Additional configurations for the graph space")
public Map configs;
@JsonProperty("operator_image_path")
+ @Schema(description = "The operator image path for the graph space")
public String operatorImagePath = "";
@JsonProperty("internal_algorithm_image_url")
+ @Schema(description = "The internal algorithm image URL for the graph space")
public String internalAlgorithmImageUrl = "";
@Override
@@ -397,10 +488,13 @@ public String toString() {
private static class JsonDefaultRole implements Checkable {
@JsonProperty("user")
+ @Schema(description = "The username")
private String user;
@JsonProperty("role")
+ @Schema(description = "The role name")
private String role;
@JsonProperty("graph")
+ @Schema(description = "The graph name")
private String graph;
@Override
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/AllShortestPathsAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/AllShortestPathsAPI.java
index beefdea25b..3880b1239e 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/AllShortestPathsAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/AllShortestPathsAPI.java
@@ -41,6 +41,7 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableList;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.DefaultValue;
@@ -62,21 +63,33 @@ public class AllShortestPathsAPI extends API {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The source vertex ID")
@QueryParam("source") String source,
+ @Parameter(description = "The target vertex ID")
@QueryParam("target") String target,
+ @Parameter(description = "The direction of traversal")
@QueryParam("direction") String direction,
+ @Parameter(description = "The edge label to traverse")
@QueryParam("label") String edgeLabel,
+ @Parameter(description = "The maximum depth of traversal")
@QueryParam("max_depth") int depth,
+ @Parameter(description = "The maximum degree of vertices")
@QueryParam("max_degree")
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
+ @Parameter(description = "The degree to skip")
@QueryParam("skip_degree")
@DefaultValue("0") long skipDegree,
+ @Parameter(description = "Whether to include vertex details")
@QueryParam("with_vertex")
@DefaultValue("false") boolean withVertex,
+ @Parameter(description = "Whether to include edge details")
@QueryParam("with_edge")
@DefaultValue("false") boolean withEdge,
+ @Parameter(description = "The capacity of the traversal")
@QueryParam("capacity")
@DefaultValue(DEFAULT_CAPACITY) long capacity) {
LOG.debug("Graph [{}] get shortest path from '{}', to '{}' with " +
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/CountAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/CountAPI.java
index 6e4a1fe177..7dd58dd892 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/CountAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/CountAPI.java
@@ -42,6 +42,8 @@
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.POST;
@@ -61,7 +63,9 @@ public class CountAPI extends API {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String post(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
CountRequest request) {
LOG.debug("Graph [{}] get count from '{}' with request {}",
@@ -85,7 +89,7 @@ public String post(@Context GraphManager manager,
long count = traverser.count(sourceId, steps, request.containsTraversed,
request.dedupSize);
- return manager.serializer(g).writeMap(ImmutableMap.of("count", count));
+ return manager.serializer().writeMap(ImmutableMap.of("count", count));
}
private static List steps(HugeGraph graph, CountRequest request) {
@@ -100,12 +104,16 @@ private static List steps(HugeGraph graph, CountRequest request) {
private static class CountRequest {
@JsonProperty("source")
+ @Schema(description = "The source vertex ID", required = true)
public Object source;
@JsonProperty("steps")
+ @Schema(description = "The steps to traverse", required = true)
public List steps;
@JsonProperty("contains_traversed")
+ @Schema(description = "Whether to include traversed vertices")
public boolean containsTraversed = false;
@JsonProperty("dedup_size")
+ @Schema(description = "The deduplication size limit")
public long dedupSize = 1000000L;
@Override
@@ -120,15 +128,20 @@ public String toString() {
private static class Step {
@JsonProperty("direction")
+ @Schema(description = "The direction of traversal", example = "BOTH")
public Directions direction = Directions.BOTH;
@JsonProperty("labels")
+ @Schema(description = "The edge labels to traverse")
public List labels;
@JsonProperty("properties")
+ @Schema(description = "The properties to filter edges")
public Map properties;
@JsonAlias("degree")
@JsonProperty("max_degree")
+ @Schema(description = "The maximum degree of vertices to traverse")
public long maxDegree = Long.parseLong(DEFAULT_MAX_DEGREE);
@JsonProperty("skip_degree")
+ @Schema(description = "The degree to skip when traversing")
public long skipDegree = Long.parseLong(DEFAULT_SKIP_DEGREE);
@Override
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/EdgesAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/EdgesAPI.java
index 4aea4fb1b6..807fcce92c 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/EdgesAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/EdgesAPI.java
@@ -38,6 +38,7 @@
import com.codahale.metrics.annotation.Timed;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.DefaultValue;
@@ -76,7 +77,7 @@ public String list(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
Iterator edges = g.edges(ids);
- return manager.serializer(g).writeEdges(edges, false);
+ return manager.serializer().writeEdges(edges, false);
}
@GET
@@ -87,13 +88,14 @@ public String list(@Context GraphManager manager,
public String shards(@Context GraphManager manager,
@PathParam("graphspace") String graphSpace,
@PathParam("graph") String graph,
+ @Parameter(description = "The split size for shards")
@QueryParam("split_size") long splitSize) {
LOG.debug("Graph [{}] get vertex shards with split size '{}'",
graph, splitSize);
HugeGraph g = graph(manager, graphSpace, graph);
List shards = g.metadata(HugeType.EDGE_OUT, "splits", splitSize);
- return manager.serializer(g).writeList("shards", shards);
+ return manager.serializer().writeList("shards", shards);
}
@GET
@@ -122,6 +124,6 @@ public String scan(@Context GraphManager manager,
}
Iterator edges = g.edges(query);
- return manager.serializer(g).writeEdges(edges, query.paging());
+ return manager.serializer().writeEdges(edges, query.paging());
}
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KneighborAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KneighborAPI.java
index 3912d9c764..83183d08c5 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KneighborAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KneighborAPI.java
@@ -50,6 +50,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -73,16 +74,25 @@ public class KneighborAPI extends TraverserAPI {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The source vertex ID")
@QueryParam("source") String sourceV,
+ @Parameter(description = "The direction of traversal")
@QueryParam("direction") String direction,
+ @Parameter(description = "The edge label to traverse")
@QueryParam("label") String edgeLabel,
+ @Parameter(description = "The maximum depth of traversal")
@QueryParam("max_depth") int depth,
+ @Parameter(description = "Whether to return only count")
@QueryParam("count_only")
@DefaultValue("false") boolean countOnly,
+ @Parameter(description = "The maximum degree of vertices")
@QueryParam("max_degree")
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
+ @Parameter(description = "The maximum number of results")
@QueryParam("limit")
@DefaultValue(DEFAULT_ELEMENTS_LIMIT) int limit) {
LOG.debug("Graph [{}] get k-neighbor from '{}' with " +
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KoutAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KoutAPI.java
index 2a0e29662f..e784e38b40 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KoutAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/KoutAPI.java
@@ -50,6 +50,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -73,20 +74,31 @@ public class KoutAPI extends TraverserAPI {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The source vertex ID")
@QueryParam("source") String source,
+ @Parameter(description = "The direction of traversal")
@QueryParam("direction") String direction,
+ @Parameter(description = "The edge label to traverse")
@QueryParam("label") String edgeLabel,
+ @Parameter(description = "The maximum depth of traversal")
@QueryParam("max_depth") int depth,
+ @Parameter(description = "Whether to find nearest vertices first")
@QueryParam("nearest")
@DefaultValue("true") boolean nearest,
+ @Parameter(description = "Whether to return only count")
@QueryParam("count_only")
@DefaultValue("false") boolean count_only,
+ @Parameter(description = "The maximum degree of vertices")
@QueryParam("max_degree")
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
+ @Parameter(description = "The capacity of the traversal")
@QueryParam("capacity")
@DefaultValue(DEFAULT_CAPACITY) long capacity,
+ @Parameter(description = "The maximum number of results")
@QueryParam("limit")
@DefaultValue(DEFAULT_ELEMENTS_LIMIT) int limit) {
LOG.debug("Graph [{}] get k-out from '{}' with " +
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/NeighborRankAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/NeighborRankAPI.java
index dbefbad558..08396aa0b3 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/NeighborRankAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/NeighborRankAPI.java
@@ -87,7 +87,7 @@ public String neighborRank(@Context GraphManager manager,
traverser = new NeighborRankTraverser(g, request.alpha,
request.capacity);
List> ranks = traverser.neighborRank(sourceId, steps);
- return manager.serializer(g).writeList("ranks", ranks);
+ return manager.serializer().writeList("ranks", ranks);
}
private static List steps(HugeGraph graph,
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/PersonalRankAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/PersonalRankAPI.java
index c2b2db514c..45393e2a2b 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/PersonalRankAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/PersonalRankAPI.java
@@ -102,7 +102,7 @@ public String personalRank(@Context GraphManager manager,
Map ranks = traverser.personalRank(sourceId, request.label,
request.withLabel);
ranks = HugeTraverser.topN(ranks, request.sorted, request.limit);
- return manager.serializer(g).writeMap(ranks);
+ return manager.serializer().writeMap(ranks);
}
private static class RankRequest {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/ShortestPathAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/ShortestPathAPI.java
index e53d7a7d1b..6a6ecd2317 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/ShortestPathAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/ShortestPathAPI.java
@@ -41,6 +41,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.DefaultValue;
@@ -62,21 +63,33 @@ public class ShortestPathAPI extends API {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The source vertex ID")
@QueryParam("source") String source,
+ @Parameter(description = "The target vertex ID")
@QueryParam("target") String target,
+ @Parameter(description = "The direction of traversal")
@QueryParam("direction") String direction,
+ @Parameter(description = "The edge label to traverse")
@QueryParam("label") String edgeLabel,
+ @Parameter(description = "The maximum depth of traversal")
@QueryParam("max_depth") int depth,
+ @Parameter(description = "The maximum degree of vertices")
@QueryParam("max_degree")
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
+ @Parameter(description = "The degree to skip")
@QueryParam("skip_degree")
@DefaultValue("0") long skipDegree,
+ @Parameter(description = "Whether to include vertex details")
@QueryParam("with_vertex")
@DefaultValue("false") boolean withVertex,
+ @Parameter(description = "Whether to include edge details")
@QueryParam("with_edge")
@DefaultValue("false") boolean withEdge,
+ @Parameter(description = "The capacity of the traversal")
@QueryParam("capacity")
@DefaultValue(DEFAULT_CAPACITY) long capacity) {
LOG.debug("Graph [{}] get shortest path from '{}', to '{}' with " +
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/TraverserAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/TraverserAPI.java
index 923b3d43fa..28f776a3e6 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/TraverserAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/TraverserAPI.java
@@ -32,6 +32,8 @@
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
public class TraverserAPI extends API {
protected static EdgeStep step(HugeGraph graph, Step step) {
@@ -61,15 +63,20 @@ protected static Steps steps(HugeGraph graph, VESteps steps) {
protected static class Step {
@JsonProperty("direction")
+ @Schema(description = "The direction of traversal", example = "BOTH")
public Directions direction;
@JsonProperty("labels")
+ @Schema(description = "The edge labels to traverse")
public List labels;
@JsonProperty("properties")
+ @Schema(description = "The properties to filter edges")
public Map properties;
@JsonAlias("degree")
@JsonProperty("max_degree")
+ @Schema(description = "The maximum degree of vertices to traverse")
public long maxDegree = Long.parseLong(DEFAULT_MAX_DEGREE);
@JsonProperty("skip_degree")
+ @Schema(description = "The degree to skip when traversing")
public long skipDegree = 0L;
@Override
@@ -84,9 +91,11 @@ public String toString() {
protected static class VEStepEntity {
@JsonProperty("label")
+ @Schema(description = "The label of the step")
public String label;
@JsonProperty("properties")
+ @Schema(description = "The properties for the step")
public Map properties;
@Override
@@ -99,15 +108,20 @@ public String toString() {
protected static class VESteps {
@JsonProperty("direction")
+ @Schema(description = "The direction of traversal", example = "BOTH")
public Directions direction;
@JsonAlias("degree")
@JsonProperty("max_degree")
+ @Schema(description = "The maximum degree of vertices to traverse")
public long maxDegree = Long.parseLong(DEFAULT_MAX_DEGREE);
@JsonProperty("skip_degree")
+ @Schema(description = "The degree to skip when traversing")
public long skipDegree = 0L;
@JsonProperty("vertex_steps")
+ @Schema(description = "The vertex steps in the traversal")
public List vSteps;
@JsonProperty("edge_steps")
+ @Schema(description = "The edge steps in the traversal")
public List eSteps;
@Override
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/Vertices.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/Vertices.java
index d5be694893..3efee83ab2 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/Vertices.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/Vertices.java
@@ -36,13 +36,18 @@
import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
public class Vertices {
@JsonProperty("ids")
+ @Schema(description = "The vertex IDs", example = "[\"1:Tom\", \"2:Mary\"]")
public Set ids;
@JsonProperty("label")
+ @Schema(description = "The vertex label", example = "person")
public String label;
@JsonProperty("properties")
+ @Schema(description = "The vertex properties in key-value format")
public Map properties;
public Iterator vertices(HugeGraph g) {
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/VerticesAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/VerticesAPI.java
index 4963b87dba..2f853ec352 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/VerticesAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/VerticesAPI.java
@@ -38,6 +38,7 @@
import com.codahale.metrics.annotation.Timed;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.DefaultValue;
@@ -60,8 +61,11 @@ public class VerticesAPI extends API {
@Compress
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String list(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The vertex IDs")
@QueryParam("ids") List stringIds) {
LOG.debug("Graph [{}] get vertices by ids: {}", graph, stringIds);
@@ -76,7 +80,7 @@ public String list(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
Iterator vertices = g.vertices(ids);
- return manager.serializer(g).writeVertices(vertices, false);
+ return manager.serializer().writeVertices(vertices, false);
}
@GET
@@ -93,7 +97,7 @@ public String shards(@Context GraphManager manager,
HugeGraph g = graph(manager, graphSpace, graph);
List shards = g.metadata(HugeType.VERTEX, "splits", splitSize);
- return manager.serializer(g).writeList("shards", shards);
+ return manager.serializer().writeList("shards", shards);
}
@GET
@@ -122,6 +126,6 @@ public String scan(@Context GraphManager manager,
}
Iterator vertices = g.vertices(query);
- return manager.serializer(g).writeVertices(vertices, query.paging());
+ return manager.serializer().writeVertices(vertices, query.paging());
}
}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/WeightedShortestPathAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/WeightedShortestPathAPI.java
index 3cea3702db..e705bfba09 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/WeightedShortestPathAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/traversers/WeightedShortestPathAPI.java
@@ -41,6 +41,7 @@
import com.codahale.metrics.annotation.Timed;
+import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.DefaultValue;
@@ -62,21 +63,32 @@ public class WeightedShortestPathAPI extends API {
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public String get(@Context GraphManager manager,
+ @Parameter(description = "The graph space name")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The graph name")
@PathParam("graph") String graph,
+ @Parameter(description = "The source vertex ID")
@QueryParam("source") String source,
+ @Parameter(description = "The target vertex ID")
@QueryParam("target") String target,
+ @Parameter(description = "The direction of traversal")
@QueryParam("direction") String direction,
+ @Parameter(description = "The edge label to traverse")
@QueryParam("label") String edgeLabel,
+ @Parameter(description = "The weight property name")
@QueryParam("weight") String weight,
+ @Parameter(description = "The maximum degree of vertices")
@QueryParam("max_degree")
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
- @QueryParam("skip_degree")
+ @Parameter(description = "The degree to skip") @QueryParam("skip_degree")
@DefaultValue("0") long skipDegree,
+ @Parameter(description = "Whether to include vertex details")
@QueryParam("with_vertex")
@DefaultValue("false") boolean withVertex,
+ @Parameter(description = "Whether to include edge details")
@QueryParam("with_edge")
@DefaultValue("false") boolean withEdge,
+ @Parameter(description = "The capacity of the traversal")
@QueryParam("capacity")
@DefaultValue(DEFAULT_CAPACITY) long capacity) {
LOG.debug("Graph [{}] get weighted shortest path between '{}' and " +
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/variables/VariablesAPI.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/variables/VariablesAPI.java
index 0d878d9262..680c42c7e3 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/variables/VariablesAPI.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/variables/VariablesAPI.java
@@ -30,6 +30,8 @@
import com.codahale.metrics.annotation.Timed;
import com.google.common.collect.ImmutableMap;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.inject.Singleton;
import jakarta.ws.rs.Consumes;
@@ -55,8 +57,11 @@ public class VariablesAPI extends API {
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Map update(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The name of the graph")
@PathParam("graph") String graph,
+ @Parameter(description = "The key of the variable")
@PathParam("key") String key,
JsonVariableValue value) {
E.checkArgument(value != null && value.data != null,
@@ -72,7 +77,9 @@ public Map update(@Context GraphManager manager,
@Timed
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Map list(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The name of the graph")
@PathParam("graph") String graph) {
LOG.debug("Graph [{}] get variables", graph);
@@ -85,8 +92,11 @@ public Map list(@Context GraphManager manager,
@Path("{key}")
@Produces(APPLICATION_JSON_WITH_CHARSET)
public Map get(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The name of the graph")
@PathParam("graph") String graph,
+ @Parameter(description = "The key of the variable")
@PathParam("key") String key) {
LOG.debug("Graph [{}] get variable by key '{}'", graph, key);
@@ -104,8 +114,11 @@ public Map get(@Context GraphManager manager,
@Path("{key}")
@Consumes(APPLICATION_JSON)
public void delete(@Context GraphManager manager,
+ @Parameter(description = "The name of the graph space")
@PathParam("graphspace") String graphSpace,
+ @Parameter(description = "The name of the graph")
@PathParam("graph") String graph,
+ @Parameter(description = "The key of the variable")
@PathParam("key") String key) {
LOG.debug("Graph [{}] remove variable by key '{}'", graph, key);
@@ -115,6 +128,7 @@ public void delete(@Context GraphManager manager,
private static class JsonVariableValue {
+ @Schema(description = "The value of the variable", required = true)
public Object data;
@Override
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/ConfigAuthenticator.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/ConfigAuthenticator.java
deleted file mode 100644
index eaad573d5e..0000000000
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/ConfigAuthenticator.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.hugegraph.auth;
-
-import java.net.InetAddress;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-import org.apache.commons.lang.NotImplementedException;
-import org.apache.hugegraph.HugeGraph;
-import org.apache.hugegraph.backend.id.IdGenerator;
-import org.apache.hugegraph.config.HugeConfig;
-import org.apache.hugegraph.config.ServerOptions;
-import org.apache.hugegraph.util.E;
-import org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraphTokens;
-
-import jakarta.ws.rs.core.SecurityContext;
-
-public class ConfigAuthenticator implements HugeAuthenticator {
-
- public static final String KEY_USERNAME = CredentialGraphTokens.PROPERTY_USERNAME;
- public static final String KEY_PASSWORD = CredentialGraphTokens.PROPERTY_PASSWORD;
-
- private final Map tokens;
-
- public ConfigAuthenticator() {
- this.tokens = new HashMap<>();
- }
-
- @Override
- public void setup(HugeConfig config) {
- this.tokens.putAll(config.getMap(ServerOptions.AUTH_USER_TOKENS));
- assert !this.tokens.containsKey(USER_ADMIN);
- this.tokens.put(USER_ADMIN, config.get(ServerOptions.AUTH_ADMIN_TOKEN));
- }
-
- /**
- * Verify if a user is legal
- *
- * @param username the username for authentication
- * @param password the password for authentication
- * @return String No permission if return ROLE_NONE else return a role
- */
- @Override
- public UserWithRole authenticate(final String username,
- final String password,
- final String token) {
- E.checkArgumentNotNull(username,
- "The username parameter can't be null");
- E.checkArgumentNotNull(password,
- "The password parameter can't be null");
- E.checkArgument(token == null, "The token must be null");
-
- RolePermission role;
- if (password.equals(this.tokens.get(username))) {
- if (username.equals(USER_ADMIN)) {
- role = ROLE_ADMIN;
- } else {
- // Return role with all permission, set username as owner graph
- role = RolePermission.all(username);
- }
- } else {
- role = ROLE_NONE;
- }
-
- return new UserWithRole(IdGenerator.of(username), username, role);
- }
-
- @Override
- public void unauthorize(SecurityContext context) {
- }
-
- @Override
- public AuthManager authManager() {
- throw new NotImplementedException("AuthManager is unsupported by ConfigAuthenticator");
- }
-
- @Override
- public HugeGraph graph() {
- throw new NotImplementedException("graph() is unsupported by ConfigAuthenticator");
- }
-
- @Override
- public void initAdminUser(String password) {
- String adminToken = this.tokens.get(USER_ADMIN);
- E.checkArgument(Objects.equals(adminToken, password),
- "The password can't be changed for " +
- "ConfigAuthenticator");
- }
-
- @Override
- public SaslNegotiator newSaslNegotiator(InetAddress remoteAddress) {
- throw new NotImplementedException("SaslNegotiator is unsupported by ConfigAuthenticator");
- }
-}
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeFactoryAuthProxy.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeFactoryAuthProxy.java
index 41e9186d7b..57486a4079 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeFactoryAuthProxy.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeFactoryAuthProxy.java
@@ -129,7 +129,6 @@ private static void registerPrivateActions() {
Reflection.registerFieldsToFilter(StandardAuthenticator.class, "graph");
Reflection.registerMethodsToFilter(StandardAuthenticator.class, "initAdminUser",
"inputPassword", "graph");
- Reflection.registerFieldsToFilter(ConfigAuthenticator.class, "tokens");
Reflection.registerFieldsToFilter(HugeFactoryAuthProxy.class, "PROTECT_METHODS");
Reflection.registerMethodsToFilter(HugeFactoryAuthProxy.class, "genRegisterPrivateActions",
"registerClass", "registerPrivateActions",
@@ -508,7 +507,6 @@ private static void genRegisterPrivateActions() {
registerPrivateActions(InheritableThreadLocal.class);
registerPrivateActions(StandardAuthenticator.class);
- registerPrivateActions(ConfigAuthenticator.class);
registerPrivateActions(HugeFactoryAuthProxy.class);
registerPrivateActions(HugeAuthenticator.User.class);
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeGraphAuthProxy.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeGraphAuthProxy.java
index a4769bb4da..a414afd711 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeGraphAuthProxy.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/auth/HugeGraphAuthProxy.java
@@ -87,6 +87,7 @@
import org.apache.hugegraph.util.E;
import org.apache.hugegraph.util.Log;
import org.apache.hugegraph.util.RateLimiter;
+import org.apache.hugegraph.vector.VectorIndexManager;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
import org.apache.tinkerpop.gremlin.process.traversal.Bytecode.Instruction;
@@ -186,6 +187,7 @@ public static Context setAdmin() {
public static Context getContext() {
// Return task context first
String taskContext = TaskManager.getContext();
+
User user = User.fromJson(taskContext);
if (user != null) {
return new Context(user);
@@ -834,6 +836,11 @@ public RaftGroupManager raftGroupManager() {
return this.hugegraph.raftGroupManager();
}
+ @Override
+ public VectorIndexManager vectorIndexManager() {
+ return this.hugegraph.vectorIndexManager();
+ }
+
@Override
public void registerRpcServices(RpcServiceConfig4Server serverConfig,
RpcServiceConfig4Client clientConfig) {
@@ -953,6 +960,14 @@ public void updateTime(Date updateTime) {
this.hugegraph.updateTime(updateTime);
}
+ public static String username() {
+ Context context = HugeGraphAuthProxy.getContext();
+ if (context == null) {
+ return "anonymous";
+ }
+ return context.user.username();
+ }
+
private Cache cache(String prefix, long capacity,
long expiredTime) {
String name = prefix + "-" + this.hugegraph.spaceGraphName();
@@ -1559,7 +1574,6 @@ public List listAllUsers(long limit) {
@Override
public Id createGroup(HugeGroup group) {
this.updateCreator(group);
- verifyUserPermission(HugePermission.WRITE, group);
this.invalidRoleCache();
return this.authManager.createGroup(group);
}
@@ -1567,35 +1581,29 @@ public Id createGroup(HugeGroup group) {
@Override
public Id updateGroup(HugeGroup group) {
this.updateCreator(group);
- verifyUserPermission(HugePermission.WRITE, group);
this.invalidRoleCache();
return this.authManager.updateGroup(group);
}
@Override
public HugeGroup deleteGroup(Id id) {
- verifyUserPermission(HugePermission.DELETE,
- this.authManager.getGroup(id));
this.invalidRoleCache();
return this.authManager.deleteGroup(id);
}
@Override
public HugeGroup getGroup(Id id) {
- return verifyUserPermission(HugePermission.READ,
- this.authManager.getGroup(id));
+ return this.authManager.getGroup(id);
}
@Override
public List listGroups(List ids) {
- return verifyUserPermission(HugePermission.READ,
- this.authManager.listGroups(ids));
+ return this.authManager.listGroups(ids);
}
@Override
public List listAllGroups(long limit) {
- return verifyUserPermission(HugePermission.READ,
- this.authManager.listAllGroups(limit));
+ return this.authManager.listAllGroups(limit);
}
@Override
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/config/ServerOptions.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/config/ServerOptions.java
index 5a785eef4d..278542854b 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/config/ServerOptions.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/config/ServerOptions.java
@@ -32,7 +32,7 @@ public class ServerOptions extends OptionHolder {
"The url for listening of graph server.",
disallowEmpty(),
"http://127.0.0.1:8080"
- );
+ ).withUrlNormalization("http://");
public static final ConfigOption SERVER_EVENT_HUB_THREADS =
new ConfigOption<>(
@@ -118,7 +118,7 @@ public class ServerOptions extends OptionHolder {
"The url of gremlin server.",
disallowEmpty(),
"http://127.0.0.1:8182"
- );
+ ).withUrlNormalization("http://");
public static final ConfigOption GREMLIN_SERVER_TIMEOUT =
new ConfigOption<>(
@@ -270,7 +270,7 @@ public class ServerOptions extends OptionHolder {
"to clients. only used when starting the server in k8s.",
disallowEmpty(),
"http://0.0.0.0:8080"
- );
+ ).withUrlNormalization("http://");
public static final ConfigOption SERVER_K8S_URL =
new ConfigOption<>(
@@ -278,7 +278,7 @@ public class ServerOptions extends OptionHolder {
"The url of k8s.",
disallowEmpty(),
"https://127.0.0.1:8888"
- );
+ ).withUrlNormalization("https://");
public static final ConfigOption SERVER_K8S_USE_CA =
new ConfigOption<>(
@@ -389,7 +389,7 @@ public class ServerOptions extends OptionHolder {
"batch.max_vertices_per_batch",
"The maximum number of vertices submitted per batch.",
positiveInt(),
- 500
+ 2500
);
public static final ConfigOption MAX_EDGES_PER_BATCH =
@@ -397,7 +397,7 @@ public class ServerOptions extends OptionHolder {
"batch.max_edges_per_batch",
"The maximum number of edges submitted per batch.",
positiveInt(),
- 500
+ 2500
);
public static final ConfigOption MAX_WRITE_RATIO =
@@ -406,7 +406,7 @@ public class ServerOptions extends OptionHolder {
"The maximum thread ratio for batch writing, " +
"only take effect if the batch.max_write_threads is 0.",
rangeInt(0, 100),
- 50
+ 70
);
public static final ConfigOption MAX_WRITE_THREADS =
@@ -462,8 +462,7 @@ public class ServerOptions extends OptionHolder {
new ConfigOption<>(
"auth.authenticator",
"The class path of authenticator implementation. " +
- "e.g., org.apache.hugegraph.auth.StandardAuthenticator, " +
- "or org.apache.hugegraph.auth.ConfigAuthenticator.",
+ "e.g., org.apache.hugegraph.auth.StandardAuthenticator.",
null,
""
);
@@ -471,31 +470,12 @@ public class ServerOptions extends OptionHolder {
public static final ConfigOption ADMIN_PA =
new ConfigOption<>(
"auth.admin_pa",
- "The class path of authenticator implementation. " +
- "e.g., org.apache.hugegraph.auth.StandardAuthenticator, " +
- "or org.apache.hugegraph.auth.ConfigAuthenticator.",
+ "The default password for built-in admin account, " +
+ "takes effect on first startup.",
null,
"pa"
);
- public static final ConfigOption AUTH_ADMIN_TOKEN =
- new ConfigOption<>(
- "auth.admin_token",
- "Token for administrator operations, " +
- "only for org.apache.hugegraph.auth.ConfigAuthenticator.",
- disallowEmpty(),
- "162f7848-0b6d-4faf-b557-3a0797869c55"
- );
-
- public static final ConfigListOption AUTH_USER_TOKENS =
- new ConfigListOption<>(
- "auth.user_tokens",
- "The map of user tokens with name and password, " +
- "only for org.apache.hugegraph.auth.ConfigAuthenticator.",
- disallowEmpty(),
- "hugegraph:9fd95c9c-711b-415b-b85f-d4df46ba5c31"
- );
-
public static final ConfigOption SSL_KEYSTORE_FILE =
new ConfigOption<>(
"ssl.keystore_file",
diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
index 24949314a8..770e75cc74 100644
--- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
+++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
@@ -22,6 +22,7 @@
import static org.apache.hugegraph.space.GraphSpace.DEFAULT_GRAPH_SPACE_SERVICE_NAME;
import java.io.IOException;
+import java.io.StringWriter;
import java.text.ParseException;
import java.util.Arrays;
import java.util.Collections;
@@ -275,7 +276,7 @@ private static String serviceId(String graphSpace, Service.ServiceType type,
.replace("_", "-").toLowerCase();
}
- private boolean usePD() {
+ public boolean isPDEnabled() {
return this.PDExist;
}
@@ -1226,11 +1227,43 @@ private void dropGraphLocal(HugeGraph graph) {
public HugeGraph createGraph(String graphSpace, String name, String creator,
Map configs, boolean init) {
- if (!usePD()) {
- return createGraphLocal(configs.toString(), name);
+ if (!isPDEnabled()) {
+ // Extract nickname from configs
+ String nickname;
+ if (configs.get("nickname") != null) {
+ nickname = configs.get("nickname").toString();
+ checkNickname(nickname);
+ } else {
+ nickname = name;
+ }
+
+ Date timeStamp = new Date();
+
+ // Convert Map to Properties format string
+ PropertiesConfiguration propConfig = new PropertiesConfiguration();
+ for (Map.Entry entry : configs.entrySet()) {
+ propConfig.setProperty(entry.getKey(), entry.getValue());
+ }
+ StringWriter writer = new StringWriter();
+ try {
+ propConfig.write(writer);
+ } catch (Exception e) {
+ throw new HugeException("Failed to convert config map to properties", e);
+ }
+
+ HugeGraph graph = createGraphLocal(name, writer.toString());
+
+ // Set metadata fields for non-PD mode
+ graph.nickname(nickname);
+ graph.creator(creator);
+ graph.createTime(timeStamp);
+ graph.updateTime(timeStamp);
+
+ return graph;
}
- // When the registered graph space is not DEFAULT, only the graphs within that registered graph space are loaded.
+ // When the registered graph space is not DEFAULT, only the graphs within that registered
+ // graph space are loaded.
if (!"DEFAULT".equals(this.serviceGraphSpace) &&
!this.serviceGraphSpace.equals(graphSpace)) {
throw new HugeException(String.format(
@@ -1291,7 +1324,7 @@ public HugeGraph createGraph(String graphSpace, String name, String creator,
Date timeStamp = new Date();
- configs.putIfAbsent("nickname", nickname);
+ // Note: nickname was already extracted and removed from configs earlier
configs.putIfAbsent("creator", creator);
configs.putIfAbsent("create_time", timeStamp);
configs.putIfAbsent("update_time", timeStamp);
@@ -1514,7 +1547,7 @@ private void closeTx(final Set graphSourceNamesToCloseTxOn,
}
private String defaultSpaceGraphName(String graphName) {
- return "DEFAULT-" + graphName;
+ return spaceGraphName("DEFAULT", graphName);
}
private void loadGraph(String name, String graphConfPath) {
@@ -1578,9 +1611,9 @@ private void checkBackendVersionOrExit(HugeConfig config) {
if (!hugegraph.backendStoreFeatures().supportsPersistence()) {
hugegraph.initBackend();
if (this.requireAuthentication()) {
- String token = config.get(ServerOptions.AUTH_ADMIN_TOKEN);
+ String adminPassword = config.get(ServerOptions.ADMIN_PA);
try {
- this.authenticator().initAdminUser(token);
+ this.authenticator().initAdminUser(adminPassword);
} catch (Exception e) {
throw new BackendException(
"The backend store of '%s' can't " +
@@ -1904,7 +1937,7 @@ public Set getServiceUrls(String graphSpace, String service,
public HugeGraph graph(String graphSpace, String name) {
String key = String.join(DELIMITER, graphSpace, name);
Graph graph = this.graphs.get(key);
- if (graph == null && usePD()) {
+ if (graph == null && isPDEnabled()) {
Map> configs =
this.metaManager.graphConfigs(graphSpace);
// If current server registered graph space is not DEFAULT, only load graph creation
@@ -1931,7 +1964,7 @@ public HugeGraph graph(String graphSpace, String name) {
}
public void dropGraphLocal(String name) {
- HugeGraph graph = this.graph(name);
+ HugeGraph graph = this.graph(DEFAULT_GRAPH_SPACE_SERVICE_NAME + "-" + name);
E.checkArgument(this.conf.get(ServerOptions.ENABLE_DYNAMIC_CREATE_DROP),
"Not allowed to drop graph '%s' dynamically, " +
"please set `enable_dynamic_create_drop` to true.",
@@ -1948,7 +1981,7 @@ public void dropGraphLocal(String name) {
}
public void dropGraph(String graphSpace, String name, boolean clear) {
- if (!usePD()) {
+ if (!isPDEnabled()) {
dropGraphLocal(name);
return;
}
@@ -2052,6 +2085,17 @@ private void checkOptionsUnique(String graphSpace,
public Set graphs(String graphSpace) {
Set graphs = new HashSet<>();
+
+ if (!isPDEnabled()) {
+ for (String key : this.graphs.keySet()) {
+ String[] parts = key.split(DELIMITER);
+ if (parts[0].equals(graphSpace)) {
+ graphs.add(parts[1]);
+ }
+ }
+ return graphs;
+ }
+
for (String key : this.metaManager.graphConfigs(graphSpace).keySet()) {
graphs.add(key.split(DELIMITER)[1]);
}
@@ -2059,7 +2103,7 @@ public Set graphs(String graphSpace) {
}
public GraphSpace graphSpace(String name) {
- if (!usePD()) {
+ if (!isPDEnabled()) {
return new GraphSpace("DEFAULT");
}
GraphSpace space = this.graphSpaces.get(name);
@@ -2107,6 +2151,13 @@ private MapConfiguration buildConfig(Map configs) {
public void graphReadMode(String graphSpace, String graphName,
GraphReadMode readMode) {
+
+ if (!isPDEnabled()) {
+ HugeGraph g = this.graph(spaceGraphName(graphSpace, graphName));
+ g.readMode(readMode);
+ return;
+ }
+
try {
Map configs =
this.metaManager.getGraphConfig(graphSpace, graphName);
diff --git a/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraOptions.java b/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraOptions.java
index a9ccf97765..6cb3b41389 100644
--- a/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraOptions.java
+++ b/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraOptions.java
@@ -130,4 +130,47 @@ public static synchronized CassandraOptions instance() {
positiveInt(),
12 * 60 * 60
);
+
+ public static final ConfigOption CASSANDRA_RECONNECT_BASE_DELAY =
+ new ConfigOption<>(
+ "cassandra.reconnect_base_delay",
+ "The base delay in milliseconds used by the driver's " +
+ "exponential reconnection policy when a Cassandra host " +
+ "becomes unreachable.",
+ rangeInt(100L, Long.MAX_VALUE),
+ 1000L
+ );
+
+ public static final ConfigOption CASSANDRA_RECONNECT_MAX_DELAY =
+ new ConfigOption<>(
+ "cassandra.reconnect_max_delay",
+ "The maximum delay in milliseconds used by the driver's " +
+ "exponential reconnection policy when a Cassandra host " +
+ "becomes unreachable.",
+ rangeInt(1000L, Long.MAX_VALUE),
+ 10_000L
+ );
+
+ public static final ConfigOption CASSANDRA_QUERY_RETRY_MAX_ATTEMPTS =
+ new ConfigOption<>(
+ "cassandra.query_retry_max_attempts",
+ "The maximum number of retry attempts applied at query-time when " +
+ "a Cassandra host is temporarily unreachable. " +
+ "OperationTimedOutException is retried only for " +
+ "idempotent statements. " +
+ "Set to 0 to disable query-time retries.",
+ rangeInt(0, Integer.MAX_VALUE),
+ 3
+ );
+
+ public static final ConfigOption CASSANDRA_QUERY_RETRY_INTERVAL =
+ new ConfigOption<>(
+ "cassandra.query_retry_interval",
+ "The interval in milliseconds between query-time retries " +
+ "when a Cassandra host is temporarily unreachable. The " +
+ "actual wait grows with exponential backoff, capped at " +
+ "cassandra.reconnect_max_delay.",
+ rangeInt(100L, Long.MAX_VALUE),
+ 1000L
+ );
}
diff --git a/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSerializer.java b/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSerializer.java
index fc3c499a81..f2d4474daf 100644
--- a/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSerializer.java
+++ b/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSerializer.java
@@ -24,10 +24,13 @@
import java.util.Map;
import java.util.Set;
+import org.apache.commons.lang.NotImplementedException;
+import org.apache.hugegraph.HugeGraph;
import org.apache.hugegraph.backend.BackendException;
import org.apache.hugegraph.backend.id.Id;
import org.apache.hugegraph.backend.id.IdGenerator;
import org.apache.hugegraph.backend.id.IdUtil;
+import org.apache.hugegraph.backend.query.ConditionQuery;
import org.apache.hugegraph.backend.serializer.BytesBuffer;
import org.apache.hugegraph.backend.serializer.TableBackendEntry;
import org.apache.hugegraph.backend.serializer.TableSerializer;
@@ -38,6 +41,7 @@
import org.apache.hugegraph.structure.HugeElement;
import org.apache.hugegraph.structure.HugeIndex;
import org.apache.hugegraph.structure.HugeProperty;
+import org.apache.hugegraph.structure.HugeVectorIndexMap;
import org.apache.hugegraph.structure.HugeVertex;
import org.apache.hugegraph.type.HugeType;
import org.apache.hugegraph.type.define.DataType;
@@ -166,6 +170,17 @@ public BackendEntry writeOlapVertex(HugeVertex vertex) {
return entry;
}
+ @Override
+ public BackendEntry writeVectorSequence(HugeVectorIndexMap indexMap) {
+ throw new NotImplementedException("Unsupported writeVectorSequence()");
+ }
+
+ @Override
+ public HugeVectorIndexMap readVectorSequence(HugeGraph graph, ConditionQuery query,
+ BackendEntry entry) {
+ throw new NotImplementedException("Unsupported readVectorSequence()");
+ }
+
@Override
protected Object writeProperty(PropertyKey propertyKey, Object value) {
BytesBuffer buffer = BytesBuffer.allocate(BytesBuffer.BUF_PROPERTY);
diff --git a/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSessionPool.java b/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSessionPool.java
index 7a9ffa2b91..a217d53444 100644
--- a/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSessionPool.java
+++ b/hugegraph-server/hugegraph-cassandra/src/main/java/org/apache/hugegraph/backend/store/cassandra/CassandraSessionPool.java
@@ -20,12 +20,15 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.hugegraph.backend.BackendException;
import org.apache.hugegraph.backend.store.BackendSession.AbstractBackendSession;
import org.apache.hugegraph.backend.store.BackendSessionPool;
import org.apache.hugegraph.config.HugeConfig;
import org.apache.hugegraph.util.E;
+import org.apache.hugegraph.util.Log;
+import org.slf4j.Logger;
import com.datastax.driver.core.BatchStatement;
import com.datastax.driver.core.Cluster;
@@ -34,22 +37,67 @@
import com.datastax.driver.core.ProtocolOptions.Compression;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;
+import com.datastax.driver.core.SimpleStatement;
import com.datastax.driver.core.SocketOptions;
import com.datastax.driver.core.Statement;
+import com.datastax.driver.core.exceptions.DriverException;
import com.datastax.driver.core.exceptions.InvalidQueryException;
+import com.datastax.driver.core.exceptions.NoHostAvailableException;
+import com.datastax.driver.core.exceptions.OperationTimedOutException;
+import com.datastax.driver.core.policies.ExponentialReconnectionPolicy;
public class CassandraSessionPool extends BackendSessionPool {
+ private static final Logger LOG = Log.logger(CassandraSessionPool.class);
+
private static final int SECOND = 1000;
+ private static final String HEALTH_CHECK_CQL =
+ "SELECT now() FROM system.local";
+
+ /**
+ * Guards the one-time JVM-wide warning about {@code commitAsync()} not
+ * being covered by query-time retries. {@link CassandraSessionPool} is
+ * instantiated once per backend store per graph, so without this guard
+ * the warning would fire many times on startup for a structural
+ * limitation that does not change between instances.
+ */
+ private static final AtomicBoolean ASYNC_RETRY_WARNING_LOGGED =
+ new AtomicBoolean(false);
private Cluster cluster;
private final String keyspace;
+ private final int maxRetries;
+ private final long retryInterval;
+ private final long retryBaseDelay;
+ private final long retryMaxDelay;
public CassandraSessionPool(HugeConfig config,
String keyspace, String store) {
super(config, keyspace + "/" + store);
this.cluster = null;
this.keyspace = keyspace;
+ this.maxRetries = config.get(
+ CassandraOptions.CASSANDRA_QUERY_RETRY_MAX_ATTEMPTS);
+ this.retryInterval = config.get(
+ CassandraOptions.CASSANDRA_QUERY_RETRY_INTERVAL);
+ long reconnectBase = config.get(
+ CassandraOptions.CASSANDRA_RECONNECT_BASE_DELAY);
+ long reconnectMax = config.get(
+ CassandraOptions.CASSANDRA_RECONNECT_MAX_DELAY);
+ E.checkArgument(reconnectMax >= reconnectBase,
+ "'%s' (%s) must be >= '%s' (%s)",
+ CassandraOptions.CASSANDRA_RECONNECT_MAX_DELAY.name(),
+ reconnectMax,
+ CassandraOptions.CASSANDRA_RECONNECT_BASE_DELAY.name(),
+ reconnectBase);
+ this.retryBaseDelay = reconnectBase;
+ this.retryMaxDelay = reconnectMax;
+
+ if (this.maxRetries > 0 &&
+ ASYNC_RETRY_WARNING_LOGGED.compareAndSet(false, true)) {
+ LOG.warn("cassandra.query_retry_max_attempts={} applies to sync commit()" +
+ " only. commitAsync() has no retry protection.", this.maxRetries);
+ }
}
@Override
@@ -86,6 +134,12 @@ public synchronized void open() {
builder.withSocketOptions(socketOptions);
+ // Reconnection policy: let driver keep retrying nodes in background
+ // with exponential backoff after they go down (see issue #2740).
+ builder.withReconnectionPolicy(
+ new ExponentialReconnectionPolicy(this.retryBaseDelay,
+ this.retryMaxDelay));
+
// Credential options
String username = config.get(CassandraOptions.CASSANDRA_USERNAME);
String password = config.get(CassandraOptions.CASSANDRA_PASSWORD);
@@ -161,7 +215,7 @@ public void rollback() {
@Override
public ResultSet commit() {
- ResultSet rs = this.session.execute(this.batch);
+ ResultSet rs = this.executeWithRetry(this.batch);
// Clear batch if execute() successfully (retained if failed)
this.batch.clear();
return rs;
@@ -169,12 +223,25 @@ public ResultSet commit() {
public void commitAsync() {
Collection statements = this.batch.getStatements();
+ if (statements.isEmpty()) {
+ this.batch.clear();
+ return;
+ }
int count = 0;
int processors = Math.min(statements.size(), 1023);
List results = new ArrayList<>(processors + 1);
+ com.datastax.driver.core.Session driverSession =
+ this.sessionForAsyncCommit();
for (Statement s : statements) {
- ResultSetFuture future = this.session.executeAsync(s);
+ // TODO: track async retry support in a follow-up issue.
+ // commitAsync() bypasses executeWithRetry().
+ // During a Cassandra restart, async writes may fail with
+ // NoHostAvailableException even when maxRetries > 0. Callers
+ // must handle ResultSetFuture failures surfaced by
+ // getUninterruptibly(). A follow-up issue should wrap each
+ // future with retry semantics.
+ ResultSetFuture future = driverSession.executeAsync(s);
results.add(future);
if (++count > processors) {
@@ -197,15 +264,99 @@ public ResultSet query(Statement statement) {
}
public ResultSet execute(Statement statement) {
- return this.session.execute(statement);
+ return this.executeWithRetry(statement);
}
public ResultSet execute(String statement) {
- return this.session.execute(statement);
+ return this.executeWithRetry(new SimpleStatement(statement));
}
public ResultSet execute(String statement, Object... args) {
- return this.session.execute(statement, args);
+ return this.executeWithRetry(new SimpleStatement(statement, args));
+ }
+
+ /**
+ * Execute a statement, retrying on transient connectivity failures
+ * (NoHostAvailableException / OperationTimedOutException). The driver
+ * itself keeps retrying connections in the background via the
+ * reconnection policy, so once Cassandra comes back online, a
+ * subsequent attempt here will succeed without restarting the server.
+ *
+ * OperationTimedOutException is only retried for statements marked
+ * idempotent; otherwise a timed-out mutation might be applied once by
+ * Cassandra and then duplicated by a client-side retry.
+ *
+ *
If the driver session has been discarded (e.g. by
+ * {@link #reconnectIfNeeded()} after a failed health-check) it is
+ * lazily reopened at the start of each attempt.
+ *
+ *
Blocking note: retries block the calling thread via
+ * {@link Thread#sleep(long)}. Worst-case a single call blocks for
+ * {@code maxRetries * retryMaxDelay} ms. Under high-throughput
+ * workloads concurrent threads may pile up in {@code sleep()} during
+ * a Cassandra outage. For such deployments lower
+ * {@code cassandra.query_retry_max_attempts} (default 3) and
+ * {@code cassandra.reconnect_max_delay} (default 10000ms) so the
+ * request fails fast and pressure is released back to the caller.
+ */
+ private ResultSet executeWithRetry(Statement statement) {
+ int retries = CassandraSessionPool.this.maxRetries;
+ long interval = CassandraSessionPool.this.retryInterval;
+ long maxDelay = CassandraSessionPool.this.retryMaxDelay;
+ DriverException lastError = null;
+ for (int attempt = 0; attempt <= retries; attempt++) {
+ try {
+ if (this.session == null || this.session.isClosed()) {
+ // Lazy reopen: may itself throw NHAE while
+ // Cassandra is still unreachable; the catch below
+ // treats that as a transient failure.
+ this.session = null;
+ this.open();
+ }
+ return this.session.execute(statement);
+ } catch (NoHostAvailableException | OperationTimedOutException e) {
+ lastError = e;
+ if (e instanceof OperationTimedOutException &&
+ !Boolean.TRUE.equals(statement.isIdempotent())) {
+ throw new BackendException(
+ "Cassandra query timed out and won't be " +
+ "retried because the statement is not " +
+ "marked idempotent", e);
+ }
+ if (attempt >= retries) {
+ break;
+ }
+ long cap = maxDelay > 0 ? maxDelay : interval;
+ long shift = 1L << Math.min(attempt, 20);
+ long delay;
+ try {
+ // Guard against Long overflow when retryInterval is huge.
+ delay = Math.min(Math.multiplyExact(interval, shift), cap);
+ } catch (ArithmeticException overflow) {
+ delay = cap;
+ }
+ LOG.warn("Cassandra temporarily unavailable ({}), " +
+ "retry {}/{} in {} ms",
+ e.getClass().getSimpleName(), attempt + 1,
+ retries, delay);
+ try {
+ Thread.sleep(delay);
+ } catch (InterruptedException ie) {
+ Thread.currentThread().interrupt();
+ throw new BackendException("Interrupted while " +
+ "waiting to retry " +
+ "Cassandra query", ie);
+ }
+ }
+ }
+ // Preserve original exception as cause (stack trace + type) by
+ // pre-formatting the message and using the (String, Throwable)
+ // constructor explicitly to avoid ambiguity with varargs overloads.
+ String msg = String.format(
+ "Failed to execute Cassandra query after %s retries: %s",
+ retries,
+ lastError == null ? "" : lastError.getMessage());
+ throw new BackendException(msg, lastError);
}
private void tryOpen() {
@@ -217,6 +368,24 @@ private void tryOpen() {
}
}
+ private com.datastax.driver.core.Session sessionForAsyncCommit() {
+ if (this.session == null || this.session.isClosed()) {
+ this.session = null;
+ try {
+ this.open();
+ } catch (DriverException e) {
+ throw new BackendException(
+ "Failed to open Cassandra session for async commit",
+ e);
+ }
+ }
+ if (this.session == null) {
+ throw new BackendException(
+ "Cassandra session is unavailable for async commit");
+ }
+ return this.session;
+ }
+
@Override
public void open() {
this.opened = true;
@@ -255,6 +424,56 @@ public boolean hasChanges() {
return this.batch.size() > 0;
}
+ /**
+ * Periodic liveness probe invoked by {@link BackendSessionPool} to
+ * recover thread-local sessions after Cassandra has been restarted.
+ * Reopens the driver session if it was closed and pings the cluster
+ * with a lightweight query. On failure the session is discarded via
+ * {@link #reset()} so the next call to
+ * {@link #executeWithRetry(Statement)} reopens it; any exception
+ * here is swallowed so the caller can still issue the real query.
+ */
+ @Override
+ public void reconnectIfNeeded() {
+ if (!this.opened) {
+ return;
+ }
+ try {
+ if (this.session == null || this.session.isClosed()) {
+ this.session = null;
+ this.tryOpen();
+ }
+ if (this.session != null) {
+ this.session.execute(new SimpleStatement(HEALTH_CHECK_CQL));
+ }
+ } catch (NoHostAvailableException | OperationTimedOutException e) {
+ LOG.debug("Cassandra health-check failed, resetting session: {}",
+ e.getMessage());
+ this.reset();
+ }
+ }
+
+ /**
+ * Force-close the driver session so it is re-opened on the next
+ * {@link #opened()} call. Used when a failure is observed and we
+ * want to start fresh on the next attempt.
+ */
+ @Override
+ public void reset() {
+ if (this.session == null) {
+ return;
+ }
+ try {
+ this.session.close();
+ } catch (Exception e) {
+ // Do not swallow Error (OOM / StackOverflow); only log
+ // ordinary exceptions raised by the driver on close.
+ LOG.warn("Failed to reset Cassandra session", e);
+ } finally {
+ this.session = null;
+ }
+ }
+
public Collection statements() {
return this.batch.getStatements();
}
diff --git a/hugegraph-server/hugegraph-core/pom.xml b/hugegraph-server/hugegraph-core/pom.xml
index 0b12f8b25f..2334496329 100644
--- a/hugegraph-server/hugegraph-core/pom.xml
+++ b/hugegraph-server/hugegraph-core/pom.xml
@@ -32,7 +32,7 @@
1.3.11
0.7.4
5.12.1
- 1.8.0
+ 1.8.1
1.10.0
2.6.2
portable-1.8.3
@@ -197,6 +197,8 @@
commons-compress
${commons-compress.version}
+
org.lz4
lz4-java
diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
index 88f1142e97..ba346e179f 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
@@ -49,6 +49,7 @@
import org.apache.hugegraph.schema.VertexLabel;
import org.apache.hugegraph.structure.HugeFeatures;
import org.apache.hugegraph.task.TaskScheduler;
+import org.apache.hugegraph.traversal.optimize.HugeCountStrategy;
import org.apache.hugegraph.traversal.optimize.HugeCountStepStrategy;
import org.apache.hugegraph.traversal.optimize.HugeGraphStepStrategy;
import org.apache.hugegraph.traversal.optimize.HugePrimaryKeyStrategy;
@@ -56,7 +57,9 @@
import org.apache.hugegraph.type.HugeType;
import org.apache.hugegraph.type.define.GraphMode;
import org.apache.hugegraph.type.define.GraphReadMode;
+import org.apache.hugegraph.vector.VectorIndexManager;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Property;
@@ -278,6 +281,8 @@ public interface HugeGraph extends Graph {
RaftGroupManager raftGroupManager();
+ VectorIndexManager vectorIndexManager();
+
void proxy(HugeGraph graph);
boolean sameAs(HugeGraph graph);
@@ -378,7 +383,9 @@ static void registerTraversalStrategies(Class> clazz) {
TraversalStrategies strategies = TraversalStrategies.GlobalCache
.getStrategies(Graph.class)
.clone();
- strategies.addStrategies(HugeVertexStepStrategy.instance(),
+ strategies.removeStrategies(CountStrategy.class);
+ strategies.addStrategies(HugeCountStrategy.instance(),
+ HugeVertexStepStrategy.instance(),
HugeGraphStepStrategy.instance(),
HugeCountStepStrategy.instance(),
HugePrimaryKeyStrategy.instance());
diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
index 9d5f5b720c..77e24812e4 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/StandardHugeGraph.java
@@ -108,6 +108,7 @@
import org.apache.hugegraph.util.LockUtil;
import org.apache.hugegraph.util.Log;
import org.apache.hugegraph.variables.HugeVariables;
+import org.apache.hugegraph.vector.VectorIndexManager;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -190,6 +191,7 @@ public class StandardHugeGraph implements HugeGraph {
private Date createTime;
private Date updateTime;
private KvStore kvStore;
+ private VectorIndexManager vectorIndexManager;
public StandardHugeGraph(HugeConfig config) {
this.params = new StandardHugeGraphParams();
@@ -1120,7 +1122,7 @@ public void create(String configPath, GlobalMasterInfo nodeInfo) {
this.serverStarted(nodeInfo);
// Write config to the disk file
- String confPath = ConfigUtil.writeToFile(configPath, this.spaceGraphName(),
+ String confPath = ConfigUtil.writeToFile(configPath, this.name,
this.configuration());
this.configuration.file(confPath);
}
@@ -1243,6 +1245,11 @@ public RaftGroupManager raftGroupManager() {
return provider.raftNodeManager();
}
+ @Override
+ public VectorIndexManager vectorIndexManager() {
+ return this.vectorIndexManager;
+ }
+
@Override
public HugeConfig configuration() {
return this.configuration;
@@ -1394,7 +1401,7 @@ public AbstractCacheNotifier(EventHub hub, CacheNotifier proxy) {
"Expect event action argument");
String action = (String) args[0];
LOG.debug("Event action: {}", action);
- if (Cache.ACTION_INVALIDED.equals(action)) {
+ if (Cache.ACTION_INVALID.equals(action)) {
event.checkArgs(String.class, HugeType.class, Object.class);
HugeType type = (HugeType) args[1];
Object ids = args[2];
@@ -1410,7 +1417,7 @@ public AbstractCacheNotifier(EventHub hub, CacheNotifier proxy) {
E.checkArgument(false, "Unexpected argument: %s", ids);
}
return true;
- } else if (Cache.ACTION_CLEARED.equals(action)) {
+ } else if (Cache.ACTION_CLEAR.equals(action)) {
event.checkArgs(String.class, HugeType.class);
HugeType type = (HugeType) args[1];
LOG.debug("Calling proxy.clear with type: {}", type);
@@ -1435,17 +1442,20 @@ public void close() {
@Override
public void invalid(HugeType type, Id id) {
- this.hub.notify(Events.CACHE, Cache.ACTION_INVALID, type, id);
+ this.hub.notifyExcept(Events.CACHE, this.cacheEventListener,
+ Cache.ACTION_INVALID, type, id);
}
@Override
public void invalid2(HugeType type, Object[] ids) {
- this.hub.notify(Events.CACHE, Cache.ACTION_INVALID, type, ids);
+ this.hub.notifyExcept(Events.CACHE, this.cacheEventListener,
+ Cache.ACTION_INVALID, type, ids);
}
@Override
public void clear(HugeType type) {
- this.hub.notify(Events.CACHE, Cache.ACTION_CLEAR, type);
+ this.hub.notifyExcept(Events.CACHE, this.cacheEventListener,
+ Cache.ACTION_CLEAR, type);
}
@Override
diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/RolePermission.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/RolePermission.java
index 834cbb569c..43ad50887d 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/RolePermission.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/RolePermission.java
@@ -82,7 +82,7 @@ public static RolePermission role(String graphSpace, String graph,
perm.ordinal() >= HugePermission.READ.ordinal()) {
role.add(graphSpace, graph, perm, HugeResource.ALL_RES);
} else {
- // if perm is not read, write, delete or excute, set resources null
+ // if perm is not read, write, delete or execute, set resources null
role.add(graphSpace, graph, perm, null);
}
return role;
diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManager.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManager.java
index 67931a0450..a3224811f3 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManager.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManager.java
@@ -580,6 +580,7 @@ public HugeUser matchUser(String name, String password) {
}
if (StringEncoding.checkPassword(password, user.password())) {
+ // TODO: rehash password if bcrypt work factor is lower than expected
this.pwdCache.update(user.id(), password);
return user;
}
diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManagerV2.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManagerV2.java
index 5dcbc9378a..d2df45626c 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManagerV2.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/auth/StandardAuthManagerV2.java
@@ -947,6 +947,7 @@ public HugeUser matchUser(String name, String password) {
}
if (StringEncoding.checkPassword(password, user.password())) {
+ // TODO: rehash password if bcrypt work factor is lower than expected
this.pwdCache.update(user.id(), password);
return user;
}
diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/Cache.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/Cache.java
index f58a9ce450..73910fd08c 100644
--- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/Cache.java
+++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/Cache.java
@@ -24,8 +24,6 @@ public interface Cache