forked from hugegraph/hugegraph-sync
Compare commits
358 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
0b794c9ab9 | |
|
|
7be8e6b1dd | |
|
|
0b24aca3cd | |
|
|
f88fad4711 | |
|
|
a767d73182 | |
|
|
0a0f2c3bfa | |
|
|
7dc6a86a7d | |
|
|
b087f085c1 | |
|
|
58f58ee094 | |
|
|
ba5b89e374 | |
|
|
1c577de9ba | |
|
|
4f0e4442ab | |
|
|
a038d2341c | |
|
|
df921e915d | |
|
|
7df736a77c | |
|
|
c231a6fddb | |
|
|
2e27c583b4 | |
|
|
459d4413b4 | |
|
|
dc3070f45b | |
|
|
162a104ebd | |
|
|
91f5b33bac | |
|
|
53f0e18216 | |
|
|
3427f42b81 | |
|
|
24ebe9da26 | |
|
|
7b9fd21d2a | |
|
|
d36e05ece8 | |
|
|
9baef8b255 | |
|
|
86e1003c16 | |
|
|
edb59ebaeb | |
|
|
73a4c9d028 | |
|
|
d6bc24e0f2 | |
|
|
5dfcc3f694 | |
|
|
899dc8e0f0 | |
|
|
85e096698a | |
|
|
bd83741f24 | |
|
|
882f3b7d65 | |
|
|
03b40a5244 | |
|
|
cedc000215 | |
|
|
9f89afc39a | |
|
|
37e71c4858 | |
|
|
e82a91ca1a | |
|
|
1e9752109e | |
|
|
506850caea | |
|
|
1a8959575c | |
|
|
ac93deebc6 | |
|
|
93c2e08780 | |
|
|
b056c5facd | |
|
|
c1e8ea5aba | |
|
|
253b8d38b8 | |
|
|
2b3bc4f28b | |
|
|
43cae1d2e3 | |
|
|
b4bc1f066a | |
|
|
7d335b2c72 | |
|
|
543bbfeb74 | |
|
|
906112c080 | |
|
|
6be756919b | |
|
|
3783247c74 | |
|
|
1228dec04d | |
|
|
d0a3ccc045 | |
|
|
6c72ca5f63 | |
|
|
f0d9d12ca7 | |
|
|
e605f732e2 | |
|
|
52f3d64b6a | |
|
|
3a1618faa2 | |
|
|
bd1d9db77b | |
|
|
b5d9dd2f02 | |
|
|
a560a6efee | |
|
|
37e4405c04 | |
|
|
483bca52ef | |
|
|
27cf52b007 | |
|
|
6a4041e21c | |
|
|
713d88d1fd | |
|
|
ef8f6128a3 | |
|
|
277f76ef03 | |
|
|
7b33574fd0 | |
|
|
c883f56a4e | |
|
|
0cfd8daed3 | |
|
|
c09982b0df | |
|
|
eb6570c992 | |
|
|
6861ed5e94 | |
|
|
3f127f01f1 | |
|
|
2e3adcde02 | |
|
|
47a68f098a | |
|
|
d0f63c8ac3 | |
|
|
dfee5bf6aa | |
|
|
eef3b355f6 | |
|
|
bc421bb197 | |
|
|
f6da2ee6cb | |
|
|
e79f1a5e73 | |
|
|
5cb9aad6ee | |
|
|
0b70e897f0 | |
|
|
0ee9a9b788 | |
|
|
75867796b7 | |
|
|
3f7dc2a8b2 | |
|
|
1d4532cd62 | |
|
|
b980df8697 | |
|
|
1dd0580d30 | |
|
|
de5904a600 | |
|
|
57cd0e8dd7 | |
|
|
7965aac70d | |
|
|
cf9ba8b310 | |
|
|
7635c67865 | |
|
|
965d6c137a | |
|
|
cb4427d9f1 | |
|
|
33fa9ed45d | |
|
|
4346b44f80 | |
|
|
2c6fcdc719 | |
|
|
44f99e968c | |
|
|
b52517cc47 | |
|
|
bd5d68f0f2 | |
|
|
bfe9fae150 | |
|
|
c997f35b04 | |
|
|
47aa8be850 | |
|
|
e8fb2696d6 | |
|
|
dcf3752515 | |
|
|
10f0a87c7b | |
|
|
20d1e5228e | |
|
|
8c93652de7 | |
|
|
ed493f3093 | |
|
|
d376b02dc5 | |
|
|
197e8a00ed | |
|
|
0c01475843 | |
|
|
c0ea21eed6 | |
|
|
5ad55fb82f | |
|
|
12b4940563 | |
|
|
25301f6228 | |
|
|
a6e1f232c2 | |
|
|
a7ad7ea100 | |
|
|
a9445ca3c3 | |
|
|
bce6d058f5 | |
|
|
69e6b461ad | |
|
|
4d5f4195db | |
|
|
70ab14e3e6 | |
|
|
e90489f361 | |
|
|
8db0a9b195 | |
|
|
b43526da60 | |
|
|
d4b95ca323 | |
|
|
73329ce4f5 | |
|
|
869fc81811 | |
|
|
45636a0489 | |
|
|
fc9bc2866e | |
|
|
30ef2f7c6b | |
|
|
d7c1c2149c | |
|
|
b49be05171 | |
|
|
4ceef1ab0c | |
|
|
8e99d85d33 | |
|
|
1d0969dede | |
|
|
aaf67cf81c | |
|
|
8a515f20db | |
|
|
77c76124af | |
|
|
4d7ad86776 | |
|
|
d12f5734e6 | |
|
|
c31a53641f | |
|
|
297e491232 | |
|
|
82f2a6539f | |
|
|
f9593d494b | |
|
|
6aa01af49e | |
|
|
6f9493a517 | |
|
|
e1cb3eb16c | |
|
|
8724b12032 | |
|
|
1f64e8afb0 | |
|
|
c28f8c8977 | |
|
|
e339fed6c9 | |
|
|
e400e4d22b | |
|
|
0239a1e174 | |
|
|
9463119a67 | |
|
|
a40774e484 | |
|
|
c86e38a8ac | |
|
|
37e221a712 | |
|
|
5bc993fe79 | |
|
|
4dbe157ecb | |
|
|
caa4b26a98 | |
|
|
952975a3c7 | |
|
|
7347b17a47 | |
|
|
16602cc839 | |
|
|
4361a51d9d | |
|
|
dc3e9e2bbd | |
|
|
ae54f28308 | |
|
|
b783da5bde | |
|
|
be72d20f8a | |
|
|
e85ab38c6b | |
|
|
3b1bcb1a99 | |
|
|
42ef9c4d95 | |
|
|
09b18191ed | |
|
|
745bd861af | |
|
|
4af14a9998 | |
|
|
589ee2ca10 | |
|
|
db84121d5d | |
|
|
deac513c43 | |
|
|
f2e838443d | |
|
|
d0e5971c7e | |
|
|
88d2f897ed | |
|
|
05fe7a4c92 | |
|
|
4b21e94ad2 | |
|
|
d695bd494d | |
|
|
922a4f6334 | |
|
|
8f0f2ba012 | |
|
|
4a1926fe40 | |
|
|
fbb743afeb | |
|
|
3b8933c3d3 | |
|
|
f5383d5541 | |
|
|
ee08712120 | |
|
|
24c3390379 | |
|
|
0789b1c8c1 | |
|
|
c572c2bedd | |
|
|
1d27452994 | |
|
|
53c6503cde | |
|
|
3881b86697 | |
|
|
49e8599d8f | |
|
|
535ae072f4 | |
|
|
efa8e97c4f | |
|
|
9101842200 | |
|
|
27dfd9d5a2 | |
|
|
74b954acf2 | |
|
|
f72fac400f | |
|
|
185a926a94 | |
|
|
aecaf4e86a | |
|
|
fe190141cc | |
|
|
d51efb6120 | |
|
|
6c800388a1 | |
|
|
159143c04d | |
|
|
265f74bb5f | |
|
|
98844d8c2a | |
|
|
3914813fb8 | |
|
|
1114e94924 | |
|
|
42e5260ba5 | |
|
|
ccc4d3bd6a | |
|
|
cde7763cc2 | |
|
|
c80f959579 | |
|
|
f4e861b3a8 | |
|
|
37de7be0ee | |
|
|
9962e0c9c9 | |
|
|
2d4a8eebf8 | |
|
|
630e19f8bc | |
|
|
9f329f5f3a | |
|
|
544599e316 | |
|
|
b4fb1f7443 | |
|
|
034e1a2513 | |
|
|
c2c5ba4689 | |
|
|
0d90ae4331 | |
|
|
fffccf1b2f | |
|
|
0a71d120f9 | |
|
|
4bd64ce8b5 | |
|
|
24b8a33e9c | |
|
|
8268b755ef | |
|
|
d78b728aa2 | |
|
|
49bff5eadc | |
|
|
4eda6313eb | |
|
|
0ff4b0e234 | |
|
|
41bc25ce85 | |
|
|
f8e65f83bd | |
|
|
cc463411ea | |
|
|
0436a14591 | |
|
|
ce75fb96e0 | |
|
|
88d8838209 | |
|
|
b525aef026 | |
|
|
85a6b7e24d | |
|
|
48a39fcef8 | |
|
|
2f453c0af9 | |
|
|
64bd1543e8 | |
|
|
1a66a60897 | |
|
|
0822dd93f6 | |
|
|
5ea077f13e | |
|
|
194ed53b85 | |
|
|
1eb2414134 | |
|
|
87c5826480 | |
|
|
306b4f1829 | |
|
|
95530cc4b3 | |
|
|
5bac575b29 | |
|
|
5f6012cbe4 | |
|
|
bbbc8e70f5 | |
|
|
6f20cb8bdc | |
|
|
476bb78315 | |
|
|
146e4bc362 | |
|
|
904f4260b9 | |
|
|
16fbcb354d | |
|
|
591d3f3834 | |
|
|
07793f9971 | |
|
|
1c7c839d45 | |
|
|
a4121451ce | |
|
|
553cd60b8f | |
|
|
1db56cfd86 | |
|
|
9db431015a | |
|
|
eed956d931 | |
|
|
50c7738056 | |
|
|
92ad62a9fb | |
|
|
4aae65cd4d | |
|
|
8c76d5b0cf | |
|
|
daa967d74d | |
|
|
544b94c919 | |
|
|
140cf845b5 | |
|
|
9346717bde | |
|
|
d6d92e4896 | |
|
|
aa222c4893 | |
|
|
c2db8f55d6 | |
|
|
887a4d5a9a | |
|
|
5183fb054a | |
|
|
1bf8d9e4c0 | |
|
|
56a60dca53 | |
|
|
12c65918b3 | |
|
|
cb33bbd436 | |
|
|
154e03054e | |
|
|
8d8333980c | |
|
|
fde9c72a0f | |
|
|
749a2d9d1f | |
|
|
2ae8e1571b | |
|
|
8219a10e74 | |
|
|
9f994b33de | |
|
|
fe8b51d072 | |
|
|
24ff820174 | |
|
|
8a44989e32 | |
|
|
7789bc87d8 | |
|
|
65032356e9 | |
|
|
1804fa7ee1 | |
|
|
3d3da162de | |
|
|
b01f3a35df | |
|
|
094f8bb56b | |
|
|
d8d4b3eba5 | |
|
|
5e003a7f2f | |
|
|
5195740642 | |
|
|
12c53cc17b | |
|
|
4d6c421358 | |
|
|
281aab85f2 | |
|
|
ca0a9832a6 | |
|
|
b4a6cc9ab4 | |
|
|
c24069ee26 | |
|
|
504069e17f | |
|
|
705c27b986 | |
|
|
f6cdc8a3ca | |
|
|
8bdac2c758 | |
|
|
a200deab56 | |
|
|
5cda854e8d | |
|
|
f33c09385d | |
|
|
dec8fe9a84 | |
|
|
dfd3190392 | |
|
|
b76e0eaeab | |
|
|
6052985c15 | |
|
|
e05d13098a | |
|
|
9faea02296 | |
|
|
5252a7e481 | |
|
|
0c580690cc | |
|
|
315000a600 | |
|
|
d3960c1da4 | |
|
|
9778a8b4b3 | |
|
|
171e723f50 | |
|
|
9a1417f3dc | |
|
|
9cc9cad29a | |
|
|
e88f54a21e | |
|
|
ec2599db9a | |
|
|
d592690cf7 | |
|
|
36959044a1 | |
|
|
7bdf878dd4 | |
|
|
5603b9c6a3 | |
|
|
cccef5d575 | |
|
|
db55e237a5 | |
|
|
3e5f626d11 | |
|
|
5f305526d7 | |
|
|
a5fa9016ec |
|
|
@ -34,15 +34,15 @@ github:
|
|||
protected_branches:
|
||||
master:
|
||||
required_status_checks:
|
||||
# strict means "Require branches to be up-to-date before merging".
|
||||
# strict means "Require PR to be up-to-date before merging". (enable when branch unstable)
|
||||
strict: false
|
||||
# contexts are the names of checks that must pass (now only enable the basic check)
|
||||
contexts:
|
||||
- Analyze (java)
|
||||
- CodeQL
|
||||
- check-license
|
||||
- build (memory, 8)
|
||||
- build (memory, 11)
|
||||
- build-server (memory, 11)
|
||||
- build-commons (11)
|
||||
required_pull_request_reviews:
|
||||
dismiss_stale_reviews: true
|
||||
require_code_owner_reviews: false
|
||||
|
|
|
|||
|
|
@ -21,7 +21,79 @@ root = true
|
|||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
max_line_length = 100
|
||||
ij_wrap_on_typing = true
|
||||
ij_visual_guides = 100
|
||||
|
||||
|
||||
[*.{java,xml,py}]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.{java,xml}]
|
||||
# Ignore the IDEA unsupported warning & it works well (indeed)
|
||||
continuation_indent_size = 8
|
||||
|
||||
[*.md]
|
||||
max_line_length = off
|
||||
|
||||
[*.java]
|
||||
ij_java_doc_add_p_tag_on_empty_lines = true
|
||||
ij_java_doc_do_not_wrap_if_one_line = true
|
||||
ij_java_annotation_parameter_wrap = normal
|
||||
ij_java_align_multiline_annotation_parameters = true
|
||||
ij_java_class_count_to_use_import_on_demand = 100
|
||||
ij_java_names_count_to_use_import_on_demand = 100
|
||||
ij_java_imports_layout = $*, |, java.**, |, javax.**, |, org.**, |, com.**, |, *
|
||||
|
||||
ij_java_line_comment_at_first_column = false
|
||||
ij_java_align_multiline_chained_methods = true
|
||||
ij_java_align_multiline_parameters_in_calls = true
|
||||
ij_java_align_multiline_binary_operation = true
|
||||
ij_java_align_multiline_assignment = true
|
||||
ij_java_align_multiline_ternary_operation = true
|
||||
ij_java_align_multiline_throws_list = true
|
||||
ij_java_align_multiline_extends_list = true
|
||||
ij_java_align_multiline_array_initializer_expression = true
|
||||
|
||||
ij_java_call_parameters_wrap = normal
|
||||
ij_java_method_parameters_wrap = normal
|
||||
ij_java_resource_list_wrap = normal
|
||||
ij_java_extends_list_wrap = normal
|
||||
ij_java_throws_list_wrap = normal
|
||||
ij_java_method_call_chain_wrap = normal
|
||||
ij_java_binary_operation_wrap = normal
|
||||
ij_java_ternary_operation_wrap = normal
|
||||
ij_java_for_statement_wrap = normal
|
||||
ij_java_array_initializer_wrap = normal
|
||||
ij_java_assignment_wrap = normal
|
||||
ij_java_assert_statement_wrap = normal
|
||||
ij_java_if_brace_force = if_multiline
|
||||
ij_java_do_while_brace_force = always
|
||||
ij_java_while_brace_force = if_multiline
|
||||
ij_java_for_brace_force = if_multiline
|
||||
ij_java_wrap_long_lines = true
|
||||
ij_java_parameter_annotation_wrap = normal
|
||||
ij_java_enum_constants_wrap = split_into_lines
|
||||
|
||||
ij_java_keep_blank_lines_in_declarations = 1
|
||||
ij_java_keep_blank_lines_in_code = 1
|
||||
ij_java_keep_blank_lines_between_package_declaration_and_header = 1
|
||||
ij_java_keep_blank_lines_before_right_brace = 1
|
||||
ij_java_blank_lines_around_class = 1
|
||||
ij_java_blank_lines_after_class_header = 1
|
||||
|
||||
ij_smart_tabs = true
|
||||
|
||||
[*.xml]
|
||||
max_line_length = 120
|
||||
ij_visual_guides = 120
|
||||
ij_xml_text_wrap = off
|
||||
ij_xml_space_inside_empty_tag = true
|
||||
|
||||
[.yaml]
|
||||
ij_yaml_spaces_within_braces = false
|
||||
ij_yaml_spaces_within_brackets = false
|
||||
|
||||
[.properties]
|
||||
ij_properties_keep_blank_lines = true
|
||||
|
|
|
|||
|
|
@ -5,8 +5,12 @@
|
|||
apache-release.sh export-ignore
|
||||
.licenserc.yaml export-ignore
|
||||
.editorconfig export-ignore
|
||||
hugegraph-store/hg-store-dist/src/assembly/static/bin/libjemalloc.so export-ignore
|
||||
hugegraph-store/hg-store-dist/src/assembly/static/bin/libjemalloc_aarch64.so export-ignore
|
||||
|
||||
# ignored directory
|
||||
.github/ export-ignore
|
||||
hugegraph-dist/scripts/ export-ignore
|
||||
#assembly/ export-ignore
|
||||
.idea/ export-ignore
|
||||
install-dist/scripts/ export-ignore
|
||||
hugegraph-commons/hugegraph-dist/ export-ignore
|
||||
docker/ export-ignore
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ published)
|
|||
|
||||
## Purpose of the PR
|
||||
|
||||
- close #xxx <!-- or use "fix #xxx", "xxx" is the ID-link of related issue, e.g: close #1024 -->
|
||||
- close #xxx <!-- or use "fix #xxx", "xxx" is the ID-link of related issue, e.g: close #1024 -->
|
||||
|
||||
<!--
|
||||
Please explain more context in this section, clarify why the changes are needed.
|
||||
|
|
@ -30,7 +30,7 @@ e.g:
|
|||
|
||||
## Main Changes
|
||||
|
||||
<!-- Please clarify what changes you are proposing. The purpose of this section is to outline the changes and how this PR fixes the issue. These change logs are helpful for better ant faster reviews.)
|
||||
<!-- Please clarify what changes you are proposing. The purpose of this section is to outline the changes and how this PR fixes the issue. These change logs are helpful for better and faster reviews.)
|
||||
|
||||
For example:
|
||||
|
||||
|
|
@ -51,11 +51,12 @@ For example:
|
|||
|
||||
<!-- DO NOT REMOVE THIS SECTION. CHECK THE PROPER BOX ONLY. -->
|
||||
|
||||
- [ ] Nope
|
||||
- [ ] Dependencies (add/update license info) <!-- Don't forget to add/update the info in "LICENSE" & "NOTICE" files (both in root & dist module) -->
|
||||
- [ ] Dependencies ([add/update license](https://hugegraph.apache.org/docs/contribution-guidelines/contribute/#321-check-licenses) info & [regenerate_dependencies](../hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh)) <!-- Don't forget to add/update the info in "LICENSE" & "NOTICE" files (both in root & dist module) -->
|
||||
- [ ] Modify configurations
|
||||
- [ ] The public API
|
||||
- [ ] Other affects (typed here)
|
||||
- [ ] Nope
|
||||
|
||||
|
||||
## Documentation Status
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,43 @@
|
|||
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
|
||||
<servers>
|
||||
<server>
|
||||
<id>github</id>
|
||||
<username>${env.GITHUB_ACTOR}</username>
|
||||
<password>${env.GITHUB_TOKEN}</password>
|
||||
</server>
|
||||
</servers>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>local-repo</id>
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>central</id>
|
||||
<url>https://repo.maven.apache.org/maven2</url>
|
||||
<releases>
|
||||
<enabled>true</enabled>
|
||||
</releases>
|
||||
<snapshots>
|
||||
<enabled>false</enabled>
|
||||
</snapshots>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>staged-releases</id>
|
||||
<url>https://repository.apache.org/content/groups/staging/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>staged-releases</id>
|
||||
<url>https://repository.apache.org/content/groups/staging/</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
<activeProfiles>
|
||||
<activeProfile>local-repo</activeProfile>
|
||||
</activeProfiles>
|
||||
</settings>
|
||||
|
|
@ -115,7 +115,7 @@ env:
|
|||
global:
|
||||
- RELEASE_BRANCH=^release-.*$
|
||||
- RELEASE_TAG=^v[0-9]\..*$
|
||||
- TRAVIS_DIR=hugegraph-dist/src/assembly/travis
|
||||
- TRAVIS_DIR=hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||
- DEPLOYED=0
|
||||
- secure: dYmFTVeEtRzLNaHp9ToTV/+CkTD0/rEj+K7dRN8wsv/yg4pbqwnyWbSXcqMlj6iNFzAz3nPbmFLCvAWON9/SMN9iJIT6x/xfcf+LqCT8QWczo2nc9xeX144ij2VHX1Drvtk5fRTMaTXRfWEQIrjqx2yrJTIdrXWzWSaZLFv1CRCUizEiGGCePnzUWxx9dBypNyC6IaH6lIv8uN5E6+10SYhb7UJGjWUMDg1bCeW9X7X2wg4QpsGDzlGFXT2EBPU/dAb5attTAtW8dKxrCZqZJTPWe0BarXDBR4PO15BC+a0V1g8LwexedtDjJeFRcGPaJ5NN4d3jDSusCzt5Jf4U0Wa1gDRMVTU3jT+KYkm5eoV4wOZMySobjh6VpQH/LyL0QTDy5apRPAxw+wO+tc91P+nkJmnlr3pN8abtMZ6NciZizUBYQRgR/m2Ir0stvtbZxBQOATuPtBgNDKiDgVdSYcRJzSqYEMFOn35AvsDZ9aUsyC8k29PCUZ0gQO2Is6cV1ClFBnM52hfU9XX0gu+NviSnYNGvcokod8z9VjGtnM7V3LYjqXSFqO9kkMbOmkME1tD2Bh/klw2/OM+2tBBZiAgxB89st5jSUHI4a2hpUyaQBezJUcU9t2vVT/zAVEIqzw2PDxkMU7t0n6L1x+qUIUTG/WynfIni5msxuR7HoiU=
|
||||
- secure: XbX6AX5zDPc2PcWYAMW+6fazqRRUqpgQkt4eXUugLuVIYZBmJ0WqncEhJ4+mdwOGPIhnP2HsOaSeK2eE/O+iLY2XpBFbugoBgm9VaZlCC4CY1gRNHaanYg64Lrm3NPY3n08IHRMazHqMpJwUqNO+OG/6QwkepULQLj5Rluf716AoXHa7IEJhAIrwr+OXQvdEaJdUXlS1lRycXVeYtOewl7qYxCO4dD4RMhPlNykh9KEK7fd5wnPkiUsp1SwF4g5XsaLvGXmT/qQ1nj8oa9Caej/iaj6HMKG3BO057mq4KK5JDxTPWhBueNpEkUwldAnrMhYWLRnNf4IyjUsaB/Pmi6HspzcaiORPLYwPmdvLGGSnYwbtO+fAHebgpgOnj/vGmRmY4YtIkYdFtbPBI0HpbGB77tqNRFCe/5deLrjx0hXJBfoKTy7d42SI1eBhNR0svZYUHkSfuXwly6hMTlH1DN/bumMFxfXDkY9PFHlzV1Mn3vb9BxKTaP88hJsWk7JqgniqUF7EWAc0EhHMbJct2gC0pDc95z4Yy9391n7/XWJErhIdYon1Ukds5+a43xFXoy76gR4LuMDpzzCnutMjhC2yDuGaZx/DfkPBb5JFU7SHtTKj05zb73Moogi7qqbH8jwcwoSfogAKyrIAWTcAgvJ2LVnRzwdsiLTc6MEagiM=
|
||||
|
|
|
|||
|
|
@ -3,10 +3,9 @@ name: "3rd-party"
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- /^release-.*$/
|
||||
pull_request:
|
||||
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
|
|
@ -14,18 +13,26 @@ jobs:
|
|||
dependency-check:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
SCRIPT_DEPENDENCY: hugegraph-dist/scripts/dependency
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
SCRIPT_DEPENDENCY: install-dist/scripts/dependency
|
||||
steps:
|
||||
- name: Checkout source
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: use staged maven repo settings
|
||||
if: ${{ env.USE_STAGE == 'true' }}
|
||||
run: |
|
||||
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||
|
||||
- name: mvn install
|
||||
run: |
|
||||
mvn install -DskipTests=true -ntp
|
||||
mvn install -Dmaven.test.skip=true -ntp
|
||||
- name: generate current dependencies
|
||||
run: |
|
||||
bash $SCRIPT_DEPENDENCY/regenerate_known_dependencies.sh current-dependencies.txt
|
||||
|
|
@ -37,12 +44,13 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v3
|
||||
# Refer: https://github.com/actions/dependency-review-action
|
||||
with:
|
||||
fail-on-severity: low
|
||||
# TODO: reset critical to low before releasing
|
||||
fail-on-severity: critical
|
||||
# Action will fail if dependencies don't match the list
|
||||
#allow-licenses: Apache-2.0, MIT
|
||||
#deny-licenses: GPL-3.0, AGPL-1.0, AGPL-3.0, LGPL-2.0, CC-BY-3.0
|
||||
|
|
|
|||
|
|
@ -4,13 +4,15 @@ on:
|
|||
push:
|
||||
branches: [ master, release-* ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
# branches: [ master ] # enable in all PR
|
||||
# The branches below must be a subset of the branches above
|
||||
# branches: [ master ] # enable in all PRs
|
||||
schedule:
|
||||
- cron: '33 0 * * 5'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
env:
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
|
|
@ -25,7 +27,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Java JDK
|
||||
uses: actions/setup-java@v3
|
||||
|
|
@ -33,6 +35,12 @@ jobs:
|
|||
distribution: 'zulu'
|
||||
java-version: '11'
|
||||
|
||||
- name: use staged maven repo settings
|
||||
if: ${{ env.USE_STAGE == 'true' }}
|
||||
run: |
|
||||
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v2
|
||||
|
|
|
|||
|
|
@ -0,0 +1,64 @@
|
|||
name: "HugeGraph-Commons CI"
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- /^release-.*$/
|
||||
- /^test-.*$/
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
build-commons:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
# TODO: reset use stage to false later
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
JAVA_VERSION: ['11']
|
||||
|
||||
steps:
|
||||
- name: Install JDK ${{ matrix.JAVA_VERSION }}
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: ${{ matrix.JAVA_VERSION }}
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- 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 compile -Dmaven.javadoc.skip=true -ntp
|
||||
|
||||
- name: Run common test
|
||||
run: |
|
||||
mvn test -pl hugegraph-commons/hugegraph-common -Dtest=UnitTestSuite
|
||||
|
||||
- name: Run rpc test
|
||||
run: |
|
||||
mvn test -pl hugegraph-commons/hugegraph-rpc -Dtest=UnitTestSuite
|
||||
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v3.0.0
|
||||
with:
|
||||
file: target/jacoco.xml
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
name: "License checker"
|
||||
name: "License Checker"
|
||||
|
||||
on:
|
||||
push:
|
||||
|
|
@ -10,8 +10,10 @@ on:
|
|||
jobs:
|
||||
check-license:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Check License Header
|
||||
uses: apache/skywalking-eyes@main
|
||||
|
|
@ -22,12 +24,7 @@ jobs:
|
|||
token: ${{ github.token }}
|
||||
config: .licenserc.yaml
|
||||
|
||||
- uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'adopt'
|
||||
|
||||
- name: License check(RAT)
|
||||
- name: License Check (RAT)
|
||||
run: |
|
||||
mvn apache-rat:check -ntp
|
||||
find ./ -name rat.txt -print0 | xargs -0 -I file cat file > merged-rat.txt
|
||||
|
|
|
|||
|
|
@ -0,0 +1,219 @@
|
|||
name: "HugeGraph-PD & Store & Hstore CI"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- 'release-*'
|
||||
- 'test-*'
|
||||
pull_request:
|
||||
|
||||
# TODO: consider merge to one ci.yml file
|
||||
jobs:
|
||||
pd:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
# TODO: avoid duplicated env setup in pd & store
|
||||
# TODO: reset use stage to false later
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
# TODO: remove outdated env
|
||||
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||
REPORT_DIR: target/site/jacoco
|
||||
|
||||
steps:
|
||||
- name: Install JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 5
|
||||
|
||||
- name: use staged maven repo settings
|
||||
if: ${{ env.USE_STAGE == 'true' }}
|
||||
run: |
|
||||
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||
|
||||
- name: Run common test
|
||||
run: |
|
||||
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-common-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run core test
|
||||
run: |
|
||||
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-core-test -DskipCommonsTests=true
|
||||
|
||||
# The above tests do not require starting a PD instance.
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp
|
||||
|
||||
- name: Prepare env and service
|
||||
run: |
|
||||
$TRAVIS_DIR/start-pd.sh
|
||||
|
||||
- name: Run client test
|
||||
run: |
|
||||
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-client-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run rest test
|
||||
run: |
|
||||
mvn test -pl hugegraph-pd/hg-pd-test -am -P pd-rest-test -DskipCommonsTests=true
|
||||
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v3.0.0
|
||||
with:
|
||||
file: ${{ env.REPORT_DIR }}/*.xml
|
||||
|
||||
store:
|
||||
# TODO: avoid duplicated env setup
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
# TODO: remove outdated env
|
||||
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||
REPORT_DIR: target/site/jacoco
|
||||
|
||||
steps:
|
||||
- name: Install JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 5
|
||||
|
||||
- name: use staged maven repo settings
|
||||
if: ${{ env.USE_STAGE == 'true' }}
|
||||
run: |
|
||||
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp
|
||||
|
||||
- name: Prepare env and service
|
||||
run: |
|
||||
$TRAVIS_DIR/start-pd.sh
|
||||
$TRAVIS_DIR/start-store.sh
|
||||
|
||||
- name: Run common test
|
||||
run: |
|
||||
mvn test -pl hugegraph-store/hg-store-test -am -P store-common-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run client test
|
||||
run: |
|
||||
mvn test -pl hugegraph-store/hg-store-test -am -P store-client-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run core test
|
||||
run: |
|
||||
mvn test -pl hugegraph-store/hg-store-test -am -P store-core-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run rocksdb test
|
||||
run: |
|
||||
mvn test -pl hugegraph-store/hg-store-test -am -P store-rocksdb-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run server test
|
||||
run: |
|
||||
mvn test -pl hugegraph-store/hg-store-test -am -P store-server-test -DskipCommonsTests=true
|
||||
|
||||
- name: Run raft-core test
|
||||
run: |
|
||||
mvn test -pl hugegraph-store/hg-store-test -am -P store-raftcore-test -DskipCommonsTests=true
|
||||
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v3.0.0
|
||||
with:
|
||||
file: ${{ env.REPORT_DIR }}/*.xml
|
||||
|
||||
hstore:
|
||||
# TODO: avoid duplicated env setup
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||
REPORT_DIR: target/site/jacoco
|
||||
BACKEND: hstore
|
||||
RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') || startsWith(github.base_ref, 'release-') }}
|
||||
|
||||
steps:
|
||||
- name: Install JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Cache Maven packages
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.m2
|
||||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: use staged maven repo settings
|
||||
if: ${{ env.USE_STAGE == 'true' }}
|
||||
run: |
|
||||
cp $HOME/.m2/settings.xml /tmp/settings.xml
|
||||
mv -vf .github/configs/settings.xml $HOME/.m2/settings.xml
|
||||
|
||||
- name: Package
|
||||
run: |
|
||||
mvn clean package -U -Dmaven.javadoc.skip=true -Dmaven.test.skip=true -ntp
|
||||
|
||||
- name: Prepare env and service
|
||||
run: |
|
||||
$TRAVIS_DIR/install-backend.sh $BACKEND
|
||||
|
||||
- name: Run unit test
|
||||
run: |
|
||||
$TRAVIS_DIR/run-unit-test.sh $BACKEND
|
||||
|
||||
- name: Run core test
|
||||
run: |
|
||||
$TRAVIS_DIR/run-core-test.sh $BACKEND
|
||||
|
||||
- name: Run api test
|
||||
run: |
|
||||
$TRAVIS_DIR/run-api-test.sh $BACKEND $REPORT_DIR
|
||||
|
||||
- name: Run raft test
|
||||
if: ${{ env.BACKEND == 'rocksdb' }}
|
||||
run: |
|
||||
$TRAVIS_DIR/run-api-test-for-raft.sh $BACKEND $REPORT_DIR
|
||||
|
||||
- name: Run TinkerPop test
|
||||
if: ${{ env.RELEASE_BRANCH == 'true' }}
|
||||
run: |
|
||||
$TRAVIS_DIR/run-tinkerpop-test.sh $BACKEND tinkerpop
|
||||
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v3.0.0
|
||||
with:
|
||||
file: ${{ env.REPORT_DIR }}/*.xml
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
name: "hugegraph-ci"
|
||||
name: "HugeGraph-Server CI"
|
||||
|
||||
on:
|
||||
push:
|
||||
|
|
@ -9,26 +9,46 @@ on:
|
|||
pull_request:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
build-server:
|
||||
# TODO: we need test & replace it to ubuntu-24.04 or ubuntu-latest
|
||||
runs-on: ubuntu-20.04
|
||||
env:
|
||||
TRAVIS_DIR: hugegraph-dist/src/assembly/travis
|
||||
# TODO: reset use stage to false later
|
||||
USE_STAGE: 'true' # Whether to include the stage repository.
|
||||
TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis
|
||||
REPORT_DIR: target/site/jacoco
|
||||
BACKEND: ${{ matrix.BACKEND }}
|
||||
TRIGGER_BRANCH_NAME: ${{ github.ref_name }}
|
||||
HEAD_BRANCH_NAME: ${{ github.head_ref }}
|
||||
BASE_BRANCH_NAME: ${{ github.base_ref }}
|
||||
TARGET_BRANCH_NAME: ${{ github.base_ref != '' && github.base_ref || github.ref_name }}
|
||||
RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') || startsWith(github.base_ref, 'release-') }}
|
||||
RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') }}
|
||||
RAFT_MODE: ${{ startsWith(github.head_ref, 'test') || startsWith(github.head_ref, 'raft') }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
BACKEND: [ memory, cassandra, scylladb, hbase, rocksdb, mysql, postgresql ]
|
||||
JAVA_VERSION: [ '8', '11' ]
|
||||
BACKEND: [ memory, rocksdb, hbase, cassandra, mysql, postgresql, scylladb ]
|
||||
JAVA_VERSION: [ '11' ]
|
||||
|
||||
steps:
|
||||
- name: Install JDK ${{ matrix.JAVA_VERSION }}
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 5
|
||||
|
||||
# TODO: Remove this step after install-backend.sh updated
|
||||
- name: Install Java8 for backend
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Prepare backend environment
|
||||
run: |
|
||||
$TRAVIS_DIR/install-backend.sh $BACKEND && jps -l
|
||||
|
||||
- name: Install Java ${{ matrix.JAVA_VERSION }}
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: ${{ matrix.JAVA_VERSION }}
|
||||
|
|
@ -41,30 +61,16 @@ jobs:
|
|||
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: ${{ runner.os }}-m2
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- 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 -U -Dmaven.javadoc.skip=true -ntp
|
||||
|
||||
- name: Install JDK 8
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '8'
|
||||
distribution: 'zulu'
|
||||
- name: Prepare env and service
|
||||
run: |
|
||||
$TRAVIS_DIR/install-backend.sh $BACKEND
|
||||
|
||||
- name: Install JDK ${{ matrix.JAVA_VERSION }}
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: ${{ matrix.JAVA_VERSION }}
|
||||
distribution: 'zulu'
|
||||
|
||||
- name: Run unit test
|
||||
run: |
|
||||
$TRAVIS_DIR/run-unit-test.sh $BACKEND
|
||||
|
|
@ -77,8 +83,9 @@ jobs:
|
|||
run: |
|
||||
$TRAVIS_DIR/run-api-test.sh $BACKEND $REPORT_DIR
|
||||
|
||||
# TODO: disable raft test in normal PR due to the always timeout problem
|
||||
- name: Run raft test
|
||||
if: ${{ env.BACKEND == 'rocksdb' }}
|
||||
if: ${{ env.RAFT_MODE == 'true' && env.BACKEND == 'rocksdb' }}
|
||||
run: |
|
||||
$TRAVIS_DIR/run-api-test-for-raft.sh $BACKEND $REPORT_DIR
|
||||
|
||||
|
|
@ -88,6 +95,7 @@ jobs:
|
|||
$TRAVIS_DIR/run-tinkerpop-test.sh $BACKEND tinkerpop
|
||||
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v3.0.0
|
||||
uses: codecov/codecov-action@v3
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
file: ${{ env.REPORT_DIR }}/*.xml
|
||||
|
|
@ -29,7 +29,7 @@ jobs:
|
|||
days-before-pr-stale: 30
|
||||
days-before-pr-close: 180
|
||||
operations-per-run: 10
|
||||
start-date: '2017-10-01T00:00:00Z'
|
||||
start-date: '2016-10-01T00:00:00Z'
|
||||
|
||||
exempt-all-assignees: true
|
||||
remove-stale-when-updated: true
|
||||
|
|
|
|||
|
|
@ -19,8 +19,9 @@ gen-java
|
|||
.svn
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
.idea/
|
||||
.idea/*
|
||||
!.idea/vcs.xml
|
||||
!.idea/icon.png
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
|
@ -56,7 +57,7 @@ build/
|
|||
*.pyc
|
||||
|
||||
# maven ignore
|
||||
apache-hugegraph-incubating-*/
|
||||
apache-hugegraph-*/
|
||||
output/
|
||||
*.war
|
||||
*.zip
|
||||
|
|
@ -83,3 +84,6 @@ hs_err_pid*
|
|||
.mtj.tmp/
|
||||
# blueJ files
|
||||
*.ctxt
|
||||
|
||||
# docker volumes ignore
|
||||
hugegraph-server/hugegraph-dist/docker/data/
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 8.3 KiB |
|
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
|
||||
<project version="4">
|
||||
<component name="IssueNavigationConfiguration">
|
||||
<option name="links">
|
||||
<list>
|
||||
<IssueNavigationLink>
|
||||
<option name="issueRegexp" value="#(\d+)" />
|
||||
<!--
|
||||
GitHub share the sequence number of issues and pull requests, and it will redirect to
|
||||
the right place when the the sequence number not match kind.
|
||||
-->
|
||||
<option name="linkRegexp" value="https://github.com/apache/hugegraph/pull/$1" />
|
||||
</IssueNavigationLink>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -26,7 +26,9 @@ header: # `header` section is configurations for source codes license header.
|
|||
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.
|
||||
|
|
@ -34,20 +36,20 @@ header: # `header` section is configurations for source codes license header.
|
|||
limitations under the License.
|
||||
# `pattern` is optional regexp if all the file headers are the same as `license` or the license of `spdx-id` and `copyright-owner`.
|
||||
pattern: |
|
||||
Licensed to the Apache Software Foundation under one or more contributor
|
||||
license agreements. See the NOTICE file distributed with
|
||||
this work for additional information regarding copyright
|
||||
ownership. The Apache Software Foundation 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
|
||||
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.
|
||||
|
||||
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.
|
||||
paths: # `paths` are the path list that will be checked (and fixed) by license-eye, default is ['**'].
|
||||
- '**'
|
||||
|
||||
|
|
@ -68,7 +70,7 @@ header: # `header` section is configurations for source codes license header.
|
|||
- '**/*.properties'
|
||||
- '**/RaftRequests.java'
|
||||
- 'dist/**/*'
|
||||
- 'hugegraph-dist'
|
||||
- 'hugegraph-server/hugegraph-dist'
|
||||
- '**/assembly/static/bin/hugegraph.service'
|
||||
- 'scripts/dev/reviewers'
|
||||
- 'scripts/dev/reviewers'
|
||||
|
|
@ -89,13 +91,15 @@ header: # `header` section is configurations for source codes license header.
|
|||
- '**/META-INF/MANIFEST.MF'
|
||||
- '.repository/**'
|
||||
- '**/.flattened-pom.xml'
|
||||
- 'hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java'
|
||||
- '**/optimize/HugeScriptTraversal.java'
|
||||
- '**/type/Nameable.java'
|
||||
- '**/define/Cardinality.java'
|
||||
- '**/util/StringEncoding.java'
|
||||
- 'hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java'
|
||||
- 'hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java'
|
||||
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java'
|
||||
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeScriptTraversal.java'
|
||||
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/Nameable.java'
|
||||
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/Cardinality.java'
|
||||
- 'hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/util/StringEncoding.java'
|
||||
- 'hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java'
|
||||
- 'hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/StructureBasicSuite.java'
|
||||
- 'hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java'
|
||||
- 'hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java'
|
||||
comment: on-failure # on what condition license-eye will comment on the pull request, `on-failure`, `always`, `never`.
|
||||
|
||||
# license-location-threshold specifies the index threshold where the license header can be located,
|
||||
|
|
|
|||
37
BUILDING.md
37
BUILDING.md
|
|
@ -1,28 +1,35 @@
|
|||
Building hugegraph
|
||||
Building HugeGraph
|
||||
--------------
|
||||
|
||||
Required:
|
||||
|
||||
* Java 8/11
|
||||
* Maven
|
||||
* Java 11
|
||||
* Maven 3.5+
|
||||
|
||||
To build without executing tests: `mvn clean package -Dmaven.test.skip=true`
|
||||
|
||||
## Building in IDEA
|
||||
|
||||
To build without executing tests:
|
||||
|
||||
```
|
||||
mvn clean
|
||||
mvn package -DskipTests
|
||||
```
|
||||
1. Click on "File" -> "Open", choose your project location.
|
||||
2. Open maven view by click "View" -> "Tool Windows" -> "Maven Projects".
|
||||
3. Choose root module "hugegraph: Distributed Graph Database", unfold the menu of "Lifecycle".
|
||||
4. Click the "Toggle 'Skip Tests' Mode" button which is located on the top navibar of "Maven Projects" window to skip tests.
|
||||
5. Double click "package" or "install" to build a project.
|
||||
|
||||
## Building on Eclipse IDE
|
||||
Note that this has only been tested on Eclipse Neon.2 Release (4.6.2) with m2e (1.7.0.20160603-1933) and m2e-wtp (1.3.1.20160831-1005) plugin.
|
||||
Could also refer [Dev-In-IDEA](https://hugegraph.apache.org/docs/contribution-guidelines/hugegraph-server-idea-setup/) for more details.
|
||||
|
||||
## Building in Eclipse
|
||||
|
||||
> Note: this has only been tested on Eclipse Neon.2 Release (4.6.2) with m2e (1.7.0.20160603-1933) and m2e-wtp (1.3.1.20160831-1005) plugin.
|
||||
|
||||
To build without executing tests:
|
||||
|
||||
1. Right-click on your project -> "Run As..." -> "Run Configurations..."
|
||||
2. On "Goals", populate with `install`
|
||||
3. Select the options `Update Snapshots` and `Skip Tests`
|
||||
4. Before clicking "Run", make sure that Eclipse knows where `JAVA_HOME` is. On same window, go to "Environment" tab and click "New".
|
||||
4. Before clicking "Run", make sure that Eclipse knows where `JAVA_HOME` is. In the same window, go to "Environment" tab and click "New".
|
||||
5. Under "Name:", add `JAVA_HOME`
|
||||
6. Under "Value:", add the path where `java` is located
|
||||
7. Click "OK"
|
||||
|
|
@ -32,13 +39,3 @@ To find the Java binary in your environment, run the appropriate command for you
|
|||
* Linux/macOS: `which java`
|
||||
* Windows: `for %i in (java.exe) do @echo. %~$PATH:i`
|
||||
|
||||
## Building on IDEA
|
||||
|
||||
To build without executing tests:
|
||||
|
||||
1. Click on "File" -> "Open", choose your project location.
|
||||
2. Open maven view by click "View" -> "Tool Windows" -> "Maven Projects".
|
||||
3. Choose root module "hugegraph: Distributed Graph Database", unfold the menu of "Lifecycle".
|
||||
4. Click the "Toggle 'Skip Tests' Mode" button which is located on the top
|
||||
navibar of "Maven Projects" window to skip tests.
|
||||
5. Double click "package" or "install" to build project.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
# How to Contribute to HugeGraph
|
||||
|
||||
Thanks for taking the time to contribute! As an open source project, HugeGraph is looking forward to be contributed from everyone,
|
||||
and we are also grateful to all the contributors.
|
||||
> Refer [website-doc](https://hugegraph.apache.org/docs/contribution-guidelines/) for the latest information.
|
||||
|
||||
Thanks for taking the time to contribute!
|
||||
As an open source project, HugeGraph is looking forward to being contributed from everyone, and we are also grateful to all the contributors.
|
||||
|
||||
The following is a contribution guide for HugeGraph:
|
||||
|
||||
|
|
@ -15,7 +17,7 @@ We can contribute by reporting issues, submitting code patches or any other feed
|
|||
|
||||
Before submitting the code, we need to do some preparation:
|
||||
|
||||
1. Sign up or login to GitHub: [https://github.com](https://github.com)
|
||||
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)
|
||||
|
||||
|
|
@ -64,26 +66,26 @@ Assume that we need to modify some files like "HugeGraph.java" and "HugeFactory.
|
|||
|
||||
```shell
|
||||
# modify code to fix a bug
|
||||
vim hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
|
||||
vim hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
|
||||
vim hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
|
||||
vim hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
|
||||
# run test locally (optional)
|
||||
mvn test -Pcore-test,memory
|
||||
```
|
||||
Note: In order 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: 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).
|
||||
|
||||
##### 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 [./hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/release-docs/LICENSE) `LICENSE` information.
|
||||
3. Find the NOTICE file in the repository and append it to [./hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file).
|
||||
4. Execute locally [./hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-dist/scripts/dependency/known-dependencies.txt) (or manually update) .
|
||||
2. Declare the dependency in [./hugegraph-server/hugegraph-dist/release-docs/LICENSE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/LICENSE) `LICENSE` information.
|
||||
3. Find the NOTICE file in the repository and append it to [./hugegraph-server/hugegraph-dist/release-docs/NOTICE](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/release-docs/NOTICE) file (skip this step if there is no NOTICE file).
|
||||
4. Execute locally [./hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-dist/scripts/dependency/regenerate_known_dependencies.sh) to update the dependency list [known-dependencies.txt](https://github.com/apache/incubator-hugegraph/blob/master/hugegraph-server/hugegraph-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
|
||||
- LICENSE file: https://github.com/apache/ant/blob/rel/1.9.1/LICENSE
|
||||
- NOTICE file: https://github.com/apache/ant/blob/rel/1.9.1/NOTICE
|
||||
|
||||
The license information of `ant-1.9.1.jar` needs to be specified in the LICENSE file, and the notice information needs to be specified in the NOTICE file. The detailed LICENSE file corresponding to ant-1.9.1.jar needs to be copied to our licenses/ directory. Finally update the known-dependencies.txt file.
|
||||
The license information of `ant-1.9.1.jar` needs to be specified in the LICENSE file, and the notice information needs to be specified in the NOTICE file. The detailed LICENSE file corresponding to ant-1.9.1.jar needs to be copied to our licenses/ directory. Finally, update the known-dependencies.txt file.
|
||||
|
||||
#### 3.3 Commit changes to git repo
|
||||
|
||||
|
|
@ -91,8 +93,8 @@ After the code has been completed, we submit them to the local git repo:
|
|||
|
||||
```shell
|
||||
# add files to local git index
|
||||
git add hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
|
||||
git add hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
|
||||
git add hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeGraph.java
|
||||
git add hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/HugeFactory.java
|
||||
# commit to local git repo
|
||||
git commit
|
||||
```
|
||||
|
|
@ -105,7 +107,7 @@ Fix bug: run deploy multiple times
|
|||
fix #ISSUE_ID
|
||||
```
|
||||
|
||||
> Please remember to fill in the issue id, which was generated by GitHub after issue creation.
|
||||
> Please remember to fill in the issue id, which GitHub generated after issue creation.
|
||||
|
||||
#### 3.4 Push commit to GitHub fork repo
|
||||
|
||||
|
|
@ -121,7 +123,7 @@ Note that since GitHub requires submitting code through `username + token` (inst
|
|||
|
||||
## 4. Create a Pull Request
|
||||
|
||||
Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, just click button "Compare & pull request" to do it. Then edit the description for proposed changes, which can just be copied from the commit message.
|
||||
Go to the web page of GitHub fork repo, there would be a chance to create a Pull Request after pushing to a new branch, click the button "Compare & pull request" to do it. Then edit the description for proposed changes, which can just be copied from the commit message.
|
||||
|
||||
Note: please make sure the email address you used to submit the code is bound to the GitHub account. For how to bind the email address, please refer to https://github.com/settings/emails:
|
||||
<img width="1280" alt="image" src="https://user-images.githubusercontent.com/9625821/163522445-2a50a72a-dea2-434f-9868-3a0d40d0d037.png">
|
||||
|
|
@ -131,7 +133,7 @@ Note: please make sure the email address you used to submit the code is bound to
|
|||
Maintainers will start the code review after all the **automatic** checks are passed:
|
||||
|
||||
- Check: Contributor License Agreement is signed
|
||||
- Check: Travis CI builds is passed (automatically Test and Deploy)
|
||||
- Check: Travis CI builds are passed (automatically Test and Deploy)
|
||||
|
||||
The commit will be accepted and merged if there is no problem after review.
|
||||
|
||||
|
|
@ -171,8 +173,8 @@ And push it to GitHub fork repo again:
|
|||
git push -f origin bugfix-branch:bugfix-branch
|
||||
```
|
||||
|
||||
GitHub will automatically update the Pull Request after we push it, just wait for code review.
|
||||
GitHub will automatically update the Pull Request after we push it, wait for code review.
|
||||
|
||||
Any question please contact to us through [hugegraph@googlegroups.com](mailto:hugegraph@googlegroups.com) or [other contact information](https://hugegraph.github.io/hugegraph-doc/).
|
||||
For Any question, please contact us through [dev@hugegraph.apache.org](mailto:dev@hugegraph.apache.org) ([subscriber](https://hugegraph.apache.org/docs/contribution-guidelines/subscribe/) only)
|
||||
|
||||
|
||||
|
|
|
|||
18
LICENSE
18
LICENSE
|
|
@ -207,12 +207,12 @@ Apache 2.0 licenses
|
|||
The following components are provided under the Apache License. See project link for details.
|
||||
The text of each license is the standard Apache 2.0 license.
|
||||
|
||||
hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/StructureBasicSuite.java from https://github.com/apache/tinkerpop
|
||||
hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java from https://github.com/apache/tinkerpop
|
||||
hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java from https://github.com/twitter-archive/snowflake
|
||||
hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeScriptTraversal.java from https://github.com/apache/tinkerpop
|
||||
hugegraph-core/src/main/java/org/apache/hugegraph/type/Nameable.java from https://github.com/JanusGraph/janusgraph
|
||||
hugegraph-core/src/main/java/org/apache/hugegraph/type/define/Cardinality.java from https://github.com/JanusGraph/janusgraph
|
||||
hugegraph-core/src/main/java/org/apache/hugegraph/util/StringEncoding.java from https://github.com/JanusGraph/janusgraph
|
||||
hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java from https://github.com/opencypher/cypher-for-gremlin
|
||||
hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java from https://github.com/opencypher/cypher-for-gremlin
|
||||
hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/StructureBasicSuite.java from https://github.com/apache/tinkerpop
|
||||
hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java from https://github.com/apache/tinkerpop
|
||||
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/SnowflakeIdGenerator.java from https://github.com/twitter-archive/snowflake
|
||||
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeScriptTraversal.java from https://github.com/apache/tinkerpop
|
||||
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/Nameable.java from https://github.com/JanusGraph/janusgraph
|
||||
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/type/define/Cardinality.java from https://github.com/JanusGraph/janusgraph
|
||||
hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/util/StringEncoding.java from https://github.com/JanusGraph/janusgraph
|
||||
hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java from https://github.com/opencypher/cypher-for-gremlin
|
||||
hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherPlugin.java from https://github.com/opencypher/cypher-for-gremlin
|
||||
|
|
|
|||
40
NOTICE
40
NOTICE
|
|
@ -1,5 +1,5 @@
|
|||
Apache HugeGraph(incubating)
|
||||
Copyright 2022-2023 The Apache Software Foundation
|
||||
Copyright 2022-2024 The Apache Software Foundation
|
||||
|
||||
This product includes software developed at
|
||||
The Apache Software Foundation (http://www.apache.org/).
|
||||
|
|
@ -13,9 +13,6 @@ This product contains code form the Apache TinkerPop Project:
|
|||
Apache TinkerPop
|
||||
Copyright 2015-2022 The Apache Software Foundation.
|
||||
|
||||
This product includes software developed at
|
||||
The Apache Software Foundation (http://www.apache.org/).
|
||||
|
||||
------------------------------------------------------------------------
|
||||
Activiti
|
||||
------------------------------------------------------------------------
|
||||
|
|
@ -42,7 +39,7 @@ This product contains code form the JanusGraph Project:
|
|||
-----------------------------------------------------------------------
|
||||
==============================================================
|
||||
JanusGraph: Distributed Graph Database
|
||||
Copyright 2012 and onwards JanusGraph Authors
|
||||
Copyright 2012 with JanusGraph Authors
|
||||
==============================================================
|
||||
|
||||
This product includes software developed by JanusGraph contributors listed
|
||||
|
|
@ -56,36 +53,3 @@ DataStax) and the following individuals:
|
|||
* Marko A. Rodriguez
|
||||
* Stephen Mallette
|
||||
* Pavel Yaskevich
|
||||
|
||||
It also includes software from other open source projects including, but not limited to (check pom.xml for complete listing):
|
||||
|
||||
* Apache Cassandra [https://cassandra.apache.org/]
|
||||
* Apache Commons [https://commons.apache.org/]
|
||||
* Apache Groovy [http://groovy-lang.org/]
|
||||
* Apache HBase [https://hbase.apache.org/]
|
||||
* Apache Hadoop [https://hadoop.apache.org/]
|
||||
* Apache Kerby [https://github.com/apache/directory-kerby]
|
||||
* Apache Log4j [https://logging.apache.org/log4j]
|
||||
* Apache Lucene [https://lucene.apache.org/]
|
||||
* Apache Solr [https://lucene.apache.org/solr/]
|
||||
* Apache TinkerPop [https://tinkerpop.apache.org/]
|
||||
* Astyanax [https://github.com/Netflix/astyanax]
|
||||
* DataStax Driver for Apache Cassandra [https://github.com/datastax/java-driver]
|
||||
* EasyMock [http://easymock.org/]
|
||||
* Elasticsearch [https://www.elastic.co/]
|
||||
* Google Cloud Bigtable [https://github.com/googlecloudplatform/cloud-bigtable-client]
|
||||
* Google Guava [https://github.com/google/guava]
|
||||
* HPPC [https://labs.carrotsearch.com/hppc.html]
|
||||
* JUnit [https://www.junit.org/]
|
||||
* Jackson [https://github.com/FasterXML/jackson]
|
||||
* Kryo [https://github.com/EsotericSoftware/kryo]
|
||||
* Metrics [https://metrics.dropwizard.io]
|
||||
* Mockito [https://site.mockito.org/]
|
||||
* Noggit [https://github.com/yonik/noggit]
|
||||
* OpenRDF [http://rdf4j.org/]
|
||||
* Oracle BerkeleyDB Java Edition [https://www.oracle.com/technetwork/products/berkeleydb/] (see license below)
|
||||
* Project Lombok [https://projectlombok.org/]
|
||||
* Reflections8 [https://github.com/aschoerk/reflections8]
|
||||
* SLF4J [https://www.slf4j.org/]
|
||||
* Spatial4j [https://github.com/locationtech/spatial4j]
|
||||
* Vavr [https://www.vavr.io/]
|
||||
|
|
|
|||
37
README.md
37
README.md
|
|
@ -8,18 +8,17 @@
|
|||
|
||||
[](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/codeql-analysis.yml)
|
||||
[](https://github.com/apache/incubator-hugegraph/actions/workflows/licence-checker.yml)
|
||||
[](https://app.codecov.io/gh/apache/incubator-hugegraph)
|
||||
[](https://github.com/apache/hugegraph/releases)
|
||||
[](https://github.com/apache/incubator-hugegraph/stargazers)
|
||||
|
||||
</div>
|
||||
|
||||
## What is Apache HugeGraph?
|
||||
|
||||
[HugeGraph](https://hugegraph.apache.org/) is a fast-speed and highly-scalable [graph database](https://en.wikipedia.org/wiki/Graph_database).
|
||||
Billions of vertices and edges can be easily stored into and queried from HugeGraph due to its excellent OLTP ability. As compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/) framework, various complicated graph queries can be accomplished through [Gremlin](https://tinkerpop.apache.org/gremlin.html)(a powerful graph traversal language).
|
||||
Billions of vertices and edges can be easily stored into and queried from HugeGraph due to its excellent OLTP ability.
|
||||
As compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/) framework, various complicated graph queries can be
|
||||
achieved through [Gremlin](https://tinkerpop.apache.org/gremlin.html)(a powerful graph traversal language).
|
||||
|
||||
|
||||
## Features
|
||||
|
|
@ -27,22 +26,28 @@ Billions of vertices and edges can be easily stored into and queried from HugeGr
|
|||
- Compliance to [Apache TinkerPop 3](https://tinkerpop.apache.org/), support [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 Driver Framework, support `RocksDB`, `Cassandra`, `HBase`, `ScyllaDB`, and `MySQL/Postgre` now and easy to add other backend store driver if needed
|
||||
- Plug-in Backend Store Driver Framework, support `RocksDB`, `Cassandra`, `HBase`, `ScyllaDB`, and `MySQL/Postgre` now and easy to add another backend store driver if needed
|
||||
- Integration with `Flink/Spark/HDFS`, and friendly to connect other big data platforms
|
||||
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Docker Way
|
||||
### 1. Docker Way (Convenient for Test)
|
||||
|
||||
We can use `docker run -itd --name=graph -p 8080:8080 hugegraph/hugegraph` to quickly start an inner
|
||||
HugeGraph server with `RocksDB` in background.
|
||||
HugeGraph server with `RocksDB` (in backgrounds) for **test/dev**.
|
||||
You can 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))
|
||||
|
||||
Optional: use `docker exec -it graph bash` to enter the container to do some operations.
|
||||
> 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.2.0`) for the stable version. Use `latest` tag to experience the newest functions in development.
|
||||
|
||||
### 2. Download Way
|
||||
|
||||
Visit [Download Page](https://hugegraph.apache.org/docs/download/download/) and refer the [doc](https://hugegraph.apache.org/docs/quickstart/hugegraph-server/#33-source-code-compilation)
|
||||
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.
|
||||
|
||||
### 3. Source Building Way
|
||||
|
|
@ -54,14 +59,15 @@ The project [doc page](https://hugegraph.apache.org/docs/) contains more informa
|
|||
and provides detailed documentation for users. (Structure / Usage / API / Configs...)
|
||||
|
||||
And here are links of other **HugeGraph** component/repositories:
|
||||
1. [hugegraph-toolchain](https://github.com/apache/incubator-hugegraph-toolchain) (graph **loader/dashboard/tool/client**)
|
||||
2. [hugegraph-computer](https://github.com/apache/incubator-hugegraph-computer) (matched **graph computing** system)
|
||||
3. [hugegraph-commons](https://github.com/apache/incubator-hugegraph-commons) (**common & rpc** module)
|
||||
4. [hugegraph-website](https://github.com/apache/incubator-hugegraph-doc) (**doc & website** code)
|
||||
1. [hugegraph-toolchain](https://github.com/apache/hugegraph-toolchain) (graph tools **[loader](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-loader)/[dashboard](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-hubble)/[tool](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-tools)/[client](https://github.com/apache/incubator-hugegraph-toolchain/tree/master/hugegraph-client)**)
|
||||
2. [hugegraph-computer](https://github.com/apache/hugegraph-computer) (integrated **graph computing** system)
|
||||
3. [hugegraph-commons](https://github.com/apache/hugegraph-commons) (**common & rpc** libs)
|
||||
4. [hugegraph-website](https://github.com/apache/hugegraph-doc) (**doc & website** code)
|
||||
5. [hugegraph-ai](https://github.com/apache/incubator-hugegraph-ai) (integrated **Graph AI/LLM/KG** system)
|
||||
|
||||
## License
|
||||
|
||||
HugeGraph is licensed under Apache 2.0 License.
|
||||
HugeGraph is licensed under [Apache 2.0 License](LICENSE).
|
||||
|
||||
|
||||
## Contributing
|
||||
|
|
@ -78,7 +84,8 @@ HugeGraph is licensed under Apache 2.0 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.
|
||||
|
||||
You are welcome to contribute to HugeGraph, and we are looking forward to working with you to build an excellent open source community.
|
||||
You are welcome to contribute to HugeGraph,
|
||||
and we are looking forward to working with you to build an excellent open-source community.
|
||||
|
||||
|
||||
## Contact Us
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
#
|
||||
|
||||
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
|
||||
|
|
@ -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.
|
||||
#
|
||||
|
||||
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
|
||||
|
|
@ -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.
|
||||
#
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#
|
||||
# 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
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#
|
||||
# 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
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
#
|
||||
# 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
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# 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
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#
|
||||
# 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]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
#
|
||||
# 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
|
||||
}
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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
|
||||
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.
|
||||
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.
|
||||
-->
|
||||
<!-- Config will be auto loaded every 60s -->
|
||||
<configuration status="error" monitorInterval="60">
|
||||
|
|
@ -30,14 +30,14 @@
|
|||
|
||||
<!-- Normal server log config -->
|
||||
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1day or 50MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||
<DefaultRolloverStrategy max="5">
|
||||
|
|
@ -45,8 +45,8 @@
|
|||
<IfFileName glob="*/*.log"/>
|
||||
<!-- Limit log amount & size -->
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="2GB" />
|
||||
<IfAccumulatedFileCount exceeds="100" />
|
||||
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||
<IfAccumulatedFileCount exceeds="100"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
|
|
@ -54,15 +54,15 @@
|
|||
|
||||
<!-- Separate & compress audit log, buffer size is 512KB -->
|
||||
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||
bufferSize="524288" immediateFlush="false">
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||
bufferSize="524288" immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<!-- Use simple format for audit log to speed up -->
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1hour or 500MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="500MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
||||
<DefaultRolloverStrategy max="2">
|
||||
|
|
@ -70,8 +70,32 @@
|
|||
<IfFileName glob="*/*.gz"/>
|
||||
<IfLastModified age="60d"/>
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="5GB" />
|
||||
<IfAccumulatedFileCount exceeds="500" />
|
||||
<IfAccumulatedFileSize exceeds="5GB"/>
|
||||
<IfAccumulatedFileCount exceeds="500"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
|
||||
<!-- Slow query log config -->
|
||||
<RollingRandomAccessFile name="slowQueryLog" fileName="${LOG_PATH}/slow_query.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/slow_query_log-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1day or 50MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||
<DefaultRolloverStrategy max="5">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.log"/>
|
||||
<!-- Limit log amount & size -->
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||
<IfAccumulatedFileCount exceeds="100"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
|
|
@ -113,5 +137,8 @@
|
|||
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
||||
<appender-ref ref="audit"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.api.filter.AccessLogFilter" level="INFO" additivity="false">
|
||||
<appender-ref ref="slowQueryLog"/>
|
||||
</AsyncLogger>
|
||||
</loggers>
|
||||
</configuration>
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# 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
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#
|
||||
# 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]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
# 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
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# 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
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
#
|
||||
# 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
|
||||
}
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<!-- Config will be auto loaded every 60s -->
|
||||
<configuration status="error" monitorInterval="60">
|
||||
<properties>
|
||||
<property name="LOG_PATH">logs</property>
|
||||
<property name="FILE_NAME">hugegraph-server</property>
|
||||
</properties>
|
||||
|
||||
<appenders>
|
||||
<Console name="console" target="SYSTEM_OUT">
|
||||
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
</Console>
|
||||
|
||||
<!-- Normal server log config -->
|
||||
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1day or 50MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||
<DefaultRolloverStrategy max="5">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.log"/>
|
||||
<!-- Limit log amount & size -->
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||
<IfAccumulatedFileCount exceeds="100"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
|
||||
<!-- Separate & compress audit log, buffer size is 512KB -->
|
||||
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||
bufferSize="524288" immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<!-- Use simple format for audit log to speed up -->
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1hour or 500MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="500MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
||||
<DefaultRolloverStrategy max="2">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.gz"/>
|
||||
<IfLastModified age="60d"/>
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="5GB"/>
|
||||
<IfAccumulatedFileCount exceeds="500"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
|
||||
<!-- Slow query log config -->
|
||||
<RollingRandomAccessFile name="slowQueryLog" fileName="${LOG_PATH}/slow_query.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/slow_query_log-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1day or 50MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||
<DefaultRolloverStrategy max="5">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.log"/>
|
||||
<!-- Limit log amount & size -->
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||
<IfAccumulatedFileCount exceeds="100"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
</appenders>
|
||||
|
||||
<loggers>
|
||||
<root level="INFO">
|
||||
<appender-ref ref="file"/>
|
||||
</root>
|
||||
<logger name="org.apache.cassandra" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="org.apache.hadoop" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="org.apache.zookeeper" level="WARN" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="com.datastax.driver" level="WARN" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="com.alipay.sofa" level="WARN" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="io.netty" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="org.apache.commons" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<!-- Use mixed async way to output logs -->
|
||||
<AsyncLogger name="org.apache.hugegraph" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.auth" level="INFO" additivity="false">
|
||||
<appender-ref ref="audit"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
||||
<appender-ref ref="audit"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.api.filter.AccessLogFilter" level="INFO" additivity="false">
|
||||
<appender-ref ref="slowQueryLog"/>
|
||||
</AsyncLogger>
|
||||
</loggers>
|
||||
</configuration>
|
||||
|
|
@ -23,8 +23,8 @@ serializer: {
|
|||
# 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
|
||||
org.apache.hugegraph.io.HugeGraphIoRegistry,
|
||||
org.apache.hugegraph.io.HugeGraphIoRegistry
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
# 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
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
# 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
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#
|
||||
# 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]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
#
|
||||
# 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
|
||||
}
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<!-- Config will be auto loaded every 60s -->
|
||||
<configuration status="error" monitorInterval="60">
|
||||
<properties>
|
||||
<property name="LOG_PATH">logs</property>
|
||||
<property name="FILE_NAME">hugegraph-server</property>
|
||||
</properties>
|
||||
|
||||
<appenders>
|
||||
<Console name="console" target="SYSTEM_OUT">
|
||||
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
</Console>
|
||||
|
||||
<!-- Normal server log config -->
|
||||
<RollingRandomAccessFile name="file" fileName="${LOG_PATH}/${FILE_NAME}.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1day or 50MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||
<DefaultRolloverStrategy max="5">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.log"/>
|
||||
<!-- Limit log amount & size -->
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||
<IfAccumulatedFileCount exceeds="100"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
|
||||
<!-- Separate & compress audit log, buffer size is 512KB -->
|
||||
<RollingRandomAccessFile name="audit" fileName="${LOG_PATH}/audit-${FILE_NAME}.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/audit-${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.gz"
|
||||
bufferSize="524288" immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<!-- Use simple format for audit log to speed up -->
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1hour or 500MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="500MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 2 files per hour & auto delete [after 60 days] or [over 5GB or 500 files] -->
|
||||
<DefaultRolloverStrategy max="2">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.gz"/>
|
||||
<IfLastModified age="60d"/>
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="5GB"/>
|
||||
<IfAccumulatedFileCount exceeds="500"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
|
||||
<!-- Slow query log config -->
|
||||
<RollingRandomAccessFile name="slowQueryLog" fileName="${LOG_PATH}/slow_query.log"
|
||||
filePattern="${LOG_PATH}/$${date:yyyy-MM}/slow_query_log-%d{yyyy-MM-dd}-%i.log"
|
||||
immediateFlush="false">
|
||||
<ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="%-d{yyyy-MM-dd HH:mm:ss} [%t] [%p] %c{1.} - %m%n"/>
|
||||
<!-- Trigger after exceeding 1day or 50MB -->
|
||||
<Policies>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- Keep 5 files per day & auto delete after over 2GB or 100 files -->
|
||||
<DefaultRolloverStrategy max="5">
|
||||
<Delete basePath="${LOG_PATH}" maxDepth="2">
|
||||
<IfFileName glob="*/*.log"/>
|
||||
<!-- Limit log amount & size -->
|
||||
<IfAny>
|
||||
<IfAccumulatedFileSize exceeds="2GB"/>
|
||||
<IfAccumulatedFileCount exceeds="100"/>
|
||||
</IfAny>
|
||||
</Delete>
|
||||
</DefaultRolloverStrategy>
|
||||
</RollingRandomAccessFile>
|
||||
</appenders>
|
||||
|
||||
<loggers>
|
||||
<root level="INFO">
|
||||
<appender-ref ref="file"/>
|
||||
</root>
|
||||
<logger name="org.apache.cassandra" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="org.apache.hadoop" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="org.apache.zookeeper" level="WARN" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="com.datastax.driver" level="WARN" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="com.alipay.sofa" level="WARN" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="io.netty" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<logger name="org.apache.commons" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</logger>
|
||||
<!-- Use mixed async way to output logs -->
|
||||
<AsyncLogger name="org.apache.hugegraph" level="INFO" additivity="false">
|
||||
<appender-ref ref="file"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.auth" level="INFO" additivity="false">
|
||||
<appender-ref ref="audit"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.api.filter.AuthenticationFilter" level="INFO" additivity="false">
|
||||
<appender-ref ref="audit"/>
|
||||
</AsyncLogger>
|
||||
<AsyncLogger name="org.apache.hugegraph.api.filter.AccessLogFilter" level="INFO" additivity="false">
|
||||
<appender-ref ref="slowQueryLog"/>
|
||||
</AsyncLogger>
|
||||
</loggers>
|
||||
</configuration>
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
#
|
||||
# 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
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#
|
||||
# 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]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# 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
|
||||
|
|
@ -0,0 +1,180 @@
|
|||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
# TODO: reuse the configs for same type containers
|
||||
# User could modify the node nums and the port by themselves
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
pd0:
|
||||
image: hugegraph/pd
|
||||
container_name: pd0
|
||||
hostname: pd0
|
||||
network_mode: host
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8620"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
volumes:
|
||||
- ./configs/application-pd0.yml:/hugegraph-pd/conf/application.yml
|
||||
|
||||
pd1:
|
||||
image: hugegraph/pd
|
||||
container_name: pd1
|
||||
hostname: pd1
|
||||
network_mode: host
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8621"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
volumes:
|
||||
- ./configs/application-pd1.yml:/hugegraph-pd/conf/application.yml
|
||||
|
||||
pd2:
|
||||
image: hugegraph/pd
|
||||
container_name: pd2
|
||||
hostname: pd2
|
||||
network_mode: host
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8622"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
volumes:
|
||||
- ./configs/application-pd2.yml:/hugegraph-pd/conf/application.yml
|
||||
|
||||
store0:
|
||||
image: hugegraph/store
|
||||
container_name: 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
|
||||
volumes:
|
||||
- ./configs/application-store0.yml:/hugegraph-store/conf/application.yml
|
||||
|
||||
store1:
|
||||
image: hugegraph/store
|
||||
container_name: 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
|
||||
volumes:
|
||||
- ./configs/application-store1.yml:/hugegraph-store/conf/application.yml
|
||||
|
||||
store2:
|
||||
image: hugegraph/store
|
||||
container_name: 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
|
||||
volumes:
|
||||
- ./configs/application-store2.yml:/hugegraph-store/conf/application.yml
|
||||
|
||||
server1:
|
||||
image: hugegraph/server
|
||||
container_name: 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
|
||||
|
||||
server2:
|
||||
image: hugegraph/server
|
||||
container_name: 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
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
#
|
||||
# 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.
|
||||
#
|
||||
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
pd:
|
||||
image: hugegraph/pd
|
||||
container_name: pd
|
||||
hostname: pd
|
||||
network_mode: host
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8620"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
|
||||
store:
|
||||
image: hugegraph/store
|
||||
container_name: store
|
||||
hostname: store
|
||||
network_mode: host
|
||||
depends_on:
|
||||
pd:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8520"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
|
||||
server:
|
||||
image: hugegraph/server
|
||||
container_name: server
|
||||
hostname: server
|
||||
network_mode: host
|
||||
depends_on:
|
||||
store:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:8080"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
|
|
@ -1,76 +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.api.gremlin;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import jakarta.ws.rs.client.Entity;
|
||||
import jakarta.ws.rs.client.WebTarget;
|
||||
import jakarta.ws.rs.core.HttpHeaders;
|
||||
import jakarta.ws.rs.core.MediaType;
|
||||
import jakarta.ws.rs.core.MultivaluedMap;
|
||||
import jakarta.ws.rs.core.Response;
|
||||
|
||||
import org.apache.hugegraph.api.filter.CompressInterceptor;
|
||||
import org.apache.hugegraph.rest.AbstractRestClient;
|
||||
import org.apache.hugegraph.testutil.Whitebox;
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class GremlinClient extends AbstractRestClient {
|
||||
|
||||
private final WebTarget webTarget;
|
||||
|
||||
public GremlinClient(String url, int timeout,
|
||||
int maxTotal, int maxPerRoute) {
|
||||
super(url, timeout, maxTotal, maxPerRoute);
|
||||
this.webTarget = Whitebox.getInternalState(this, "target");
|
||||
E.checkNotNull(this.webTarget, "target");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkStatus(Response response, Response.Status... statuses) {
|
||||
// pass
|
||||
}
|
||||
|
||||
public Response doPostRequest(String auth, String req) {
|
||||
Entity<?> body = Entity.entity(req, MediaType.APPLICATION_JSON);
|
||||
return this.webTarget.request()
|
||||
.header(HttpHeaders.AUTHORIZATION, auth)
|
||||
.accept(MediaType.APPLICATION_JSON)
|
||||
.acceptEncoding(CompressInterceptor.GZIP)
|
||||
.post(body);
|
||||
}
|
||||
|
||||
public Response doGetRequest(String auth,
|
||||
MultivaluedMap<String, String> params) {
|
||||
WebTarget target = this.webTarget;
|
||||
for (Map.Entry<String, List<String>> entry : params.entrySet()) {
|
||||
E.checkArgument(entry.getValue().size() == 1,
|
||||
"Invalid query param '%s', can only accept " +
|
||||
"one value, but got %s",
|
||||
entry.getKey(), entry.getValue());
|
||||
target = target.queryParam(entry.getKey(), entry.getValue().get(0));
|
||||
}
|
||||
return target.request()
|
||||
.header(HttpHeaders.AUTHORIZATION, auth)
|
||||
.accept(MediaType.APPLICATION_JSON)
|
||||
.acceptEncoding(CompressInterceptor.GZIP)
|
||||
.get();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,161 +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.api.metrics;
|
||||
|
||||
import static java.util.concurrent.TimeUnit.MILLISECONDS;
|
||||
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.security.RolesAllowed;
|
||||
import jakarta.inject.Singleton;
|
||||
import jakarta.ws.rs.GET;
|
||||
import jakarta.ws.rs.Path;
|
||||
import jakarta.ws.rs.Produces;
|
||||
import jakarta.ws.rs.core.Context;
|
||||
|
||||
import org.apache.hugegraph.core.GraphManager;
|
||||
import org.apache.hugegraph.metrics.MetricsModule;
|
||||
import org.apache.hugegraph.metrics.ServerReporter;
|
||||
import org.apache.hugegraph.metrics.SystemMetrics;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import org.apache.hugegraph.HugeGraph;
|
||||
import org.apache.hugegraph.api.API;
|
||||
import org.apache.hugegraph.backend.store.BackendMetrics;
|
||||
import org.apache.hugegraph.util.InsertionOrderUtil;
|
||||
import org.apache.hugegraph.util.JsonUtil;
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import com.codahale.metrics.Metric;
|
||||
import com.codahale.metrics.annotation.Timed;
|
||||
|
||||
@Singleton
|
||||
@Path("metrics")
|
||||
@Tag(name = "MetricsAPI")
|
||||
public class MetricsAPI extends API {
|
||||
|
||||
private static final Logger LOG = Log.logger(MetricsAPI.class);
|
||||
|
||||
private SystemMetrics systemMetrics;
|
||||
|
||||
static {
|
||||
JsonUtil.registerModule(new MetricsModule(SECONDS, MILLISECONDS, false));
|
||||
}
|
||||
|
||||
public MetricsAPI() {
|
||||
this.systemMetrics = new SystemMetrics();
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("system")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String system() {
|
||||
return JsonUtil.toJson(this.systemMetrics.metrics());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("backend")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String backend(@Context GraphManager manager) {
|
||||
Map<String, Map<String, Object>> results = InsertionOrderUtil.newMap();
|
||||
for (String graph : manager.graphs()) {
|
||||
HugeGraph g = manager.graph(graph);
|
||||
Map<String, Object> metrics = InsertionOrderUtil.newMap();
|
||||
metrics.put(BackendMetrics.BACKEND, g.backend());
|
||||
try {
|
||||
metrics.putAll(g.metadata(null, "metrics"));
|
||||
} catch (Throwable e) {
|
||||
metrics.put(BackendMetrics.EXCEPTION, e.toString());
|
||||
LOG.debug("Failed to get backend metrics", e);
|
||||
}
|
||||
results.put(graph, metrics);
|
||||
}
|
||||
return JsonUtil.toJson(results);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String all() {
|
||||
ServerReporter reporter = ServerReporter.instance();
|
||||
Map<String, Map<String, ? extends Metric>> result = new LinkedHashMap<>();
|
||||
result.put("gauges", reporter.gauges());
|
||||
result.put("counters", reporter.counters());
|
||||
result.put("histograms", reporter.histograms());
|
||||
result.put("meters", reporter.meters());
|
||||
result.put("timers", reporter.timers());
|
||||
return JsonUtil.toJson(result);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("gauges")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String gauges() {
|
||||
ServerReporter reporter = ServerReporter.instance();
|
||||
return JsonUtil.toJson(reporter.gauges());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("counters")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String counters() {
|
||||
ServerReporter reporter = ServerReporter.instance();
|
||||
return JsonUtil.toJson(reporter.counters());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("histograms")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String histograms() {
|
||||
ServerReporter reporter = ServerReporter.instance();
|
||||
return JsonUtil.toJson(reporter.histograms());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("meters")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String meters() {
|
||||
ServerReporter reporter = ServerReporter.instance();
|
||||
return JsonUtil.toJson(reporter.meters());
|
||||
}
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Path("timers")
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
@RolesAllowed({"admin", "$owner= $action=metrics_read"})
|
||||
public String timers() {
|
||||
ServerReporter reporter = ServerReporter.instance();
|
||||
return JsonUtil.toJson(reporter.timers());
|
||||
}
|
||||
}
|
||||
|
|
@ -1,82 +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.api.traversers;
|
||||
|
||||
import static org.apache.hugegraph.traversal.algorithm.HugeTraverser.DEFAULT_ELEMENTS_LIMIT;
|
||||
import static org.apache.hugegraph.traversal.algorithm.HugeTraverser.DEFAULT_MAX_DEGREE;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.inject.Singleton;
|
||||
import jakarta.ws.rs.DefaultValue;
|
||||
import jakarta.ws.rs.GET;
|
||||
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 org.slf4j.Logger;
|
||||
|
||||
import org.apache.hugegraph.HugeGraph;
|
||||
import org.apache.hugegraph.api.API;
|
||||
import org.apache.hugegraph.api.graph.EdgeAPI;
|
||||
import org.apache.hugegraph.api.graph.VertexAPI;
|
||||
import org.apache.hugegraph.backend.id.Id;
|
||||
import org.apache.hugegraph.core.GraphManager;
|
||||
import org.apache.hugegraph.traversal.algorithm.SameNeighborTraverser;
|
||||
import org.apache.hugegraph.type.define.Directions;
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import com.codahale.metrics.annotation.Timed;
|
||||
|
||||
@Path("graphs/{graph}/traversers/sameneighbors")
|
||||
@Singleton
|
||||
@Tag(name = "SameNeighborsAPI")
|
||||
public class SameNeighborsAPI extends API {
|
||||
|
||||
private static final Logger LOG = Log.logger(SameNeighborsAPI.class);
|
||||
|
||||
@GET
|
||||
@Timed
|
||||
@Produces(APPLICATION_JSON_WITH_CHARSET)
|
||||
public String get(@Context GraphManager manager,
|
||||
@PathParam("graph") String graph,
|
||||
@QueryParam("vertex") String vertex,
|
||||
@QueryParam("other") String other,
|
||||
@QueryParam("direction") String direction,
|
||||
@QueryParam("label") String edgeLabel,
|
||||
@QueryParam("max_degree")
|
||||
@DefaultValue(DEFAULT_MAX_DEGREE) long maxDegree,
|
||||
@QueryParam("limit")
|
||||
@DefaultValue(DEFAULT_ELEMENTS_LIMIT) int limit) {
|
||||
LOG.debug("Graph [{}] get same neighbors between '{}' and '{}' with " +
|
||||
"direction {}, edge label {}, max degree '{}' and limit '{}'",
|
||||
graph, vertex, other, direction, edgeLabel, maxDegree, limit);
|
||||
|
||||
Id sourceId = VertexAPI.checkAndParseVertexId(vertex);
|
||||
Id targetId = VertexAPI.checkAndParseVertexId(other);
|
||||
Directions dir = Directions.convert(EdgeAPI.parseDirection(direction));
|
||||
|
||||
HugeGraph g = graph(manager, graph);
|
||||
SameNeighborTraverser traverser = new SameNeighborTraverser(g);
|
||||
Set<Id> neighbors = traverser.sameNeighbors(sourceId, targetId, dir,
|
||||
edgeLabel, maxDegree, limit);
|
||||
return manager.serializer(g).writeList("same_neighbors", neighbors);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,61 +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.api.traversers;
|
||||
|
||||
import static org.apache.hugegraph.traversal.algorithm.HugeTraverser.DEFAULT_MAX_DEGREE;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.hugegraph.HugeGraph;
|
||||
import org.apache.hugegraph.api.API;
|
||||
import org.apache.hugegraph.traversal.algorithm.steps.EdgeStep;
|
||||
import org.apache.hugegraph.type.define.Directions;
|
||||
import com.fasterxml.jackson.annotation.JsonAlias;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class TraverserAPI extends API {
|
||||
|
||||
protected static EdgeStep step(HugeGraph graph, Step step) {
|
||||
return new EdgeStep(graph, step.direction, step.labels, step.properties,
|
||||
step.maxDegree, step.skipDegree);
|
||||
}
|
||||
|
||||
protected static class Step {
|
||||
|
||||
@JsonProperty("direction")
|
||||
public Directions direction;
|
||||
@JsonProperty("labels")
|
||||
public List<String> labels;
|
||||
@JsonProperty("properties")
|
||||
public Map<String, Object> properties;
|
||||
@JsonAlias("degree")
|
||||
@JsonProperty("max_degree")
|
||||
public long maxDegree = Long.parseLong(DEFAULT_MAX_DEGREE);
|
||||
@JsonProperty("skip_degree")
|
||||
public long skipDegree = 0L;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("Step{direction=%s,labels=%s,properties=%s," +
|
||||
"maxDegree=%s,skipDegree=%s}",
|
||||
this.direction, this.labels, this.properties,
|
||||
this.maxDegree, this.skipDegree);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,333 +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.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.configuration2.Configuration;
|
||||
import org.apache.hugegraph.HugeException;
|
||||
import org.apache.hugegraph.HugeFactory;
|
||||
import org.apache.hugegraph.HugeGraph;
|
||||
import org.apache.hugegraph.StandardHugeGraph;
|
||||
import org.apache.hugegraph.backend.cache.CacheManager;
|
||||
import org.apache.hugegraph.backend.tx.AbstractTransaction;
|
||||
import org.apache.hugegraph.backend.tx.GraphTransaction;
|
||||
import org.apache.hugegraph.backend.tx.IndexableTransaction;
|
||||
import org.apache.hugegraph.concurrent.LockManager;
|
||||
import org.apache.hugegraph.metrics.ServerReporter;
|
||||
import org.apache.hugegraph.schema.SchemaElement;
|
||||
import org.apache.hugegraph.schema.SchemaManager;
|
||||
import org.apache.hugegraph.schema.builder.AbstractBuilder;
|
||||
import org.apache.hugegraph.schema.builder.EdgeLabelBuilder;
|
||||
import org.apache.hugegraph.schema.builder.IndexLabelBuilder;
|
||||
import org.apache.hugegraph.schema.builder.PropertyKeyBuilder;
|
||||
import org.apache.hugegraph.schema.builder.VertexLabelBuilder;
|
||||
import org.apache.hugegraph.serializer.JsonSerializer;
|
||||
import org.apache.hugegraph.structure.HugeEdge;
|
||||
import org.apache.hugegraph.structure.HugeElement;
|
||||
import org.apache.hugegraph.structure.HugeProperty;
|
||||
import org.apache.hugegraph.structure.HugeVertex;
|
||||
import org.apache.hugegraph.task.HugeTask;
|
||||
import org.apache.hugegraph.task.StandardTaskScheduler;
|
||||
import org.apache.hugegraph.task.TaskCallable;
|
||||
import org.apache.hugegraph.task.TaskCallable.SysTaskCallable;
|
||||
import org.apache.hugegraph.task.TaskManager;
|
||||
import org.apache.hugegraph.traversal.optimize.HugeCountStepStrategy;
|
||||
import org.apache.hugegraph.traversal.optimize.HugeGraphStepStrategy;
|
||||
import org.apache.hugegraph.traversal.optimize.HugeVertexStepStrategy;
|
||||
import org.apache.hugegraph.util.Reflection;
|
||||
import org.apache.hugegraph.variables.HugeVariables;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
public final class HugeFactoryAuthProxy {
|
||||
|
||||
public static final String GRAPH_FACTORY =
|
||||
"gremlin.graph=org.apache.hugegraph.auth.HugeFactoryAuthProxy";
|
||||
|
||||
private static final Set<String> PROTECT_METHODS = ImmutableSet.of("instance");
|
||||
|
||||
private static final Map<HugeGraph, HugeGraph> GRAPHS = new HashMap<>();
|
||||
|
||||
static {
|
||||
HugeGraphAuthProxy.setContext(HugeGraphAuthProxy.Context.admin());
|
||||
HugeFactoryAuthProxy.registerPrivateActions();
|
||||
}
|
||||
|
||||
public static synchronized HugeGraph open(Configuration config) {
|
||||
/*
|
||||
* Inject authentication (replace HugeGraph with HugeGraphAuthProxy)
|
||||
* TODO: Add verify to StandardHugeGraph() to prevent dynamic creation
|
||||
*/
|
||||
HugeGraph graph = HugeFactory.open(config);
|
||||
HugeGraph proxy = GRAPHS.get(graph);
|
||||
if (proxy == null) {
|
||||
proxy = new HugeGraphAuthProxy(graph);
|
||||
GRAPHS.put(graph, proxy);
|
||||
}
|
||||
return proxy;
|
||||
}
|
||||
|
||||
private static void registerPrivateActions() {
|
||||
// Thread
|
||||
Reflection.registerFieldsToFilter(java.lang.Thread.class, "name", "priority", "threadQ", "eetop", "single_step", "daemon", "stillborn", "target", "group", "contextClassLoader", "inheritedAccessControlContext", "threadInitNumber", "threadLocals", "inheritableThreadLocals", "stackSize", "nativeParkEventPointer", "tid", "threadSeqNumber", "threadStatus", "parkBlocker", "blocker", "blockerLock", "EMPTY_STACK_TRACE", "SUBCLASS_IMPLEMENTATION_PERMISSION", "uncaughtExceptionHandler", "defaultUncaughtExceptionHandler", "threadLocalRandomSeed", "threadLocalRandomSecondarySeed");
|
||||
Reflection.registerMethodsToFilter(java.lang.Thread.class, "exit", "dispatchUncaughtException", "clone", "isInterrupted", "registerNatives", "init", "init", "nextThreadNum", "nextThreadID", "blockedOn", "start0", "isCCLOverridden", "auditSubclass", "dumpThreads", "getThreads", "processQueue", "setPriority0", "stop0", "suspend0", "resume0", "interrupt0", "setNativeName");
|
||||
Reflection.registerFieldsToFilter(java.lang.ThreadLocal.class, "threadLocalHashCode", "nextHashCode", "HASH_INCREMENT");
|
||||
Reflection.registerMethodsToFilter(java.lang.ThreadLocal.class, "access$400", "createInheritedMap", "nextHashCode", "initialValue", "setInitialValue", "getMap", "createMap", "childValue");
|
||||
Reflection.registerMethodsToFilter(java.lang.InheritableThreadLocal.class, "getMap", "createMap", "childValue");
|
||||
|
||||
// HugeGraph
|
||||
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", "registerPrivateActions", "c");
|
||||
Reflection.registerFieldsToFilter(HugeAuthenticator.User.class, "role", "client");
|
||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.server.auth.AuthenticatedUser.class, "name");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.class, "LOG", "hugegraph", "taskScheduler", "authManager", "contexts", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.class, "lambda$0", "access$3", "access$4", "access$2", "access$5", "resetContext", "logUser", "verifyAdminPermission", "verifyStatusPermission", "verifyPermission", "verifySchemaPermission", "verifySchemaPermission", "verifySchemaPermission", "verifySchemaPermission", "verifyNamePermission", "verifyNameExistsPermission", "verifyElemPermission", "verifyElemPermission", "verifyElemPermission", "verifyElemPermission", "verifyResPermission", "verifyResPermission", "verifyUserPermission", "verifyUserPermission", "verifyUserPermission", "getContextString", "access$6", "access$7", "lambda$1", "lambda$2", "lambda$3", "lambda$4", "lambda$5", "lambda$6", "lambda$7", "lambda$8", "lambda$9", "lambda$10", "lambda$11", "lambda$12", "lambda$13", "lambda$14", "lambda$15", "lambda$16", "lambda$17", "lambda$18", "lambda$19", "lambda$20", "lambda$21", "lambda$22", "lambda$23", "lambda$24", "access$8", "access$9", "access$10", "setContext", "getContext");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.AuthManagerProxy.class, "authManager", "this$0");
|
||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.AuthManagerProxy.class, "currentUsername", "updateCreator");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.TaskSchedulerProxy.class, "taskScheduler", "this$0");
|
||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.TaskSchedulerProxy.class, "lambda$0", "lambda$1", "lambda$2", "verifyTaskPermission", "verifyTaskPermission", "verifyTaskPermission", "verifyTaskPermission", "hasTaskPermission");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.GraphTraversalSourceProxy.class, "this$0");
|
||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource.class, "connection", "graph", "strategies", "bytecode");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.TraversalStrategiesProxy.class, "REST_WOEKER", "serialVersionUID", "strategies", "this$0");
|
||||
Reflection.registerMethodsToFilter(HugeGraphAuthProxy.TraversalStrategiesProxy.class, "translate");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.VariablesProxy.class, "variables", "this$0");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.Context.class, "ADMIN", "user");
|
||||
Reflection.registerFieldsToFilter(HugeGraphAuthProxy.ContextTask.class, "runner", "context");
|
||||
Reflection.registerFieldsToFilter(StandardHugeGraph.class, "LOG", "started", "closed", "mode", "variables", "name", "params", "configuration", "schemaEventHub", "graphEventHub", "indexEventHub", "writeRateLimiter", "readRateLimiter", "taskManager", "authManager", "features", "storeProvider", "tx", "ramtable", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(StandardHugeGraph.class, "lambda$0", "access$3", "access$4", "access$2", "access$5", "access$6", "access$7", "waitUntilAllTasksCompleted", "access$8", "loadStoreProvider", "graphTransaction", "schemaTransaction", "openSchemaTransaction", "checkGraphNotClosed", "openSystemTransaction", "openGraphTransaction", "systemTransaction", "access$9", "access$10", "access$11", "access$12", "access$13", "access$14", "access$15", "access$16", "access$17", "access$18", "serializer", "loadSchemaStore", "loadSystemStore", "loadGraphStore", "closeTx", "analyzer", "serverInfoManager", "reloadRamtable", "reloadRamtable", "access$19", "access$20", "access$21");
|
||||
Reflection.registerFieldsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$StandardHugeGraphParams"), "graph", "this$0");
|
||||
Reflection.registerMethodsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$StandardHugeGraphParams"), "access$1", "graph");
|
||||
Reflection.registerFieldsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$TinkerPopTransaction"), "refs", "opened", "transactions", "this$0", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$TinkerPopTransaction"), "lambda$0", "access$3", "access$2", "lambda$1", "graphTransaction", "schemaTransaction", "systemTransaction", "access$1", "setOpened", "doCommit", "verifyOpened", "doRollback", "doClose", "destroyTransaction", "doOpen", "setClosed", "getOrNewTransaction", "access$0", "resetState");
|
||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractThreadLocalTransaction.class, "readWriteConsumerInternal", "closeConsumerInternal", "transactionListeners");
|
||||
Reflection.registerMethodsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractThreadLocalTransaction.class, "doClose", "fireOnCommit", "fireOnRollback", "doReadWrite", "lambda$fireOnRollback$1", "lambda$fireOnCommit$0");
|
||||
Reflection.registerFieldsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractTransaction.class, "g");
|
||||
Reflection.registerMethodsToFilter(org.apache.tinkerpop.gremlin.structure.util.AbstractTransaction.class, "doCommit", "doRollback", "doClose", "doOpen", "fireOnCommit", "fireOnRollback", "doReadWrite");
|
||||
Reflection.registerFieldsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$Txs"), "schemaTx", "systemTx", "graphTx", "openedTime", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(loadClass("org.apache.hugegraph.StandardHugeGraph$Txs"), "access$2", "access$1", "access$0");
|
||||
Reflection.registerFieldsToFilter(GraphTransaction.class, "indexTx", "addedVertices", "removedVertices", "addedEdges", "removedEdges", "addedProps", "removedProps", "updatedVertices", "updatedEdges", "updatedOldestProps", "locksTable", "checkCustomVertexExist", "checkAdjacentVertexExist", "lazyLoadAdjacentVertex", "ignoreInvalidEntry", "commitPartOfAdjacentEdges", "batchSize", "pageSize", "verticesCapacity", "edgesCapacity", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy");
|
||||
Reflection.registerMethodsToFilter(GraphTransaction.class, "lambda$0", "lambda$1", "lambda$2", "lambda$3", "lambda$4", "lambda$5", "lambda$6", "lambda$7", "lambda$8", "lambda$9", "lambda$10", "lambda$11", "lambda$12", "lambda$13", "lambda$14", "lambda$15", "lambda$16", "lambda$17", "lambda$18", "lambda$19", "access$1", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "indexTransaction", "indexTransaction", "beforeWrite", "prepareCommit", "verticesInTxSize", "edgesInTxSize", "checkTxVerticesCapacity", "checkTxEdgesCapacity", "verticesInTxUpdated", "verticesInTxRemoved", "removingEdgeOwner", "prepareDeletions", "prepareDeletions", "prepareUpdates", "prepareAdditions", "checkVertexExistIfCustomizedId", "checkAggregateProperty", "checkAggregateProperty", "checkNonnullProperty", "queryEdgesFromBackend", "commitPartOfEdgeDeletions", "optimizeQueries", "checkVertexLabel", "checkId", "queryVerticesFromBackend", "joinTxVertices", "joinTxEdges", "lockForUpdateProperty", "optimizeQuery", "verifyVerticesConditionQuery", "verifyEdgesConditionQuery", "indexQuery", "joinTxRecords", "propertyUpdated", "parseEntry", "traverseByLabel", "reset", "queryVerticesByIds", "filterUnmatchedRecords", "skipOffsetOrStopLimit", "filterExpiredResultFromFromBackend", "queryEdgesByIds", "matchEdgeSortKeys", "rightResultFromIndexQuery");
|
||||
Reflection.registerFieldsToFilter(IndexableTransaction.class, "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(IndexableTransaction.class, "indexTransaction", "commit2Backend", "reset");
|
||||
Reflection.registerFieldsToFilter(AbstractTransaction.class, "LOG", "ownerThread", "autoCommit", "closed", "committing", "committing2Backend", "graph", "store", "mutation", "serializer", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(AbstractTransaction.class, "beforeWrite", "prepareCommit", "params", "mutation", "commit2Backend", "autoCommit", "beforeRead", "afterWrite", "afterRead", "commitMutation2Backend", "checkOwnerThread", "doAction", "store", "reset");
|
||||
Reflection.registerFieldsToFilter(HugeFactory.class, "LOG", "NAME_REGEX", "graphs");
|
||||
Reflection.registerMethodsToFilter(HugeFactory.class, "lambda$0");
|
||||
Reflection.registerFieldsToFilter(SchemaElement.class, "graph", "id", "name", "userdata", "status");
|
||||
Reflection.registerFieldsToFilter(HugeVertex.class, "EMPTY_SET", "id", "label", "edges", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys");
|
||||
Reflection.registerMethodsToFilter(HugeVertex.class, "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "newProperty", "newProperty", "tx", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys", "checkIdLength", "onUpdateProperty", "ensureFilledProperties", "clone", "clone");
|
||||
Reflection.registerFieldsToFilter(HugeElement.class, "EMPTY_MAP", "MAX_PROPERTIES", "graph", "properties", "expiredTime", "removed", "fresh", "propLoaded", "defaultValueUpdated", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Cardinality");
|
||||
Reflection.registerMethodsToFilter(HugeElement.class, "removed", "addProperty", "newProperty", "tx", "onUpdateProperty", "ensureFilledProperties", "propLoaded", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Cardinality", "getIdValue", "fresh", "updateToDefaultValueIfNone", "copyProperties");
|
||||
Reflection.registerFieldsToFilter(HugeEdge.class, "id", "label", "name", "sourceVertex", "targetVertex", "isOutEdge", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys", "$SWITCH_TABLE$org$apache$tinkerpop$gremlin$structure$Direction");
|
||||
Reflection.registerMethodsToFilter(HugeEdge.class, "checkAdjacentVertexExist", "newProperty", "newProperty", "tx", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$HugeKeys", "onUpdateProperty", "ensureFilledProperties", "$SWITCH_TABLE$org$apache$tinkerpop$gremlin$structure$Direction", "clone", "clone");
|
||||
Reflection.registerFieldsToFilter(HugeProperty.class, "owner", "pkey", "value");
|
||||
Reflection.registerFieldsToFilter(HugeVariables.class, "LOG", "VARIABLES", "VARIABLE_KEY", "VARIABLE_TYPE", "BYTE_VALUE", "BOOLEAN_VALUE", "INTEGER_VALUE", "LONG_VALUE", "FLOAT_VALUE", "DOUBLE_VALUE", "STRING_VALUE", "LIST", "SET", "TYPES", "params", "graph");
|
||||
Reflection.registerMethodsToFilter(HugeVariables.class, "createPropertyKey", "queryAllVariableVertices", "queryVariableVertex", "createVariableVertex", "removeVariableVertex", "extractSingleObject", "setProperty");
|
||||
Reflection.registerFieldsToFilter(SchemaManager.class, "transaction", "graph");
|
||||
Reflection.registerMethodsToFilter(SchemaManager.class, "lambda$0", "lambda$1", "lambda$2", "lambda$3", "checkExists");
|
||||
Reflection.registerFieldsToFilter(PropertyKeyBuilder.class, "id", "name", "dataType", "cardinality", "aggregateType", "checkExist", "userdata", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(PropertyKeyBuilder.class, "lambda$0", "checkStableVars", "checkAggregateType", "hasSameProperties");
|
||||
Reflection.registerFieldsToFilter(AbstractBuilder.class, "transaction", "graph");
|
||||
Reflection.registerMethodsToFilter(AbstractBuilder.class, "rebuildIndex", "graph", "checkSchemaName", "validOrGenerateId", "lockCheckAndCreateSchema", "propertyKeyOrNull", "checkSchemaIdIfRestoringMode", "vertexLabelOrNull", "edgeLabelOrNull", "indexLabelOrNull", "updateSchemaStatus");
|
||||
Reflection.registerFieldsToFilter(VertexLabelBuilder.class, "id", "name", "idStrategy", "properties", "primaryKeys", "nullableKeys", "ttl", "ttlStartTime", "enableLabelIndex", "userdata", "checkExist", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy");
|
||||
Reflection.registerMethodsToFilter(VertexLabelBuilder.class, "lambda$0", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IdStrategy", "checkStableVars", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action", "checkProperties", "checkNullableKeys", "checkIdStrategy", "checkPrimaryKeys", "hasSameProperties", "checkTtl", "checkUserdata", "mapPkId2Name", "mapPkId2Name");
|
||||
Reflection.registerFieldsToFilter(EdgeLabelBuilder.class, "id", "name", "sourceLabel", "targetLabel", "frequency", "properties", "sortKeys", "nullableKeys", "ttl", "ttlStartTime", "enableLabelIndex", "userdata", "checkExist", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action");
|
||||
Reflection.registerMethodsToFilter(EdgeLabelBuilder.class, "lambda$0", "checkStableVars", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$Action", "checkProperties", "checkNullableKeys", "checkSortKeys", "checkRelation", "hasSameProperties", "checkTtl", "checkUserdata", "mapPkId2Name", "mapPkId2Name");
|
||||
Reflection.registerFieldsToFilter(IndexLabelBuilder.class, "id", "name", "baseType", "baseValue", "indexType", "indexFields", "userdata", "checkExist", "rebuild", "$assertionsDisabled", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$DataType", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IndexType");
|
||||
Reflection.registerMethodsToFilter(IndexLabelBuilder.class, "lambda$0", "checkStableVars", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$DataType", "$SWITCH_TABLE$com$baidu$hugegraph$type$define$IndexType", "checkBaseType", "checkIndexType", "checkFields4Range", "loadElement", "checkFields", "checkRepeatIndex", "checkRepeatIndex", "checkRepeatIndex", "checkPrimaryKeyIndex", "checkRepeatRangeIndex", "checkRepeatSearchIndex", "checkRepeatSecondaryIndex", "checkRepeatShardIndex", "checkRepeatUniqueIndex", "removeSubIndex", "hasSubIndex", "allStringIndex", "oneNumericField", "hasSameProperties");
|
||||
Reflection.registerFieldsToFilter(TaskManager.class, "LOG", "SCHEDULE_PERIOD", "THREADS", "MANAGER", "schedulers", "taskExecutor", "taskDbExecutor", "serverInfoDbExecutor", "schedulerExecutor", "contexts", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(TaskManager.class, "lambda$0", "resetContext", "closeTaskTx", "setContext", "instance", "closeSchedulerTx", "notifyNewTask", "scheduleOrExecuteJob", "scheduleOrExecuteJobForGraph");
|
||||
Reflection.registerFieldsToFilter(StandardTaskScheduler.class, "LOG", "graph", "serverManager", "taskExecutor", "taskDbExecutor", "eventListener", "tasks", "taskTx", "NO_LIMIT", "PAGE_SIZE", "QUERY_INTERVAL", "MAX_PENDING_TASKS", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(StandardTaskScheduler.class, "lambda$0", "lambda$1", "lambda$2", "lambda$3", "lambda$4", "lambda$5", "lambda$6", "lambda$7", "tx", "listenChanges", "unlistenChanges", "submitTask", "queryTask", "queryTask", "queryTask", "call", "call", "remove", "sleep", "taskDone", "serverManager", "supportsPaging", "restore", "checkOnMasterNode", "waitUntilTaskCompleted", "scheduleTasks", "executeTasksOnWorker", "cancelTasksOnWorker");
|
||||
Reflection.registerFieldsToFilter(HugeTask.class, "LOG", "DECOMPRESS_RATIO", "scheduler", "callable", "type", "name", "id", "parent", "dependencies", "description", "context", "create", "server", "load", "status", "progress", "update", "retries", "input", "result", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(HugeTask.class, "property", "scheduler", "scheduler", "asArray", "checkPropertySize", "checkPropertySize", "checkDependenciesSuccess", "toOrderSet", "done", "callable", "setException", "set", "result", "status");
|
||||
Reflection.registerFieldsToFilter(TaskCallable.class, "LOG", "ERROR_COMMIT", "ERROR_MESSAGES", "task", "graph", "lastSaveTime", "saveInterval");
|
||||
Reflection.registerMethodsToFilter(TaskCallable.class, "graph", "closeTx", "cancelled", "done", "task", "save", "needSaveWithEx");
|
||||
Reflection.registerFieldsToFilter(TaskCallable.SysTaskCallable.class, "params");
|
||||
Reflection.registerMethodsToFilter(TaskCallable.SysTaskCallable.class, "params", "params");
|
||||
Reflection.registerFieldsToFilter(StandardAuthManager.class, "CACHE_EXPIRE", "graph", "eventListener", "usersCache", "users", "groups", "targets", "belong", "access", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(StandardAuthManager.class, "lambda$0", "listenChanges", "unlistenChanges", "invalidCache", "initSchemaIfNeeded", "rolePermission", "rolePermission", "rolePermission", "cache");
|
||||
Reflection.registerFieldsToFilter(SchemaDefine.class, "graph", "label");
|
||||
Reflection.registerMethodsToFilter(SchemaDefine.class, "schema", "createPropertyKey", "createPropertyKey", "createPropertyKey", "existEdgeLabel", "createRangeIndex", "unhideField", "hideField", "existVertexLabel", "initProperties");
|
||||
Reflection.registerFieldsToFilter(EntityManager.class, "graph", "label", "deser", "NO_LIMIT", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(EntityManager.class, "toList", "graph", "tx", "commitOrRollback", "unhideLabel", "queryById", "queryEntity", "constructVertex", "save", "query");
|
||||
Reflection.registerFieldsToFilter(RelationshipManager.class, "graph", "label", "deser", "NO_LIMIT", "$assertionsDisabled");
|
||||
Reflection.registerMethodsToFilter(RelationshipManager.class, "lambda$0", "toList", "graph", "tx", "commitOrRollback", "unhideLabel", "queryById", "queryRelationship", "newVertex", "save");
|
||||
Reflection.registerFieldsToFilter(CacheManager.class, "LOG", "INSTANCE", "TIMER_TICK_PERIOD", "LOG_TICK_COST_TIME", "caches", "timer");
|
||||
Reflection.registerMethodsToFilter(CacheManager.class, "access$0", "scheduleTimer", "instance");
|
||||
Reflection.registerFieldsToFilter(org.apache.hugegraph.concurrent.LockManager.class, "INSTANCE", "lockGroupMap");
|
||||
Reflection.registerMethodsToFilter(org.apache.hugegraph.concurrent.LockManager.class, "instance");
|
||||
Reflection.registerFieldsToFilter(ServerReporter.class, "instance", "gauges", "counters", "histograms", "meters", "timers");
|
||||
Reflection.registerMethodsToFilter(ServerReporter.class, "instance", "instance");
|
||||
Reflection.registerFieldsToFilter(com.codahale.metrics.ScheduledReporter.class, "LOG", "FACTORY_ID", "registry", "executor", "shutdownExecutorOnStop", "disabledMetricAttributes", "scheduledFuture", "filter", "durationFactor", "durationUnit", "rateFactor", "rateUnit");
|
||||
Reflection.registerMethodsToFilter(com.codahale.metrics.ScheduledReporter.class, "convertDuration", "convertRate", "getRateUnit", "getDurationUnit", "isShutdownExecutorOnStop", "getDisabledMetricAttributes", "calculateRateUnit", "createDefaultExecutor", "lambda$start$0", "start");
|
||||
Reflection.registerFieldsToFilter(JsonSerializer.class, "LBUF_SIZE", "INSTANCE");
|
||||
Reflection.registerMethodsToFilter(JsonSerializer.class, "writeIterator", "instance");
|
||||
Reflection.registerFieldsToFilter(HugeVertexStepStrategy.class, "serialVersionUID", "INSTANCE");
|
||||
Reflection.registerMethodsToFilter(HugeVertexStepStrategy.class, "instance");
|
||||
Reflection.registerFieldsToFilter(HugeGraphStepStrategy.class, "serialVersionUID", "INSTANCE");
|
||||
Reflection.registerMethodsToFilter(HugeGraphStepStrategy.class, "instance");
|
||||
Reflection.registerFieldsToFilter(HugeCountStepStrategy.class, "serialVersionUID", "INSTANCE");
|
||||
Reflection.registerMethodsToFilter(HugeCountStepStrategy.class, "lambda$0", "instance");
|
||||
|
||||
// Enable this line to generate registration statement
|
||||
//genRegisterPrivateActions();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static void genRegisterPrivateActions() {
|
||||
registerPrivateActions(Thread.class);
|
||||
registerPrivateActions(ThreadLocal.class);
|
||||
registerPrivateActions(InheritableThreadLocal.class);
|
||||
|
||||
registerPrivateActions(StandardAuthenticator.class);
|
||||
registerPrivateActions(ConfigAuthenticator.class);
|
||||
registerPrivateActions(HugeFactoryAuthProxy.class);
|
||||
registerPrivateActions(HugeAuthenticator.User.class);
|
||||
|
||||
registerPrivateActions(HugeGraphAuthProxy.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.AuthManagerProxy.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.TaskSchedulerProxy.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.GraphTraversalSourceProxy.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.TraversalStrategiesProxy.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.VariablesProxy.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.Context.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.ContextThreadPoolExecutor.class);
|
||||
registerPrivateActions(HugeGraphAuthProxy.ContextTask.class);
|
||||
|
||||
for (Class<?> clazz : StandardHugeGraph.PROTECT_CLASSES) {
|
||||
registerPrivateActions(clazz);
|
||||
}
|
||||
|
||||
registerPrivateActions(HugeFactory.class);
|
||||
registerPrivateActions(AbstractTransaction.class);
|
||||
|
||||
registerPrivateActions(SchemaElement.class);
|
||||
registerPrivateActions(HugeVertex.class);
|
||||
registerPrivateActions(HugeEdge.class);
|
||||
registerPrivateActions(HugeProperty.class);
|
||||
registerPrivateActions(HugeVariables.class);
|
||||
|
||||
registerPrivateActions(SchemaManager.class);
|
||||
registerPrivateActions(PropertyKeyBuilder.class);
|
||||
registerPrivateActions(VertexLabelBuilder.class);
|
||||
registerPrivateActions(EdgeLabelBuilder.class);
|
||||
registerPrivateActions(IndexLabelBuilder.class);
|
||||
|
||||
registerPrivateActions(TaskManager.class);
|
||||
registerPrivateActions(StandardTaskScheduler.class);
|
||||
registerPrivateActions(HugeTask.class);
|
||||
registerPrivateActions(TaskCallable.class);
|
||||
registerPrivateActions(SysTaskCallable.class);
|
||||
|
||||
registerPrivateActions(StandardAuthManager.class);
|
||||
registerPrivateActions(SchemaDefine.class);
|
||||
registerPrivateActions(EntityManager.class);
|
||||
registerPrivateActions(RelationshipManager.class);
|
||||
|
||||
// Don't shield them because need to access by auth RPC
|
||||
//registerPrivateActions(HugeUser.class);
|
||||
//registerPrivateActions(RolePermission.class);
|
||||
//registerPrivateActions(HugeResource.class);
|
||||
|
||||
registerPrivateActions(CacheManager.class);
|
||||
registerPrivateActions(LockManager.class);
|
||||
registerPrivateActions(ServerReporter.class);
|
||||
registerPrivateActions(JsonSerializer.class);
|
||||
registerPrivateActions(HugeVertexStepStrategy.class);
|
||||
registerPrivateActions(HugeGraphStepStrategy.class);
|
||||
registerPrivateActions(HugeCountStepStrategy.class);
|
||||
}
|
||||
|
||||
private static void registerPrivateActions(Class<?> clazz) {
|
||||
while (clazz != Object.class) {
|
||||
List<String> fields = new ArrayList<>();
|
||||
for (Field field : clazz.getDeclaredFields()) {
|
||||
if (!Modifier.isPublic(field.getModifiers())) {
|
||||
fields.add(field.getName());
|
||||
}
|
||||
}
|
||||
List<String> methods = new ArrayList<>();
|
||||
for (Method method : clazz.getDeclaredMethods()) {
|
||||
if (!Modifier.isPublic(method.getModifiers()) ||
|
||||
PROTECT_METHODS.contains(method.getName())) {
|
||||
methods.add(method.getName());
|
||||
}
|
||||
}
|
||||
registerClass(clazz, fields, methods);
|
||||
clazz = clazz.getSuperclass();
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean registerClass(Class<?> clazz,
|
||||
List<String> fields,
|
||||
List<String> methods) {
|
||||
if (clazz.getName().startsWith("java") ||
|
||||
fields.isEmpty() && methods.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
final String[] array = new String[fields.size()];
|
||||
try {
|
||||
Reflection.registerFieldsToFilter(clazz, fields.toArray(array));
|
||||
Reflection.registerMethodsToFilter(clazz, methods.toArray(array));
|
||||
} catch (IllegalArgumentException e) {
|
||||
if (e.getMessage().contains("Filter already registered: class")) {
|
||||
return false;
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
|
||||
String code;
|
||||
code = String.format("Reflection.registerFieldsToFilter(%s.class, \"%s\");",
|
||||
clazz.getCanonicalName(), String.join("\", \"", fields));
|
||||
if (!fields.isEmpty()) {
|
||||
// CHECKSTYLE:OFF
|
||||
System.out.println(code);
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
||||
code = String.format("Reflection.registerMethodsToFilter(%s.class, \"%s\");",
|
||||
clazz.getCanonicalName(), String.join("\", \"", methods));
|
||||
if (!methods.isEmpty()) {
|
||||
// CHECKSTYLE:OFF
|
||||
System.out.println(code);
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private static Class<?> loadClass(String clazz) {
|
||||
try {
|
||||
return Class.forName(clazz);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new HugeException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,54 +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.metrics;
|
||||
|
||||
import org.apache.tinkerpop.gremlin.server.util.MetricManager;
|
||||
|
||||
import com.codahale.metrics.Counter;
|
||||
import com.codahale.metrics.Gauge;
|
||||
import com.codahale.metrics.Histogram;
|
||||
import com.codahale.metrics.Meter;
|
||||
import com.codahale.metrics.MetricRegistry;
|
||||
import com.codahale.metrics.Timer;
|
||||
|
||||
public class MetricsUtil {
|
||||
|
||||
private static final MetricRegistry REGISTRY =
|
||||
MetricManager.INSTANCE.getRegistry();
|
||||
|
||||
public static <T> Gauge<T> registerGauge(Class<?> clazz, String name,
|
||||
Gauge<T> gauge) {
|
||||
return REGISTRY.register(MetricRegistry.name(clazz, name), gauge);
|
||||
}
|
||||
|
||||
public static Counter registerCounter(Class<?> clazz, String name) {
|
||||
return REGISTRY.counter(MetricRegistry.name(clazz, name));
|
||||
}
|
||||
|
||||
public static Histogram registerHistogram(Class<?> clazz, String name) {
|
||||
return REGISTRY.histogram(MetricRegistry.name(clazz, name));
|
||||
}
|
||||
|
||||
public static Meter registerMeter(Class<?> clazz, String name) {
|
||||
return REGISTRY.meter(MetricRegistry.name(clazz, name));
|
||||
}
|
||||
|
||||
public static Timer registerTimer(Class<?> clazz, String name) {
|
||||
return REGISTRY.timer(MetricRegistry.name(clazz, name));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
# hugegraph-commons
|
||||
|
||||
[](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)
|
||||
|
||||
|
||||
hugegraph-commons is a common module for [HugeGraph](https://github.com/apache/hugegraph) and its peripheral components.
|
||||
hugegraph-commons encapsulates locks, configurations, events, iterators, rest and some
|
||||
numeric or collection util classes to simplify the development of HugeGraph and its components.
|
||||
|
||||
## Components
|
||||
|
||||
- Lock: atomic lock, key lock, lock group and lock manger
|
||||
- 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.
|
||||
- Rest: RESTful client implemented on OkHttp, POST, PUT, GET and DELETE
|
||||
- Util: performance analyzer, version checker, numeric and Collection utils, log and exception utils, etc.
|
||||
- Rpc: rpc component for inner module communication, currently it's based on [Sofa-RPC](https://github.com/sofastack/sofa-rpc)
|
||||
|
||||
You could use import the dependencies in `maven` like this:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hugegraph-common</artifactId>
|
||||
<version>1.2.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
## Learn More
|
||||
|
||||
The [doc page](https://hugegraph.apache.org/docs/) contains more information about hugegraph modules.
|
||||
|
||||
And here are links of other repositories:
|
||||
1. [hugegraph-server](https://github.com/apache/hugegraph) (graph's core component - OLTP server)
|
||||
2. [hugegraph-toolchain](https://github.com/apache/hugegraph-toolchain) (include loader/dashboard/tool/client)
|
||||
3. [hugegraph-computer](https://github.com/apache/hugegraph-computer) (graph processing system - OLAP)
|
||||
4. [hugegraph-website/doc](https://github.com/apache/hugegraph-doc) (include doc & website code)
|
||||
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
- Welcome to contribute to HugeGraph, please see [How to Contribute](https://hugegraph.apache.org/docs/contribution-guidelines/contribute/) 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!
|
||||
|
||||
[](https://github.com/apache/incubator-hugegraph-commons/graphs/contributors)
|
||||
|
||||
## Licence
|
||||
|
||||
Same as HugeGraph, hugegraph-commons are also licensed under [Apache 2.0](./LICENSE) License.
|
||||
|
||||
### Contact Us
|
||||
|
||||
---
|
||||
|
||||
- [GitHub Issues](https://github.com/apache/incubator-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.
|
||||
|
||||
<img src="https://raw.githubusercontent.com/apache/incubator-hugegraph-doc/master/assets/images/wechat.png" alt="QR png" width="350"/>
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
# hugegraph-common
|
||||
|
||||
[](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||
[](https://travis-ci.org/hugegraph/hugegraph-common)
|
||||
[](https://codecov.io/gh/hugegraph/hugegraph-common)
|
||||
[](https://mvnrepository.com/artifact/org.apache.hugegraph/hugegraph-common)
|
||||
|
||||
hugegraph-common is a common module for [HugeGraph](https://github.com/hugegraph/hugegraph) and its peripheral components.
|
||||
hugegraph-common encapsulates locks, configurations, events, iterators, rest and some
|
||||
numeric or collection util classes to simplify the development of HugeGraph and
|
||||
its components.
|
||||
|
||||
## Components
|
||||
|
||||
- Lock: atomic lock, key lock, lock group and lock manger
|
||||
- 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.
|
||||
- Rest: RESTful client implemented on Jersey, POST, PUT, GET and DELETE
|
||||
- Util: Performance analyzer, version checker, numeric and Collection utils, log and exception utils, etc.
|
||||
|
||||
## Licence
|
||||
The same as HugeGraph, hugegraph-common is also licensed under Apache 2.0 License.
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
#!/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.
|
||||
#
|
||||
|
||||
export MAVEN_HOME=/home/scmtools/buildkit/maven/apache-maven-3.3.9/
|
||||
export JAVA_HOME=/home/scmtools/buildkit/java/jdk1.8.0_25/
|
||||
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
|
||||
|
||||
mvn clean test -Dtest=UnitTestSuite
|
||||
|
|
@ -0,0 +1,302 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
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.
|
||||
-->
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.apache.hugegraph</groupId>
|
||||
<artifactId>hugegraph-commons</artifactId>
|
||||
<version>${revision}</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>hugegraph-common</artifactId>
|
||||
<name>${project.artifactId}</name>
|
||||
<url>https://github.com/apache/incubator-hugegraph-commons/tree/master/hugegraph-common</url>
|
||||
<description>
|
||||
hugegraph-common is a common module for HugeGraph and its peripheral components.
|
||||
hugegraph-common encapsulates locks, configurations, events, iterators, rest and some
|
||||
numeric or collection util classes to simplify the development of HugeGraph and its
|
||||
components.
|
||||
</description>
|
||||
|
||||
<properties>
|
||||
<!-- Use parent params -->
|
||||
<lombok.version>1.18.8</lombok.version>
|
||||
<okhttp.version>4.10.0</okhttp.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- Test -->
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>${mockito.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- Logging -->
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-api</artifactId>
|
||||
<version>${log4j2.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>${log4j2.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<version>${log4j2.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Utility -->
|
||||
<dependency>
|
||||
<groupId>org.glassfish</groupId>
|
||||
<artifactId>javax.json</artifactId>
|
||||
<version>${javax.json.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-configuration</groupId>
|
||||
<artifactId>commons-configuration</artifactId>
|
||||
<version>${commons.configuration.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-configuration2</artifactId>
|
||||
<version>${commons.configuration2.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons.lang3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-beanutils</groupId>
|
||||
<artifactId>commons-beanutils</artifactId>
|
||||
<version>${commons.beanutils.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>${commons.io.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-collections</groupId>
|
||||
<artifactId>commons-collections</artifactId>
|
||||
<version>${commons.collections.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-codec</groupId>
|
||||
<artifactId>commons-codec</artifactId>
|
||||
<version>${commons.codec.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>jsr305</artifactId>
|
||||
<groupId>com.google.code.findbugs</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.google.code.findbugs</groupId>
|
||||
<artifactId>jsr305</artifactId>
|
||||
<version>${jsr305.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>joda-time</groupId>
|
||||
<artifactId>joda-time</artifactId>
|
||||
<version>2.10.8</version>
|
||||
</dependency>
|
||||
|
||||
<!-- javassist -->
|
||||
<dependency>
|
||||
<groupId>org.javassist</groupId>
|
||||
<artifactId>javassist</artifactId>
|
||||
<version>${javassist.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- jackson -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.module</groupId>
|
||||
<artifactId>jackson-module-jaxb-annotations</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||
<groupId>jakarta.xml.bind</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.jaxrs</groupId>
|
||||
<artifactId>jackson-jaxrs-base</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.jaxrs</groupId>
|
||||
<artifactId>jackson-jaxrs-json-provider</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.sun.xml.bind</groupId>
|
||||
<artifactId>jaxb-impl</artifactId>
|
||||
<version>${sun.xml.version}</version>
|
||||
<scope>runtime</scope>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||
<groupId>jakarta.xml.bind</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>logging-interceptor</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp-bom</artifactId>
|
||||
<version>${okhttp.version}</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>0.8.2</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>pre-unit-test</id>
|
||||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>post-unit-test</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>report</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${project.parent.build.directory}</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>apache-release</id>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public class AtomicLock {
|
||||
|
||||
private static final Logger LOG = Log.logger(LockManager.class);
|
||||
|
||||
private String name;
|
||||
private AtomicReference<Thread> sign;
|
||||
|
||||
public AtomicLock(String name) {
|
||||
this.name = name;
|
||||
this.sign = new AtomicReference<>();
|
||||
}
|
||||
|
||||
public boolean tryLock() {
|
||||
Thread current = Thread.currentThread();
|
||||
return this.sign.compareAndSet(null, current);
|
||||
}
|
||||
|
||||
public void unlock() {
|
||||
if (this.sign.get() == null) {
|
||||
return;
|
||||
}
|
||||
Thread current = Thread.currentThread();
|
||||
if (!this.sign.compareAndSet(current, null)) {
|
||||
throw new RuntimeException(String.format(
|
||||
"Thread '%s' trying to unlock '%s' " +
|
||||
"which is held by other threads now.",
|
||||
current.getName(), this.name));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean lock(int retries) {
|
||||
// The interval between retries is exponential growth, most wait
|
||||
// interval is 2^(retries-1)s. If retries=0, don't retry.
|
||||
if (retries < 0 || retries > 10) {
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"Locking retry times should be in [0, 10], but got %d",
|
||||
retries));
|
||||
}
|
||||
|
||||
boolean isLocked = false;
|
||||
try {
|
||||
for (int i = 0; !(isLocked = this.tryLock()) && i < retries; i++) {
|
||||
Thread.sleep(1000 * (1L << i));
|
||||
}
|
||||
} catch (InterruptedException ignored) {
|
||||
LOG.info("Thread sleep is interrupted.");
|
||||
}
|
||||
return isLocked;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public void name(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class BarrierEvent {
|
||||
|
||||
private final Lock lock = new ReentrantLock();
|
||||
private final Condition cond = lock.newCondition();
|
||||
private volatile boolean signaled = false;
|
||||
|
||||
/**
|
||||
* Wait forever until the signal is received.
|
||||
* @throws InterruptedException if interrupted.
|
||||
*/
|
||||
public void await() throws InterruptedException {
|
||||
this.lock.lock();
|
||||
try {
|
||||
while (!this.signaled) {
|
||||
this.cond.await();
|
||||
}
|
||||
} finally {
|
||||
this.lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait specified time in milliseconds.
|
||||
* @param timeout: the time in millisecond to wait.
|
||||
* @return true if signal is received, false if time out.
|
||||
* @throws InterruptedException if interrupted.
|
||||
*/
|
||||
public boolean await(long timeout) throws InterruptedException {
|
||||
E.checkArgument(timeout >= 0L,
|
||||
"The time must be >= 0, but got '%d'.",
|
||||
timeout);
|
||||
long deadline = System.currentTimeMillis() + timeout;
|
||||
this.lock.lock();
|
||||
try {
|
||||
while (!this.signaled) {
|
||||
timeout = deadline - System.currentTimeMillis();
|
||||
if (timeout > 0) {
|
||||
this.cond.await(timeout, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
if (System.currentTimeMillis() >= deadline) {
|
||||
return this.signaled;
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
this.lock.unlock();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
this.lock.lock();
|
||||
try {
|
||||
this.signaled = false;
|
||||
} finally {
|
||||
this.lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void signal() {
|
||||
this.lock.lock();
|
||||
try {
|
||||
this.signaled = true;
|
||||
this.cond.signal();
|
||||
} finally {
|
||||
this.lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
public void signalAll() {
|
||||
this.lock.lock();
|
||||
try {
|
||||
this.signaled = true;
|
||||
this.cond.signalAll();
|
||||
} finally {
|
||||
this.lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.util.concurrent.Striped;
|
||||
|
||||
/**
|
||||
* KeyLock provide an interface of segment lock
|
||||
*/
|
||||
public class KeyLock {
|
||||
|
||||
private Striped<Lock> locks;
|
||||
|
||||
public KeyLock() {
|
||||
// The default size is availableProcessors() * 4
|
||||
this(Runtime.getRuntime().availableProcessors() << 2);
|
||||
}
|
||||
|
||||
public KeyLock(int size) {
|
||||
this.locks = Striped.lock(size);
|
||||
}
|
||||
|
||||
private int indexOf(Lock lock) {
|
||||
for (int i = 0; i < this.locks.size(); i++) {
|
||||
if (this.locks.getAt(i) == lock) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock an object
|
||||
* @param key The object to lock
|
||||
* @return The lock(locked) of passed key
|
||||
*/
|
||||
public final Lock lock(Object key) {
|
||||
E.checkArgument(key != null, "Lock key can't be null");
|
||||
Lock lock = this.locks.get(key);
|
||||
lock.lock();
|
||||
return lock;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlock an object
|
||||
* @param key The object to unlock
|
||||
*/
|
||||
public final void unlock(Object key) {
|
||||
E.checkArgument(key != null, "Unlock key can't be null");
|
||||
this.locks.get(key).unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock a list of object with sorted order
|
||||
* @param keys The objects to lock
|
||||
* @return The locks(locked) of keys
|
||||
*/
|
||||
public final List<Lock> lockAll(Object... keys) {
|
||||
E.checkArgument(keys != null && keys.length > 0,
|
||||
"Lock keys can't be null or empty");
|
||||
List<Lock> locks = new ArrayList<>(keys.length);
|
||||
for (Object key : keys) {
|
||||
E.checkArgument(key != null, "Lock key can't be null");
|
||||
Lock lock = this.locks.get(key);
|
||||
locks.add(lock);
|
||||
}
|
||||
locks.sort((a, b) -> {
|
||||
int diff = a.hashCode() - b.hashCode();
|
||||
if (diff == 0 && a != b) {
|
||||
diff = this.indexOf(a) - this.indexOf(b);
|
||||
assert diff != 0;
|
||||
}
|
||||
return diff;
|
||||
});
|
||||
for (Lock lock : locks) {
|
||||
lock.lock();
|
||||
}
|
||||
return Collections.unmodifiableList(locks);
|
||||
}
|
||||
|
||||
/**
|
||||
* Lock two objects with sorted order
|
||||
* NOTE: This is to optimize the performance of lockAll(keys)
|
||||
* @param key1 The first object
|
||||
* @param key2 The second object
|
||||
* @return locks for the two objects
|
||||
*/
|
||||
public List<Lock> lockAll(Object key1, Object key2) {
|
||||
E.checkArgument(key1 != null, "Lock key can't be null");
|
||||
E.checkArgument(key2 != null, "Lock key can't be null");
|
||||
Lock lock1 = this.locks.get(key1);
|
||||
Lock lock2 = this.locks.get(key2);
|
||||
|
||||
int diff = lock1.hashCode() - lock2.hashCode();
|
||||
if (diff == 0 && lock1 != lock2) {
|
||||
diff = this.indexOf(lock1) - this.indexOf(lock2);
|
||||
assert diff != 0;
|
||||
}
|
||||
|
||||
List<Lock> locks = diff > 0 ?
|
||||
ImmutableList.of(lock2, lock1) :
|
||||
ImmutableList.of(lock1, lock2);
|
||||
|
||||
for (Lock lock : locks) {
|
||||
lock.lock();
|
||||
}
|
||||
|
||||
return locks;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlock a list of object
|
||||
* @param locks The locks to unlock
|
||||
*/
|
||||
public final void unlockAll(List<Lock> locks) {
|
||||
E.checkArgument(locks != null, "Unlock locks can't be null");
|
||||
for (int i = locks.size(); i > 0; i--) {
|
||||
assert this.indexOf(locks.get(i - 1)) != -1;
|
||||
locks.get(i - 1).unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
|
||||
public class LockGroup {
|
||||
|
||||
private final String name;
|
||||
private final Map<String, Object> locksMap;
|
||||
|
||||
public LockGroup(String lockGroup) {
|
||||
this.name = lockGroup;
|
||||
this.locksMap = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
public Lock lock(String lockName) {
|
||||
if (!this.locksMap.containsKey(lockName)) {
|
||||
this.locksMap.putIfAbsent(lockName, new ReentrantLock());
|
||||
}
|
||||
return (Lock) this.locksMap.get(lockName);
|
||||
}
|
||||
|
||||
public AtomicLock atomicLock(String lockName) {
|
||||
if (!this.locksMap.containsKey(lockName)) {
|
||||
this.locksMap.putIfAbsent(lockName, new AtomicLock(lockName));
|
||||
}
|
||||
return (AtomicLock) this.locksMap.get(lockName);
|
||||
}
|
||||
|
||||
public ReadWriteLock readWriteLock(String lockName) {
|
||||
if (!this.locksMap.containsKey(lockName)) {
|
||||
this.locksMap.putIfAbsent(lockName, new ReentrantReadWriteLock());
|
||||
}
|
||||
return (ReadWriteLock) this.locksMap.get(lockName);
|
||||
}
|
||||
|
||||
public KeyLock keyLock(String lockName) {
|
||||
if (!this.locksMap.containsKey(lockName)) {
|
||||
this.locksMap.putIfAbsent(lockName, new KeyLock());
|
||||
}
|
||||
return (KeyLock) this.locksMap.get(lockName);
|
||||
}
|
||||
|
||||
public KeyLock keyLock(String lockName, int size) {
|
||||
if (!this.locksMap.containsKey(lockName)) {
|
||||
this.locksMap.putIfAbsent(lockName, new KeyLock(size));
|
||||
}
|
||||
return (KeyLock) this.locksMap.get(lockName);
|
||||
}
|
||||
|
||||
public <K extends Comparable<K>> RowLock<K> rowLock(String lockName) {
|
||||
if (!this.locksMap.containsKey(lockName)) {
|
||||
this.locksMap.putIfAbsent(lockName, new RowLock<>());
|
||||
}
|
||||
Object value = this.locksMap.get(lockName);
|
||||
@SuppressWarnings("unchecked")
|
||||
RowLock<K> lock = (RowLock<K>) value;
|
||||
return lock;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class LockManager {
|
||||
|
||||
private static final LockManager INSTANCE = new LockManager();
|
||||
|
||||
public static LockManager instance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
private Map<String, LockGroup> lockGroupMap;
|
||||
|
||||
private LockManager() {
|
||||
this.lockGroupMap = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
public boolean exists(String group) {
|
||||
return this.lockGroupMap.containsKey(group);
|
||||
}
|
||||
|
||||
public LockGroup create(String group) {
|
||||
if (exists(group)) {
|
||||
throw new RuntimeException(String.format(
|
||||
"LockGroup '%s' already exists", group));
|
||||
}
|
||||
LockGroup lockGroup = new LockGroup(group);
|
||||
LockGroup previous = this.lockGroupMap.putIfAbsent(group, lockGroup);
|
||||
if (previous != null) {
|
||||
return previous;
|
||||
}
|
||||
return lockGroup;
|
||||
}
|
||||
|
||||
public LockGroup get(String group) {
|
||||
LockGroup lockGroup = this.lockGroupMap.get(group);
|
||||
if (lockGroup == null) {
|
||||
throw new RuntimeException(String.format(
|
||||
"LockGroup '%s' does not exists", group));
|
||||
}
|
||||
return lockGroup;
|
||||
}
|
||||
|
||||
public void destroy(String group) {
|
||||
if (this.exists(group)) {
|
||||
this.lockGroupMap.remove(group);
|
||||
} else {
|
||||
throw new RuntimeException(String.format(
|
||||
"LockGroup '%s' does not exists", group));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ScheduledThreadPoolExecutor;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public class PausableScheduledThreadPool extends ScheduledThreadPoolExecutor {
|
||||
|
||||
private static final Logger LOG = Log.logger(PausableScheduledThreadPool.class);
|
||||
|
||||
private volatile boolean paused = false;
|
||||
|
||||
public PausableScheduledThreadPool(int corePoolSize,
|
||||
ThreadFactory factory) {
|
||||
super(corePoolSize, factory);
|
||||
}
|
||||
|
||||
public synchronized void pauseSchedule() {
|
||||
this.paused = true;
|
||||
LOG.info("PausableScheduledThreadPool was paused");
|
||||
}
|
||||
|
||||
public synchronized void resumeSchedule() {
|
||||
this.paused = false;
|
||||
this.notifyAll();
|
||||
LOG.info("PausableScheduledThreadPool was resumed");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void beforeExecute(Thread t, Runnable r) {
|
||||
synchronized (this) {
|
||||
while (this.paused) {
|
||||
try {
|
||||
this.wait();
|
||||
} catch (InterruptedException e) {
|
||||
LOG.warn("PausableScheduledThreadPool was interrupted");
|
||||
}
|
||||
}
|
||||
}
|
||||
super.beforeExecute(t, r);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
if (this.paused) {
|
||||
this.resumeSchedule();
|
||||
}
|
||||
super.shutdown();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Runnable> shutdownNow() {
|
||||
if (this.paused) {
|
||||
this.resumeSchedule();
|
||||
}
|
||||
return super.shutdownNow();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
* 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.concurrent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class RowLock<K extends Comparable<K>> {
|
||||
|
||||
private final Map<K, Lock> locks = new ConcurrentHashMap<>();
|
||||
private final ThreadLocal<Map<K, LocalLock>> localLocks =
|
||||
ThreadLocal.withInitial(HashMap::new);
|
||||
|
||||
public void lock(K key) {
|
||||
E.checkArgument(key != null, "Lock key can't be null");
|
||||
LocalLock localLock = this.localLocks.get().get(key);
|
||||
if (localLock != null) {
|
||||
localLock.lockCount++;
|
||||
} else {
|
||||
Lock current = new ReentrantLock();
|
||||
Lock previous = this.locks.putIfAbsent(key, current);
|
||||
if (previous != null) {
|
||||
current = previous;
|
||||
}
|
||||
current.lock();
|
||||
this.localLocks.get().put(key, new LocalLock(current));
|
||||
}
|
||||
}
|
||||
|
||||
public void unlock(K key) {
|
||||
E.checkArgument(key != null, "Unlock key can't be null");
|
||||
LocalLock localLock = this.localLocks.get().get(key);
|
||||
if (localLock == null) {
|
||||
return;
|
||||
}
|
||||
if (--localLock.lockCount == 0) {
|
||||
this.locks.remove(key, localLock.current);
|
||||
this.localLocks.get().remove(key);
|
||||
localLock.current.unlock();
|
||||
}
|
||||
E.checkState(localLock.lockCount >= 0,
|
||||
"The lock count must be >= 0, but got %s",
|
||||
localLock.lockCount);
|
||||
}
|
||||
|
||||
public void lockAll(Set<K> keys) {
|
||||
E.checkArgument(keys != null && keys.size() > 0,
|
||||
"Lock keys can't be null or empty");
|
||||
List<K> list = new ArrayList<>(keys);
|
||||
Collections.sort(list);
|
||||
for (K key : list) {
|
||||
this.lock(key);
|
||||
}
|
||||
}
|
||||
|
||||
public void unlockAll(Set<K> keys) {
|
||||
E.checkArgument(keys != null && keys.size() > 0,
|
||||
"Unlock keys can't be null or empty");
|
||||
for (K key : keys) {
|
||||
this.unlock(key);
|
||||
}
|
||||
}
|
||||
|
||||
private static class LocalLock {
|
||||
|
||||
private final Lock current;
|
||||
private int lockCount;
|
||||
|
||||
private LocalLock(Lock current) {
|
||||
this.current = current;
|
||||
this.lockCount = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
public class ConfigConvOption<T, R> extends TypedOption<T, R> {
|
||||
|
||||
private final Function<T, R> converter;
|
||||
|
||||
public ConfigConvOption(String name, String desc, Predicate<T> pred,
|
||||
Function<T, R> convert, T value) {
|
||||
this(name, false, desc, pred, convert, value);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ConfigConvOption(String name, boolean required, String desc,
|
||||
Predicate<T> pred, Function<T, R> convert,
|
||||
T value) {
|
||||
super(name, required, desc, pred, (Class<T>) value.getClass(), value);
|
||||
E.checkNotNull(convert, "convert");
|
||||
this.converter = convert;
|
||||
}
|
||||
|
||||
@Override
|
||||
public R convert(T value) {
|
||||
return this.converter.apply(value);
|
||||
}
|
||||
}
|
||||
|
|
@ -15,23 +15,25 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.exception;
|
||||
package org.apache.hugegraph.config;
|
||||
|
||||
import org.apache.hugegraph.HugeException;
|
||||
public class ConfigException extends RuntimeException {
|
||||
|
||||
public class NotFoundException extends HugeException {
|
||||
private static final long serialVersionUID = -8711375282196157058L;
|
||||
|
||||
private static final long serialVersionUID = -5912665926327173032L;
|
||||
|
||||
public NotFoundException(String message) {
|
||||
public ConfigException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public NotFoundException(String message, Object... args) {
|
||||
super(message, args);
|
||||
public ConfigException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public NotFoundException(String message, Throwable cause, Object... args) {
|
||||
super(message, cause, args);
|
||||
public ConfigException(String message, Object... args) {
|
||||
super(String.format(message, args));
|
||||
}
|
||||
|
||||
public ConfigException(String message, Throwable cause, Object... args) {
|
||||
super(String.format(message, args), cause);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
public class ConfigListConvOption<T, R> extends TypedOption<List<T>, List<R>> {
|
||||
|
||||
private final Class<T> elemClass;
|
||||
private final Function<T, R> converter;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ConfigListConvOption(String name, String desc,
|
||||
Predicate<List<T>> pred, Function<T, R> convert,
|
||||
T... values) {
|
||||
this(name, false, desc, pred, convert, null, Arrays.asList(values));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ConfigListConvOption(String name, boolean required, String desc,
|
||||
Predicate<List<T>> pred, Function<T, R> convert,
|
||||
Class<T> clazz, List<T> values) {
|
||||
super(name, required, desc, pred,
|
||||
(Class<List<T>>) values.getClass(), values);
|
||||
E.checkNotNull(convert, "convert");
|
||||
if (clazz == null && values.size() > 0) {
|
||||
clazz = (Class<T>) values.get(0).getClass();
|
||||
}
|
||||
E.checkArgumentNotNull(clazz, "Element class can't be null");
|
||||
this.elemClass = clazz;
|
||||
this.converter = convert;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean forList() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<T> parse(String value) {
|
||||
return ConfigListOption.convert(value, part -> {
|
||||
return this.parse(part, this.elemClass);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<R> convert(List<T> values) {
|
||||
List<R> results = new ArrayList<>(values.size());
|
||||
for (T value : values) {
|
||||
results.add(this.converter.apply(value));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.config;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
public class ConfigListOption<T> extends ConfigOption<List<T>> {
|
||||
|
||||
private final Class<T> elemClass;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ConfigListOption(String name, String desc,
|
||||
Predicate<List<T>> pred, T... values) {
|
||||
this(name, false, desc, pred, null, Arrays.asList(values));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ConfigListOption(String name, boolean required, String desc,
|
||||
Predicate<List<T>> pred, Class<T> clazz,
|
||||
List<T> values) {
|
||||
super(name, required, desc, pred,
|
||||
(Class<List<T>>) values.getClass(), values);
|
||||
if (clazz == null && values.size() > 0) {
|
||||
clazz = (Class<T>) values.get(0).getClass();
|
||||
}
|
||||
E.checkArgumentNotNull(clazz, "Element class can't be null");
|
||||
this.elemClass = clazz;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean forList() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<T> parse(String value) {
|
||||
return convert(value, part -> this.parse(part, this.elemClass));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> List<T> convert(Object value, Function<String, ?> conv) {
|
||||
if (value instanceof List) {
|
||||
return (List<T>) value;
|
||||
}
|
||||
// If target data type is List, parse it as a list
|
||||
String str = (String) value;
|
||||
if (str.startsWith("[") && str.endsWith("]")) {
|
||||
str = str.substring(1, str.length() - 1);
|
||||
}
|
||||
|
||||
String[] parts = str.split(",");
|
||||
List<T> results = new ArrayList<>(parts.length);
|
||||
for (String part : parts) {
|
||||
results.add((T) conv.apply(part.trim()));
|
||||
}
|
||||
return results;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
public class ConfigOption<T> extends TypedOption<T, T> {
|
||||
|
||||
public ConfigOption(String name, String desc, T value) {
|
||||
this(name, desc, null, value);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ConfigOption(String name, String desc, Predicate<T> pred, T value) {
|
||||
this(name, false, desc, pred, (Class<T>) value.getClass(), value);
|
||||
}
|
||||
|
||||
public ConfigOption(String name, boolean required, String desc,
|
||||
Predicate<T> pred, Class<T> type, T value) {
|
||||
super(name, required, desc, pred, type, value);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,216 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.apache.commons.configuration2.Configuration;
|
||||
import org.apache.commons.configuration2.FileBasedConfiguration;
|
||||
import org.apache.commons.configuration2.PropertiesConfiguration;
|
||||
import org.apache.commons.configuration2.YAMLConfiguration;
|
||||
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
|
||||
import org.apache.commons.configuration2.builder.fluent.Configurations;
|
||||
import org.apache.commons.configuration2.builder.fluent.Parameters;
|
||||
import org.apache.commons.configuration2.ex.ConfigurationException;
|
||||
import org.apache.commons.configuration2.io.FileHandler;
|
||||
import org.apache.commons.io.FilenameUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.hugegraph.util.E;
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public class HugeConfig extends PropertiesConfiguration {
|
||||
|
||||
private static final Logger LOG = Log.logger(HugeConfig.class);
|
||||
|
||||
private String configPath;
|
||||
|
||||
public HugeConfig(Configuration config) {
|
||||
loadConfig(config);
|
||||
this.configPath = null;
|
||||
}
|
||||
|
||||
public HugeConfig(String configFile) {
|
||||
loadConfig(loadConfigFile(configFile));
|
||||
this.configPath = configFile;
|
||||
}
|
||||
|
||||
public HugeConfig(Map<String, Object> propertyMap) {
|
||||
if (propertyMap == null) {
|
||||
throw new ConfigException("The property map is null");
|
||||
}
|
||||
|
||||
for (Map.Entry<String, Object> kv : propertyMap.entrySet()) {
|
||||
this.addProperty(kv.getKey(), kv.getValue());
|
||||
}
|
||||
this.checkRequiredOptions();
|
||||
}
|
||||
|
||||
private void loadConfig(Configuration config) {
|
||||
if (config == null) {
|
||||
throw new ConfigException("The config object is null");
|
||||
}
|
||||
this.setLayoutIfNeeded(config);
|
||||
|
||||
this.append(config);
|
||||
this.checkRequiredOptions();
|
||||
}
|
||||
|
||||
private void setLayoutIfNeeded(Configuration conf) {
|
||||
if (!(conf instanceof PropertiesConfiguration)) {
|
||||
return;
|
||||
}
|
||||
PropertiesConfiguration propConf = (PropertiesConfiguration) conf;
|
||||
this.setLayout(propConf.getLayout());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T, R> R get(TypedOption<T, R> option) {
|
||||
Object value = this.getProperty(option.name());
|
||||
if (value == null) {
|
||||
return option.defaultValue();
|
||||
}
|
||||
return (R) value;
|
||||
}
|
||||
|
||||
public Map<String, String> getMap(ConfigListOption<String> option) {
|
||||
List<String> values = this.get(option);
|
||||
Map<String, String> result = new HashMap<>();
|
||||
for (String value : values) {
|
||||
String[] pair = value.split(":", 2);
|
||||
E.checkState(pair.length == 2,
|
||||
"Invalid option format for '%s': %s(expect KEY:VALUE)",
|
||||
option.name(), value);
|
||||
result.put(pair[0].trim(), pair[1].trim());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPropertyDirect(String key, Object value) {
|
||||
TypedOption<?, ?> option = OptionSpace.get(key);
|
||||
if (option == null) {
|
||||
LOG.warn("The config option '{}' is redundant, " +
|
||||
"please ensure it has been registered", key);
|
||||
} else {
|
||||
// The input value is String(parsed by PropertiesConfiguration)
|
||||
value = this.validateOption(key, value);
|
||||
}
|
||||
if (this.containsKey(key) && value instanceof List) {
|
||||
for (Object item : (List<?>) value) {
|
||||
super.addPropertyDirect(key, item);
|
||||
}
|
||||
} else {
|
||||
super.addPropertyDirect(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addPropertyInternal(String key, Object value) {
|
||||
this.addPropertyDirect(key, value);
|
||||
}
|
||||
|
||||
private Object validateOption(String key, Object value) {
|
||||
TypedOption<?, ?> option = OptionSpace.get(key);
|
||||
|
||||
if (value instanceof String) {
|
||||
return option.parseConvert((String) value);
|
||||
}
|
||||
|
||||
Class<?> dataType = option.dataType();
|
||||
if (dataType.isInstance(value)) {
|
||||
return value;
|
||||
}
|
||||
|
||||
throw new IllegalArgumentException(
|
||||
String.format("Invalid value for key '%s': '%s'", key, value));
|
||||
}
|
||||
|
||||
private void checkRequiredOptions() {
|
||||
// TODO: Check required options must be contained in this map
|
||||
}
|
||||
|
||||
public void save(File copiedFile) throws ConfigurationException {
|
||||
FileHandler fileHandler = new FileHandler(this);
|
||||
fileHandler.save(copiedFile);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public File file() {
|
||||
if (StringUtils.isEmpty(this.configPath)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new File(this.configPath);
|
||||
}
|
||||
|
||||
public void file(String path) {
|
||||
this.configPath = path;
|
||||
}
|
||||
|
||||
private static Configuration loadConfigFile(String path) {
|
||||
E.checkNotNull(path, "config path");
|
||||
E.checkArgument(!path.isEmpty(),
|
||||
"The config path can't be empty");
|
||||
|
||||
File file = new File(path);
|
||||
return loadConfigFile(file);
|
||||
}
|
||||
|
||||
private static Configuration loadConfigFile(File configFile) {
|
||||
E.checkArgument(configFile.exists() &&
|
||||
configFile.isFile() &&
|
||||
configFile.canRead(),
|
||||
"Please specify a proper config file rather than: '%s'",
|
||||
configFile.toString());
|
||||
|
||||
try {
|
||||
String fileName = configFile.getName();
|
||||
String fileExtension = FilenameUtils.getExtension(fileName);
|
||||
|
||||
Configuration config;
|
||||
Configurations configs = new Configurations();
|
||||
|
||||
switch (fileExtension) {
|
||||
case "yml":
|
||||
case "yaml":
|
||||
Parameters params = new Parameters();
|
||||
FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
|
||||
new FileBasedConfigurationBuilder(YAMLConfiguration.class)
|
||||
.configure(params.fileBased().setFile(configFile));
|
||||
config = builder.getConfiguration();
|
||||
break;
|
||||
case "xml":
|
||||
config = configs.xml(configFile);
|
||||
break;
|
||||
default:
|
||||
config = configs.properties(configFile);
|
||||
break;
|
||||
}
|
||||
return config;
|
||||
} catch (ConfigurationException e) {
|
||||
throw new ConfigException("Unable to load config: '%s'",
|
||||
e, configFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.lang.reflect.Array;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
|
||||
public final class OptionChecker {
|
||||
|
||||
public static <O> Predicate<O> disallowEmpty() {
|
||||
return o -> {
|
||||
if (o == null) {
|
||||
return false;
|
||||
}
|
||||
if (o instanceof String) {
|
||||
return StringUtils.isNotBlank((String) o);
|
||||
}
|
||||
if (o.getClass().isArray() && (Array.getLength(o) == 0)) {
|
||||
return false;
|
||||
}
|
||||
return !(o instanceof Iterable) || ((Iterable<?>) o).iterator().hasNext();
|
||||
};
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <O> Predicate<O> allowValues(O... values) {
|
||||
return o -> o != null && Arrays.asList(values).contains(o);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <O> Predicate<List<O>> inValues(O... values) {
|
||||
return o -> o != null && new HashSet<>(Arrays.asList(values)).containsAll(o);
|
||||
}
|
||||
|
||||
public static <N extends Number> Predicate<N> positiveInt() {
|
||||
return number -> number != null && number.longValue() > 0;
|
||||
}
|
||||
|
||||
public static <N extends Number> Predicate<N> nonNegativeInt() {
|
||||
return number -> number != null && number.longValue() >= 0;
|
||||
}
|
||||
|
||||
public static <N extends Number> Predicate<N> rangeInt(N min, N max) {
|
||||
return number -> {
|
||||
if (number == null) {
|
||||
return false;
|
||||
}
|
||||
long value = number.longValue();
|
||||
return value >= min.longValue() && value <= max.longValue();
|
||||
};
|
||||
}
|
||||
|
||||
public static <N extends Number> Predicate<N> rangeDouble(N min, N max) {
|
||||
return number -> {
|
||||
if (number == null) {
|
||||
return false;
|
||||
}
|
||||
double value = number.doubleValue();
|
||||
return value >= min.doubleValue() && value <= max.doubleValue();
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public class OptionHolder {
|
||||
|
||||
private static final Logger LOG = Log.logger(HugeConfig.class);
|
||||
|
||||
protected Map<String, TypedOption<?, ?>> options;
|
||||
|
||||
public OptionHolder() {
|
||||
this.options = new HashMap<>();
|
||||
}
|
||||
|
||||
protected void registerOptions() {
|
||||
for (Field field : this.getClass().getFields()) {
|
||||
if (!TypedOption.class.isAssignableFrom(field.getType())) {
|
||||
// Skip if not option
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
TypedOption<?, ?> option = (TypedOption<?, ?>) field.get(this);
|
||||
// Fields of subclass first, don't overwrite by superclass
|
||||
this.options.putIfAbsent(option.name(), option);
|
||||
} catch (Exception e) {
|
||||
LOG.error("Failed to register option: {}", field, e);
|
||||
throw new ConfigException(
|
||||
"Failed to register option: %s", field);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, TypedOption<?, ?>> options() {
|
||||
return Collections.unmodifiableMap(this.options);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
public final class OptionSpace {
|
||||
|
||||
private static final Logger LOG = Log.logger(OptionSpace.class);
|
||||
|
||||
private static final Map<String, Class<? extends OptionHolder>> HOLDERS;
|
||||
private static final Map<String, TypedOption<?, ?>> OPTIONS;
|
||||
private static final String INSTANCE_METHOD = "instance";
|
||||
|
||||
static {
|
||||
HOLDERS = new ConcurrentHashMap<>();
|
||||
OPTIONS = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
public static void register(String module, String holder) {
|
||||
ClassLoader classLoader = OptionSpace.class.getClassLoader();
|
||||
Class<?> clazz;
|
||||
try {
|
||||
clazz = classLoader.loadClass(holder);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new ConfigException(
|
||||
"Failed to load class of option holder '%s'", e, holder);
|
||||
}
|
||||
|
||||
// Check subclass
|
||||
if (!OptionHolder.class.isAssignableFrom(clazz)) {
|
||||
throw new ConfigException(
|
||||
"Class '%s' is not a subclass of OptionHolder", holder);
|
||||
}
|
||||
|
||||
OptionHolder instance = null;
|
||||
Exception exception = null;
|
||||
try {
|
||||
Method method = clazz.getMethod(INSTANCE_METHOD);
|
||||
if (!Modifier.isStatic(method.getModifiers())) {
|
||||
throw new NoSuchMethodException(INSTANCE_METHOD);
|
||||
}
|
||||
instance = (OptionHolder) method.invoke(null);
|
||||
if (instance == null) {
|
||||
exception = new ConfigException(
|
||||
"Returned null from %s() method",
|
||||
INSTANCE_METHOD);
|
||||
}
|
||||
} catch (NoSuchMethodException e) {
|
||||
LOG.warn("Class {} does not has static method {}.",
|
||||
holder, INSTANCE_METHOD);
|
||||
exception = e;
|
||||
} catch (InvocationTargetException e) {
|
||||
LOG.warn("Can't call static method {} from class {}.",
|
||||
INSTANCE_METHOD, holder);
|
||||
exception = e;
|
||||
} catch (IllegalAccessException e) {
|
||||
LOG.warn("Illegal access while calling method {} from class {}.",
|
||||
INSTANCE_METHOD, holder);
|
||||
exception = e;
|
||||
}
|
||||
|
||||
if (exception != null) {
|
||||
throw new ConfigException("Failed to instantiate option holder: %s",
|
||||
exception, holder);
|
||||
}
|
||||
|
||||
register(module, instance);
|
||||
}
|
||||
|
||||
public static void register(String module, OptionHolder holder) {
|
||||
// Check exists
|
||||
if (HOLDERS.containsKey(module)) {
|
||||
LOG.warn("Already registered option holder: {} ({})",
|
||||
module, HOLDERS.get(module));
|
||||
}
|
||||
E.checkArgumentNotNull(holder, "OptionHolder can't be null");
|
||||
HOLDERS.put(module, holder.getClass());
|
||||
OPTIONS.putAll(holder.options());
|
||||
LOG.debug("Registered options for OptionHolder: {}",
|
||||
holder.getClass().getSimpleName());
|
||||
}
|
||||
|
||||
public static Set<String> keys() {
|
||||
return Collections.unmodifiableSet(OPTIONS.keySet());
|
||||
}
|
||||
|
||||
public static boolean containKey(String key) {
|
||||
return OPTIONS.containsKey(key);
|
||||
}
|
||||
|
||||
public static TypedOption<?, ?> get(String key) {
|
||||
return OPTIONS.get(key);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,194 @@
|
|||
/*
|
||||
* 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.config;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.apache.commons.configuration.PropertyConverter;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
public class TypedOption<T, R> {
|
||||
|
||||
private static final Logger LOG = Log.logger(TypedOption.class);
|
||||
|
||||
private static final Set<Class<?>> ACCEPTED_DATA_TYPES;
|
||||
private static final String ACCEPTED_DATA_TYPES_STRING;
|
||||
|
||||
static {
|
||||
ACCEPTED_DATA_TYPES = ImmutableSet.of(
|
||||
Boolean.class,
|
||||
Short.class,
|
||||
Integer.class,
|
||||
Byte.class,
|
||||
Long.class,
|
||||
Float.class,
|
||||
Double.class,
|
||||
String.class,
|
||||
String[].class,
|
||||
Class.class,
|
||||
List.class
|
||||
);
|
||||
|
||||
ACCEPTED_DATA_TYPES_STRING = Joiner.on(", ").join(ACCEPTED_DATA_TYPES);
|
||||
}
|
||||
|
||||
private final String name;
|
||||
private final String desc;
|
||||
private final boolean required;
|
||||
private final Class<T> dataType;
|
||||
private final T defaultValue;
|
||||
private final Predicate<T> checkFunc;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public TypedOption(String name, boolean required, String desc,
|
||||
Predicate<T> pred, Class<T> type, T value) {
|
||||
E.checkNotNull(name, "name");
|
||||
E.checkNotNull(type, "dataType");
|
||||
|
||||
this.name = name;
|
||||
this.dataType = (Class<T>) this.checkAndAssignDataType(type);
|
||||
this.defaultValue = value;
|
||||
this.required = required;
|
||||
this.desc = desc;
|
||||
this.checkFunc = pred;
|
||||
|
||||
this.check(this.defaultValue);
|
||||
}
|
||||
|
||||
private Class<?> checkAndAssignDataType(Class<T> dataType) {
|
||||
for (Class<?> clazz : ACCEPTED_DATA_TYPES) {
|
||||
if (clazz.isAssignableFrom(dataType)) {
|
||||
return clazz;
|
||||
}
|
||||
}
|
||||
|
||||
String msg = String.format("Input data type '%s' doesn't belong " +
|
||||
"to acceptable type set: [%s]",
|
||||
dataType, ACCEPTED_DATA_TYPES_STRING);
|
||||
throw new IllegalArgumentException(msg);
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public Class<T> dataType() {
|
||||
return this.dataType;
|
||||
}
|
||||
|
||||
public String desc() {
|
||||
return this.desc;
|
||||
}
|
||||
|
||||
public boolean required() {
|
||||
return this.required;
|
||||
}
|
||||
|
||||
public R defaultValue() {
|
||||
return this.convert(this.defaultValue);
|
||||
}
|
||||
|
||||
public R parseConvert(String value) {
|
||||
T parsed = this.parse(value);
|
||||
this.check(parsed);
|
||||
return this.convert(parsed);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected T parse(String value) {
|
||||
return (T) this.parse(value, this.dataType);
|
||||
}
|
||||
|
||||
protected Object parse(String value, Class<?> dataType) {
|
||||
if (dataType.equals(String.class)) {
|
||||
return value;
|
||||
} else if (dataType.equals(Class.class)) {
|
||||
try {
|
||||
if (value.startsWith("class")) {
|
||||
value = value.substring("class".length()).trim();
|
||||
}
|
||||
return Class.forName(value);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw new ConfigException(
|
||||
"Failed to parse Class from String '%s'", e, value);
|
||||
}
|
||||
} else if (List.class.isAssignableFrom(dataType)) {
|
||||
E.checkState(this.forList(),
|
||||
"List option can't be registered with class %s",
|
||||
this.getClass().getSimpleName());
|
||||
}
|
||||
|
||||
// Use PropertyConverter method `toXXX` convert value
|
||||
String methodTo = "to" + dataType.getSimpleName();
|
||||
try {
|
||||
Method method = PropertyConverter.class.getMethod(
|
||||
methodTo, Object.class);
|
||||
return method.invoke(null, value);
|
||||
} catch (ReflectiveOperationException e) {
|
||||
LOG.error("Invalid type of value '{}' for option '{}'",
|
||||
value, this.name, e);
|
||||
throw new ConfigException(
|
||||
"Invalid type of value '%s' for option '%s', " +
|
||||
"expect '%s' type",
|
||||
value, this.name, dataType.getSimpleName());
|
||||
}
|
||||
}
|
||||
|
||||
protected void check(Object value) {
|
||||
E.checkNotNull(value, "value", this.name);
|
||||
if (!this.dataType.isInstance(value)) {
|
||||
throw new ConfigException(
|
||||
"Invalid type of value '%s' for option '%s', " +
|
||||
"expect type %s but got %s", value, this.name,
|
||||
this.dataType.getSimpleName(),
|
||||
value.getClass().getSimpleName());
|
||||
}
|
||||
|
||||
if (this.checkFunc != null) {
|
||||
@SuppressWarnings("unchecked")
|
||||
T result = (T) value;
|
||||
if (!this.checkFunc.apply(result)) {
|
||||
throw new ConfigException("Invalid option value for '%s': %s",
|
||||
this.name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected R convert(T value) {
|
||||
return (R) value;
|
||||
}
|
||||
|
||||
protected boolean forList() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("[%s]%s=%s", this.dataType.getSimpleName(),
|
||||
this.name, this.defaultValue);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* 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.date;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.joda.time.DateTimeZone;
|
||||
import org.joda.time.format.DateTimeFormat;
|
||||
import org.joda.time.format.DateTimeFormatter;
|
||||
|
||||
/**
|
||||
* The SafeDateFormat actually is a proxy for joda DateTimeFormatter
|
||||
*/
|
||||
public class SafeDateFormat {
|
||||
|
||||
private static final int ONE_HOUR_MS = 3600 * 1000;
|
||||
|
||||
private final String pattern;
|
||||
private DateTimeFormatter formatter;
|
||||
|
||||
public SafeDateFormat(String pattern) {
|
||||
this.pattern = pattern;
|
||||
this.formatter = DateTimeFormat.forPattern(pattern);
|
||||
}
|
||||
|
||||
public synchronized void setTimeZone(String zoneId) {
|
||||
int hoursOffset = TimeZone.getTimeZone(zoneId).getRawOffset() /
|
||||
ONE_HOUR_MS;
|
||||
DateTimeZone zone = DateTimeZone.forOffsetHours(hoursOffset);
|
||||
this.formatter = this.formatter.withZone(zone);
|
||||
}
|
||||
|
||||
public TimeZone getTimeZone() {
|
||||
return this.formatter.getZone().toTimeZone();
|
||||
}
|
||||
|
||||
public Date parse(String source) {
|
||||
return this.formatter.parseDateTime(source).toDate();
|
||||
}
|
||||
|
||||
public String format(Date date) {
|
||||
return this.formatter.print(date.getTime());
|
||||
}
|
||||
|
||||
public Object toPattern() {
|
||||
return this.pattern;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.event;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class Event extends java.util.EventObject {
|
||||
|
||||
private static final long serialVersionUID = 1625973849208342813L;
|
||||
|
||||
private String name;
|
||||
private Object[] args;
|
||||
|
||||
public Event(Object source, String event) {
|
||||
this(source, event, Collections.emptyList().toArray());
|
||||
}
|
||||
|
||||
public Event(Object source, String event, Object... args) {
|
||||
super(source);
|
||||
this.name = event;
|
||||
this.args = args;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public Object[] args() {
|
||||
return this.args;
|
||||
}
|
||||
|
||||
public void checkArgs(Class<?>... classes) throws IllegalArgumentException {
|
||||
E.checkArgument(this.args.length == classes.length,
|
||||
"The args count of event '%s' should be %s(actual %s)",
|
||||
this.name, classes.length, this.args.length);
|
||||
int i = 0;
|
||||
for (Class<?> c : classes) {
|
||||
Object arg = this.args[i++];
|
||||
if (arg == null) {
|
||||
continue;
|
||||
}
|
||||
E.checkArgument(c.isAssignableFrom(arg.getClass()),
|
||||
"The arg '%s'(%s) can't match %s",
|
||||
arg, arg.getClass(), c);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("Event{name='%s', args=%s}",
|
||||
this.name, Arrays.asList(this.args));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
* 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.event;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import org.apache.hugegraph.util.ExecutorUtil;
|
||||
import org.apache.hugegraph.util.Log;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import org.apache.hugegraph.iterator.ExtendableIterator;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
public class EventHub {
|
||||
|
||||
private static final Logger LOG = Log.logger(EventHub.class);
|
||||
|
||||
public static final String EVENT_WORKER = "event-worker-%d";
|
||||
public static final String ANY_EVENT = "*";
|
||||
|
||||
private static final List<EventListener> EMPTY = ImmutableList.of();
|
||||
|
||||
// Event executor
|
||||
private static ExecutorService executor = null;
|
||||
|
||||
private String name;
|
||||
private Map<String, List<EventListener>> listeners;
|
||||
|
||||
public EventHub() {
|
||||
this("hub");
|
||||
}
|
||||
|
||||
public EventHub(String name) {
|
||||
this(name, 1, Runtime.getRuntime().availableProcessors() << 2);
|
||||
}
|
||||
|
||||
public EventHub(String name, int threadSize) {
|
||||
LOG.debug("Create new EventHub {},threadSize {}", name, threadSize);
|
||||
this.name = name;
|
||||
this.listeners = new ConcurrentHashMap<>();
|
||||
EventHub.init(threadSize);
|
||||
}
|
||||
|
||||
public EventHub(String name, int corePoolSize, int maximumPoolSize) {
|
||||
LOG.debug("Create new EventHub {},corePoolSize {}, maximumPoolSize {}", name, corePoolSize, maximumPoolSize);
|
||||
this.name = name;
|
||||
this.listeners = new ConcurrentHashMap<>();
|
||||
EventHub.init(corePoolSize, maximumPoolSize);
|
||||
}
|
||||
|
||||
public static synchronized void init(int poolSize) {
|
||||
if (executor != null) {
|
||||
return;
|
||||
}
|
||||
LOG.debug("Init pool(size {}) for EventHub", poolSize);
|
||||
executor = ExecutorUtil.newFixedThreadPool(poolSize, EVENT_WORKER);
|
||||
}
|
||||
|
||||
public static synchronized void init(int corePoolSize, int maximumPoolSize) {
|
||||
LOG.debug("Init corePoolSize {}, maximumPoolSize {} for EventHub", corePoolSize, maximumPoolSize);
|
||||
if (executor != null) {
|
||||
LOG.debug("EventHub executor already initialized");
|
||||
return;
|
||||
}
|
||||
executor = ExecutorUtil.newDynamicThreadExecutor(EVENT_WORKER, corePoolSize, maximumPoolSize);
|
||||
}
|
||||
|
||||
public static synchronized boolean destroy(long timeout)
|
||||
throws InterruptedException {
|
||||
E.checkState(executor != null, "EventHub has not been initialized");
|
||||
LOG.debug("Destroy pool for EventHub");
|
||||
executor.shutdown();
|
||||
return executor.awaitTermination(timeout, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
private static ExecutorService executor() {
|
||||
ExecutorService e = executor;
|
||||
E.checkState(e != null, "The event executor has been destroyed");
|
||||
return e;
|
||||
}
|
||||
|
||||
public String name() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public boolean containsListener(String event) {
|
||||
List<EventListener> ls = this.listeners.get(event);
|
||||
return ls != null && ls.size() > 0;
|
||||
}
|
||||
|
||||
public List<EventListener> listeners(String event) {
|
||||
List<EventListener> ls = this.listeners.get(event);
|
||||
return ls == null ? EMPTY : Collections.unmodifiableList(ls);
|
||||
}
|
||||
|
||||
public void listen(String event, EventListener listener) {
|
||||
E.checkNotNull(event, "event");
|
||||
E.checkNotNull(listener, "event listener");
|
||||
|
||||
if (!this.listeners.containsKey(event)) {
|
||||
this.listeners.putIfAbsent(event, new CopyOnWriteArrayList<>());
|
||||
}
|
||||
List<EventListener> ls = this.listeners.get(event);
|
||||
assert ls != null : this.listeners;
|
||||
ls.add(listener);
|
||||
}
|
||||
|
||||
public List<EventListener> unlisten(String event) {
|
||||
List<EventListener> ls = this.listeners.remove(event);
|
||||
return ls == null ? EMPTY : Collections.unmodifiableList(ls);
|
||||
}
|
||||
|
||||
public int unlisten(String event, EventListener listener) {
|
||||
List<EventListener> ls = this.listeners.get(event);
|
||||
if (ls == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int count = 0;
|
||||
while (ls.remove(listener)) {
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
public Future<Integer> notify(String event, @Nullable Object... args) {
|
||||
@SuppressWarnings("resource")
|
||||
ExtendableIterator<EventListener> all = new ExtendableIterator<>();
|
||||
|
||||
List<EventListener> ls = this.listeners.get(event);
|
||||
if (ls != null && !ls.isEmpty()) {
|
||||
all.extend(ls.iterator());
|
||||
}
|
||||
List<EventListener> lsAny = this.listeners.get(ANY_EVENT);
|
||||
if (lsAny != null && !lsAny.isEmpty()) {
|
||||
all.extend(lsAny.iterator());
|
||||
}
|
||||
|
||||
if (!all.hasNext()) {
|
||||
return CompletableFuture.completedFuture(0);
|
||||
}
|
||||
|
||||
Event ev = new Event(this, event, args);
|
||||
|
||||
// The submit will catch params: `all`(Listeners) and `ev`(Event)
|
||||
return executor().submit(() -> {
|
||||
int count = 0;
|
||||
// Notify all listeners, and ignore the results
|
||||
while (all.hasNext()) {
|
||||
try {
|
||||
all.next().event(ev);
|
||||
count++;
|
||||
} catch (Throwable e) {
|
||||
LOG.warn("Failed to handle event: {}", ev, e);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
});
|
||||
}
|
||||
|
||||
public Object call(String event, @Nullable Object... args) {
|
||||
List<EventListener> ls = this.listeners.get(event);
|
||||
if (ls == null) {
|
||||
throw new RuntimeException("Not found listener for: " + event);
|
||||
} else if (ls.size() != 1) {
|
||||
throw new RuntimeException("Too many listeners for: " + event);
|
||||
}
|
||||
EventListener listener = ls.get(0);
|
||||
return listener.event(new Event(this, event, args));
|
||||
}
|
||||
}
|
||||
|
|
@ -15,13 +15,13 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.auth;
|
||||
package org.apache.hugegraph.event;
|
||||
|
||||
public interface AuthConstant {
|
||||
|
||||
/*
|
||||
* Fields in token
|
||||
public interface EventListener extends java.util.EventListener {
|
||||
/**
|
||||
* The event callback
|
||||
* @param event object
|
||||
* @return event result
|
||||
*/
|
||||
String TOKEN_USER_NAME = "user_name";
|
||||
String TOKEN_USER_ID = "user_id";
|
||||
Object event(Event event);
|
||||
}
|
||||
|
|
@ -15,10 +15,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.type;
|
||||
package org.apache.hugegraph.func;
|
||||
|
||||
public interface Typeable {
|
||||
public interface TriFunction<T1, T2, T3, R> {
|
||||
|
||||
// Return schema/data type
|
||||
HugeType type();
|
||||
R apply(T1 v1, T2 v2, T3 v3);
|
||||
}
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
import org.apache.hugegraph.util.InsertionOrderUtil;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
public class BatchMapperIterator<T, R> extends WrappedIterator<R> {
|
||||
|
||||
private final int batch;
|
||||
private final Iterator<T> originIterator;
|
||||
private final Function<List<T>, Iterator<R>> mapperCallback;
|
||||
|
||||
private Iterator<R> batchIterator;
|
||||
|
||||
public BatchMapperIterator(int batch, Iterator<T> origin,
|
||||
Function<List<T>, Iterator<R>> mapper) {
|
||||
E.checkArgument(batch > 0, "Expect batch > 0, but got %s", batch);
|
||||
this.batch = batch;
|
||||
this.originIterator = origin;
|
||||
this.mapperCallback = mapper;
|
||||
this.batchIterator = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.originIterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean fetch() {
|
||||
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
List<T> batch = this.nextBatch();
|
||||
assert this.batchIterator == null;
|
||||
while (!batch.isEmpty()) {
|
||||
// Do fetch
|
||||
this.batchIterator = this.mapperCallback.apply(batch);
|
||||
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||
return true;
|
||||
}
|
||||
// Try next batch
|
||||
batch = this.nextBatch();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected final List<T> nextBatch() {
|
||||
if (!this.originIterator.hasNext()) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
List<T> list = InsertionOrderUtil.newList();
|
||||
for (int i = 0; i < this.batch && this.originIterator.hasNext(); i++) {
|
||||
T next = this.originIterator.next();
|
||||
list.add(next);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
protected final boolean fetchFromBatch() {
|
||||
E.checkNotNull(this.batchIterator, "mapper results");
|
||||
while (this.batchIterator.hasNext()) {
|
||||
R result = this.batchIterator.next();
|
||||
if (result != null) {
|
||||
assert this.current == none();
|
||||
this.current = result;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
this.resetBatchIterator();
|
||||
return false;
|
||||
}
|
||||
|
||||
protected final void resetBatchIterator() {
|
||||
if (this.batchIterator == null) {
|
||||
return;
|
||||
}
|
||||
close(this.batchIterator);
|
||||
this.batchIterator = null;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,11 +15,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.analyzer;
|
||||
package org.apache.hugegraph.iterator;
|
||||
|
||||
import java.util.Set;
|
||||
import java.util.Iterator;
|
||||
|
||||
public interface Analyzer {
|
||||
|
||||
Set<String> segment(String text);
|
||||
public interface CIter<R> extends Iterator<R>, AutoCloseable, Metadatable {
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Deque;
|
||||
import java.util.Iterator;
|
||||
import java.util.concurrent.ConcurrentLinkedDeque;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class ExtendableIterator<T> extends WrappedIterator<T> {
|
||||
|
||||
private final Deque<Iterator<T>> itors;
|
||||
|
||||
private Iterator<T> currentIterator;
|
||||
|
||||
public ExtendableIterator() {
|
||||
this.itors = new ConcurrentLinkedDeque<>();
|
||||
this.currentIterator = null;
|
||||
}
|
||||
|
||||
public ExtendableIterator(Iterator<T> iter) {
|
||||
this();
|
||||
this.extend(iter);
|
||||
}
|
||||
|
||||
public ExtendableIterator(Iterator<T> itor1, Iterator<T> itor2) {
|
||||
this();
|
||||
this.extend(itor1);
|
||||
this.extend(itor2);
|
||||
}
|
||||
|
||||
public ExtendableIterator<T> extend(Iterator<T> iter) {
|
||||
E.checkState(this.currentIterator == null,
|
||||
"Can't extend iterator after iterating");
|
||||
if (iter != null) {
|
||||
this.itors.addLast(iter);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
for (Iterator<T> iter : this.itors) {
|
||||
if (iter instanceof AutoCloseable) {
|
||||
((AutoCloseable) iter).close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.currentIterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean fetch() {
|
||||
assert this.current == none();
|
||||
if (this.itors.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.currentIterator != null && this.currentIterator.hasNext()) {
|
||||
this.current = this.currentIterator.next();
|
||||
return true;
|
||||
}
|
||||
|
||||
Iterator<T> first;
|
||||
while ((first = this.itors.peekFirst()) != null && !first.hasNext()) {
|
||||
if (first == this.itors.peekLast() && this.itors.size() == 1) {
|
||||
this.currentIterator = first;
|
||||
// The last one
|
||||
return false;
|
||||
}
|
||||
close(this.itors.removeFirst());
|
||||
}
|
||||
|
||||
assert first != null && first.hasNext();
|
||||
this.currentIterator = first;
|
||||
this.current = this.currentIterator.next();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class FilterIterator<T> extends WrappedIterator<T> {
|
||||
|
||||
private final Iterator<T> originIterator;
|
||||
private final Function<T, Boolean> filterCallback;
|
||||
|
||||
public FilterIterator(Iterator<T> origin, Function<T, Boolean> filter) {
|
||||
this.originIterator = origin;
|
||||
this.filterCallback = filter;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.originIterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean fetch() {
|
||||
while (this.originIterator.hasNext()) {
|
||||
T next = this.originIterator.next();
|
||||
// Do filter
|
||||
if (next != null && this.filterCallback.apply(next)) {
|
||||
assert this.current == none();
|
||||
this.current = next;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class FlatMapperFilterIterator<T, R> extends FlatMapperIterator<T, R> {
|
||||
|
||||
private final Function<R, Boolean> filterCallback;
|
||||
|
||||
public FlatMapperFilterIterator(Iterator<T> origin,
|
||||
Function<T, Iterator<R>> mapper,
|
||||
Function<R, Boolean> filter) {
|
||||
super(origin, mapper);
|
||||
this.filterCallback = filter;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean fetchFromBatch() {
|
||||
E.checkNotNull(this.batchIterator, "mapper results");
|
||||
while (this.batchIterator.hasNext()) {
|
||||
R result = this.batchIterator.next();
|
||||
if (result != null && this.filterCallback.apply(result)) {
|
||||
assert this.current == none();
|
||||
this.current = result;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
this.resetBatchIterator();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.apache.hugegraph.util.E;
|
||||
|
||||
public class FlatMapperIterator<T, R> extends WrappedIterator<R> {
|
||||
|
||||
private final Iterator<T> originIterator;
|
||||
private final Function<T, Iterator<R>> mapperCallback;
|
||||
|
||||
protected Iterator<R> batchIterator;
|
||||
|
||||
public FlatMapperIterator(Iterator<T> origin,
|
||||
Function<T, Iterator<R>> mapper) {
|
||||
this.originIterator = origin;
|
||||
this.mapperCallback = mapper;
|
||||
this.batchIterator = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
this.resetBatchIterator();
|
||||
super.close();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.originIterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean fetch() {
|
||||
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
while (this.originIterator.hasNext()) {
|
||||
T next = this.originIterator.next();
|
||||
assert this.batchIterator == null;
|
||||
// Do fetch
|
||||
this.batchIterator = this.mapperCallback.apply(next);
|
||||
if (this.batchIterator != null && this.fetchFromBatch()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected boolean fetchFromBatch() {
|
||||
E.checkNotNull(this.batchIterator, "mapper results");
|
||||
while (this.batchIterator.hasNext()) {
|
||||
R result = this.batchIterator.next();
|
||||
if (result != null) {
|
||||
assert this.current == none();
|
||||
this.current = result;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
this.resetBatchIterator();
|
||||
return false;
|
||||
}
|
||||
|
||||
protected final void resetBatchIterator() {
|
||||
if (this.batchIterator == null) {
|
||||
return;
|
||||
}
|
||||
close(this.batchIterator);
|
||||
this.batchIterator = null;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class LimitIterator<T> extends WrappedIterator<T> {
|
||||
|
||||
private final Iterator<T> originIterator;
|
||||
private final Function<T, Boolean> filterCallback;
|
||||
|
||||
public LimitIterator(Iterator<T> origin, Function<T, Boolean> filter) {
|
||||
this.originIterator = origin;
|
||||
this.filterCallback = filter;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.originIterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean fetch() {
|
||||
while (this.originIterator.hasNext()) {
|
||||
T next = this.originIterator.next();
|
||||
if (next == null) {
|
||||
continue;
|
||||
}
|
||||
// Do filter
|
||||
boolean reachLimit = this.filterCallback.apply(next);
|
||||
if (reachLimit) {
|
||||
this.closeOriginIterator();
|
||||
return false;
|
||||
}
|
||||
assert this.current == none();
|
||||
this.current = next;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
protected final void closeOriginIterator() {
|
||||
if (this.originIterator == null) {
|
||||
return;
|
||||
}
|
||||
close(this.originIterator);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.hugegraph.util.InsertionOrderUtil;
|
||||
|
||||
public class ListIterator<T> extends WrappedIterator<T> {
|
||||
|
||||
private final Iterator<T> originIterator;
|
||||
private final Iterator<T> resultsIterator;
|
||||
private final Collection<T> results;
|
||||
|
||||
public ListIterator(long capacity, Iterator<T> origin) {
|
||||
List<T> results = InsertionOrderUtil.newList();
|
||||
while (origin.hasNext()) {
|
||||
if (capacity >= 0L && results.size() >= capacity) {
|
||||
throw new IllegalArgumentException(
|
||||
"The iterator exceeded capacity " + capacity);
|
||||
}
|
||||
results.add(origin.next());
|
||||
}
|
||||
this.originIterator = origin;
|
||||
this.results = Collections.unmodifiableList(results);
|
||||
this.resultsIterator = this.results.iterator();
|
||||
}
|
||||
|
||||
public ListIterator(Collection<T> origin) {
|
||||
this.originIterator = origin.iterator();
|
||||
this.results = origin instanceof List ?
|
||||
Collections.unmodifiableList((List<T>) origin) :
|
||||
Collections.unmodifiableCollection(origin);
|
||||
this.resultsIterator = this.results.iterator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
this.resultsIterator.remove();
|
||||
}
|
||||
|
||||
public Collection<T> list() {
|
||||
return this.results;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean fetch() {
|
||||
assert this.current == none();
|
||||
if (!this.resultsIterator.hasNext()) {
|
||||
return false;
|
||||
}
|
||||
this.current = this.resultsIterator.next();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.originIterator;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class MapperIterator<T, R> extends WrappedIterator<R> {
|
||||
|
||||
private final Iterator<T> originIterator;
|
||||
private final Function<T, R> mapperCallback;
|
||||
|
||||
public MapperIterator(Iterator<T> origin, Function<T, R> mapper) {
|
||||
this.originIterator = origin;
|
||||
this.mapperCallback = mapper;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<T> originIterator() {
|
||||
return this.originIterator;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected final boolean fetch() {
|
||||
while (this.originIterator.hasNext()) {
|
||||
T next = this.originIterator.next();
|
||||
R result = this.mapperCallback.apply(next);
|
||||
if (result != null) {
|
||||
assert this.current == none();
|
||||
this.current = result;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,11 +15,9 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.type;
|
||||
package org.apache.hugegraph.iterator;
|
||||
|
||||
import org.apache.hugegraph.backend.id.Id;
|
||||
public interface Metadatable {
|
||||
|
||||
public interface Idfiable {
|
||||
|
||||
Id id();
|
||||
Object metadata(String meta, Object... args);
|
||||
}
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* 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.iterator;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
public abstract class WrappedIterator<R> implements CIter<R> {
|
||||
|
||||
private static final Object NONE = new Object();
|
||||
|
||||
protected R current;
|
||||
|
||||
public WrappedIterator() {
|
||||
this.current = none();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
if (this.current != none()) {
|
||||
return true;
|
||||
}
|
||||
return this.fetch();
|
||||
}
|
||||
|
||||
@Override
|
||||
public R next() {
|
||||
if (this.current == none()) {
|
||||
this.fetch();
|
||||
if (this.current == none()) {
|
||||
throw new NoSuchElementException();
|
||||
}
|
||||
}
|
||||
R current = this.current;
|
||||
this.current = none();
|
||||
return current;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void remove() {
|
||||
Iterator<?> iterator = this.originIterator();
|
||||
if (iterator == null) {
|
||||
throw new NoSuchElementException(
|
||||
"The origin iterator can't be null for removing");
|
||||
}
|
||||
iterator.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
Iterator<?> iterator = this.originIterator();
|
||||
if (iterator instanceof AutoCloseable) {
|
||||
((AutoCloseable) iterator).close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object metadata(String meta, Object... args) {
|
||||
Iterator<?> iterator = this.originIterator();
|
||||
if (iterator instanceof Metadatable) {
|
||||
return ((Metadatable) iterator).metadata(meta, args);
|
||||
}
|
||||
throw new IllegalStateException("Original iterator is not Metadatable");
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
protected static final <R> R none() {
|
||||
return (R) NONE;
|
||||
}
|
||||
|
||||
public static void close(Iterator<?> iterator) {
|
||||
if (iterator instanceof AutoCloseable) {
|
||||
try {
|
||||
((AutoCloseable) iterator).close();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException("Failed to close iterator");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract Iterator<?> originIterator();
|
||||
|
||||
protected abstract boolean fetch();
|
||||
}
|
||||
|
|
@ -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.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.license;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.apache.commons.lang3.time.DateUtils;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class LicenseCommonParam {
|
||||
|
||||
@JsonProperty("subject")
|
||||
private String subject;
|
||||
|
||||
@JsonProperty("issued_time")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date issuedTime = new Date();
|
||||
|
||||
@JsonProperty("not_before")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date notBefore = this.issuedTime;
|
||||
|
||||
@JsonProperty("not_after")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date notAfter = DateUtils.addDays(this.notBefore, 30);
|
||||
|
||||
@JsonProperty("consumer_type")
|
||||
private String consumerType = "user";
|
||||
|
||||
@JsonProperty("consumer_amount")
|
||||
private Integer consumerAmount = 1;
|
||||
|
||||
@JsonProperty("description")
|
||||
private String description = "";
|
||||
|
||||
@JsonProperty("extra_params")
|
||||
private List<LicenseExtraParam> extraParams;
|
||||
|
||||
public LicenseCommonParam() {
|
||||
// pass
|
||||
}
|
||||
|
||||
public LicenseCommonParam(String subject, String description,
|
||||
Date issued, Date notBefore, Date notAfter,
|
||||
String consumerType, int consumerAmount,
|
||||
List<LicenseExtraParam> extraParams) {
|
||||
this.subject = subject;
|
||||
this.description = description;
|
||||
this.issuedTime = issued;
|
||||
this.notBefore = notBefore;
|
||||
this.notAfter = notAfter;
|
||||
this.consumerType = consumerType;
|
||||
this.consumerAmount = consumerAmount;
|
||||
this.extraParams = extraParams;
|
||||
}
|
||||
|
||||
public String subject() {
|
||||
return this.subject;
|
||||
}
|
||||
|
||||
public Date issuedTime() {
|
||||
return this.issuedTime;
|
||||
}
|
||||
|
||||
public Date notBefore() {
|
||||
return this.notBefore;
|
||||
}
|
||||
|
||||
public Date notAfter() {
|
||||
return this.notAfter;
|
||||
}
|
||||
|
||||
public String consumerType() {
|
||||
return this.consumerType;
|
||||
}
|
||||
|
||||
public Integer consumerAmount() {
|
||||
return this.consumerAmount;
|
||||
}
|
||||
|
||||
public String description() {
|
||||
return this.description;
|
||||
}
|
||||
|
||||
public List<LicenseExtraParam> extraParams() {
|
||||
return this.extraParams;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* 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.license;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAlias;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class LicenseCreateParam extends LicenseCommonParam {
|
||||
|
||||
@JsonProperty("private_alias")
|
||||
private String privateAlias;
|
||||
|
||||
@JsonAlias("key_ticket")
|
||||
@JsonProperty("key_password")
|
||||
private String keyPassword;
|
||||
|
||||
@JsonAlias("store_ticket")
|
||||
@JsonProperty("store_password")
|
||||
private String storePassword;
|
||||
|
||||
@JsonProperty("privatekey_path")
|
||||
private String privateKeyPath;
|
||||
|
||||
@JsonProperty("license_path")
|
||||
private String licensePath;
|
||||
|
||||
public String privateAlias() {
|
||||
return this.privateAlias;
|
||||
}
|
||||
|
||||
public String keyPassword() {
|
||||
return this.keyPassword;
|
||||
}
|
||||
|
||||
public String storePassword() {
|
||||
return this.storePassword;
|
||||
}
|
||||
|
||||
public String privateKeyPath() {
|
||||
return this.privateKeyPath;
|
||||
}
|
||||
|
||||
public String licensePath() {
|
||||
return this.licensePath;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* 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.license;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class LicenseExtraParam {
|
||||
|
||||
public static final int NO_LIMIT = -1;
|
||||
|
||||
@JsonProperty("id")
|
||||
private String id;
|
||||
|
||||
@JsonProperty("version")
|
||||
private String version;
|
||||
|
||||
@JsonProperty("graphs")
|
||||
private int graphs;
|
||||
|
||||
@JsonProperty("ip")
|
||||
private String ip;
|
||||
|
||||
@JsonProperty("mac")
|
||||
private String mac;
|
||||
|
||||
@JsonProperty("cpus")
|
||||
private int cpus;
|
||||
|
||||
// The unit is MB
|
||||
@JsonProperty("ram")
|
||||
private int ram;
|
||||
|
||||
@JsonProperty("threads")
|
||||
private int threads;
|
||||
|
||||
// The unit is MB
|
||||
@JsonProperty("memory")
|
||||
private int memory;
|
||||
|
||||
@JsonProperty("nodes")
|
||||
private int nodes;
|
||||
|
||||
// The unit is MB
|
||||
@JsonProperty("data_size")
|
||||
private long dataSize;
|
||||
|
||||
@JsonProperty("vertices")
|
||||
private long vertices;
|
||||
|
||||
@JsonProperty("edges")
|
||||
private long edges;
|
||||
|
||||
public String id() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public String version() {
|
||||
return this.version;
|
||||
}
|
||||
|
||||
public int graphs() {
|
||||
return this.graphs;
|
||||
}
|
||||
|
||||
public String ip() {
|
||||
return this.ip;
|
||||
}
|
||||
|
||||
public String mac() {
|
||||
return this.mac;
|
||||
}
|
||||
|
||||
public int cpus() {
|
||||
return this.cpus;
|
||||
}
|
||||
|
||||
public int ram() {
|
||||
return this.ram;
|
||||
}
|
||||
|
||||
public int threads() {
|
||||
return this.threads;
|
||||
}
|
||||
|
||||
public int memory() {
|
||||
return this.memory;
|
||||
}
|
||||
|
||||
public int nodes() {
|
||||
return this.nodes;
|
||||
}
|
||||
|
||||
public long dataSize() {
|
||||
return this.dataSize;
|
||||
}
|
||||
|
||||
public long vertices() {
|
||||
return this.vertices;
|
||||
}
|
||||
|
||||
public long edges() {
|
||||
return this.edges;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* 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.license;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAlias;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class LicenseInstallParam {
|
||||
|
||||
@JsonProperty("subject")
|
||||
private String subject;
|
||||
|
||||
@JsonProperty("public_alias")
|
||||
private String publicAlias;
|
||||
|
||||
@JsonAlias("store_ticket")
|
||||
@JsonProperty("store_password")
|
||||
private String storePassword;
|
||||
|
||||
@JsonProperty("publickey_path")
|
||||
private String publicKeyPath;
|
||||
|
||||
@JsonProperty("license_path")
|
||||
private String licensePath;
|
||||
|
||||
public String subject() {
|
||||
return this.subject;
|
||||
}
|
||||
|
||||
public String publicAlias() {
|
||||
return this.publicAlias;
|
||||
}
|
||||
|
||||
public String storePassword() {
|
||||
return this.storePassword;
|
||||
}
|
||||
|
||||
public String licensePath() {
|
||||
return this.licensePath;
|
||||
}
|
||||
|
||||
public String publicKeyPath() {
|
||||
return this.publicKeyPath;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,15 +15,18 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.tinkerpop;
|
||||
package org.apache.hugegraph.license;
|
||||
|
||||
import java.io.IOException;
|
||||
public interface LicenseManager {
|
||||
|
||||
public class StructureTestGraphProvider extends TestGraphProvider {
|
||||
LicenseParams installLicense() throws Exception;
|
||||
|
||||
public static final String STRUCTURE = "structure";
|
||||
void uninstallLicense() throws Exception;
|
||||
|
||||
public StructureTestGraphProvider() throws IOException {
|
||||
super(STRUCTURE);
|
||||
LicenseParams verifyLicense() throws Exception;
|
||||
|
||||
interface VerifyCallback {
|
||||
|
||||
void onVerifyLicense(LicenseParams params) throws Exception;
|
||||
}
|
||||
}
|
||||
|
|
@ -15,19 +15,16 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
package org.apache.hugegraph.exception;
|
||||
package org.apache.hugegraph.license;
|
||||
|
||||
import org.apache.hugegraph.HugeException;
|
||||
import org.apache.commons.lang.NotImplementedException;
|
||||
|
||||
public class NoIndexException extends HugeException {
|
||||
import org.apache.hugegraph.license.LicenseManager.VerifyCallback;
|
||||
|
||||
private static final long serialVersionUID = 6297062575844576832L;
|
||||
public class LicenseManagerFactory {
|
||||
|
||||
public NoIndexException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public NoIndexException(String message, Object... args) {
|
||||
super(message, args);
|
||||
public static LicenseManager create(LicenseInstallParam param,
|
||||
VerifyCallback veryfyCallback) {
|
||||
throw new NotImplementedException("No LicenseManager available");
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue