fixed conflict
This commit is contained in:
commit
0a5f627808
16
.editorconfig
Normal file
16
.editorconfig
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[{package.json,.travis.yml}]
|
||||||
|
indent_size = 2
|
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -18,5 +18,5 @@ Follow this checklist to help us incorporate your contribution quickly and easil
|
|||||||
* [ ] Format the pull request title like `[ISSUE #123] Fix UnknownException when host config not exist`. Each commit in the pull request should have a meaningful subject line and body.
|
* [ ] Format the pull request title like `[ISSUE #123] Fix UnknownException when host config not exist`. Each commit in the pull request should have a meaningful subject line and body.
|
||||||
* [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
|
* [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
|
||||||
* [ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add integration-test in [test module](https://github.com/alibaba/nacos/tree/master/test).
|
* [ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add integration-test in [test module](https://github.com/alibaba/nacos/tree/master/test).
|
||||||
* [ ] Run `mvn -B clean apache-rat:check findbugs:findbugs` to make sure basic checks pass. Run `mvn clean install -DskipITs` to make sure unit-test pass. Run `mvn clean test-compile failsafe:integration-test` to make sure integration-test pass.
|
* [ ] Run `mvn -B clean package apache-rat:check findbugs:findbugs -Dmaven.test.skip=true` to make sure basic checks pass. Run `mvn clean install -DskipITs` to make sure unit-test pass. Run `mvn clean test-compile failsafe:integration-test` to make sure integration-test pass.
|
||||||
|
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -5,8 +5,11 @@
|
|||||||
target
|
target
|
||||||
.project
|
.project
|
||||||
.idea
|
.idea
|
||||||
|
.vscode
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.factorypath
|
||||||
/logs
|
/logs
|
||||||
*.iml
|
*.iml
|
||||||
node_modules
|
node_modules
|
||||||
test/derby.log
|
test/derby.log
|
||||||
|
derby.log
|
||||||
|
@ -4,6 +4,7 @@ notifications:
|
|||||||
- xchaos8@126.com
|
- xchaos8@126.com
|
||||||
- nacos_dev@linux.alibaba.com
|
- nacos_dev@linux.alibaba.com
|
||||||
- dev-nacos@googlegroups.com
|
- dev-nacos@googlegroups.com
|
||||||
|
- mw_configcenter@list.alibaba-inc.com
|
||||||
on_success: change
|
on_success: change
|
||||||
on_failure: always
|
on_failure: always
|
||||||
|
|
||||||
@ -24,7 +25,9 @@ before_install:
|
|||||||
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then jdk_switcher use "$CUSTOM_JDK"; fi
|
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then jdk_switcher use "$CUSTOM_JDK"; fi
|
||||||
|
|
||||||
script:
|
script:
|
||||||
|
- mvn -B clean package apache-rat:check findbugs:findbugs -Dmaven.test.skip=true
|
||||||
|
- mvn -Prelease-nacos clean install -U
|
||||||
|
- mvn clean package -Pit-test
|
||||||
after_success:
|
after_success:
|
||||||
- mvn clean install -Pit-test
|
- mvn clean package -Pit-test
|
||||||
- mvn sonar:sonar -Psonar-apache
|
- mvn sonar:sonar -Psonar-apache
|
||||||
|
105
CHANGELOG.md
105
CHANGELOG.md
@ -1,3 +1,108 @@
|
|||||||
|
## 0.7.0(Dec, 2018)
|
||||||
|
|
||||||
|
* [ #461 ] Registration failed when instance port is set to 0
|
||||||
|
* [ #455 ] The console can't change the change code
|
||||||
|
* [ #447 ] 集群模式server挂掉一台后,提供方注册失败
|
||||||
|
* [ #445 ] 0.6.1控制台创建配置发布提交时,提示信息有问题
|
||||||
|
* [ #442 ] Typos in class names and variables.
|
||||||
|
* [ #413 ] The console has some uncaught exceptions
|
||||||
|
* [ #395 ] nacos surport mysql in the case of stand-alone mode
|
||||||
|
* [ #393 ] Support operation of selector on console
|
||||||
|
* [ #365 ] NodeJs SDK support
|
||||||
|
* [ #362 ] The metadata will lost when online or offline instance through web ui
|
||||||
|
* [ #187 ] Provide Label ability for Naming Service into NACOS for complex multi-DC scenario.
|
||||||
|
|
||||||
|
## 0.6.1(Dec, 2018)
|
||||||
|
|
||||||
|
* [#421] NamingService's serivce name can't use colon(:) in Windows
|
||||||
|
* [#432] When packing nacos-core, ${user.home} is replaced in the logback configuration file (nacos.xml)
|
||||||
|
|
||||||
|
## 0.6.0(Dec, 2018)
|
||||||
|
|
||||||
|
* [#388] Cluster name should be provided in the Instance
|
||||||
|
* [#377] Clean up messy code in Naming module
|
||||||
|
* [#369] Support instance list persisted on disk
|
||||||
|
* [#366] findbugs-maven-plugin version
|
||||||
|
* [#362] The metadata will lost when online or offline instance through web ui
|
||||||
|
* [#352] Refactoring internationalization Nacos console
|
||||||
|
* [#278] Nacos docker img
|
||||||
|
* [#243] optimize the efficiency of integration testing, it’s taking too long now
|
||||||
|
|
||||||
|
## 0.5.0(Nov, 2018)
|
||||||
|
|
||||||
|
* [#148] Naming write performace.
|
||||||
|
* [#175] Support deregistering instance automatically.
|
||||||
|
* [#176] Naming client query instance method should bypass local cache at client start.
|
||||||
|
* [#177] Console supports registering new empty service and delete empty service.
|
||||||
|
* [#181] NPE when adding a instance if no leader in the raft cluster.
|
||||||
|
* [#193] Configure host domain name cause nacos server cluster is unavailable.
|
||||||
|
* [#209] Disable service and cluster level customization in client registerInstance method.
|
||||||
|
* [#214] Please support Java 11.
|
||||||
|
* [#222] print more nacos server start status info in start.log.
|
||||||
|
* [#231] Refactoring: Parsing the Nacos home directory and the cluster.conf file.
|
||||||
|
* [#246] "mvn -B clean apache-rat:check findbugs:findbugs" did not work as expected.
|
||||||
|
* [#251] Console Editor Optimization.
|
||||||
|
* [#254] DataId and group are required in historical version and listener query.
|
||||||
|
* [#256] Whether the service discovery data needs to add a newline link symbol.
|
||||||
|
* [#257] Listening query switching query dimension data is not refreshed.
|
||||||
|
* [#258] Remove the Balloon of DataId/Group.
|
||||||
|
* [#259] Listening query paging size problem.
|
||||||
|
* [#272] "#it is ip" is also parsed into an instance IP.
|
||||||
|
* [#275] nacos coredns plugin to support DNS.
|
||||||
|
* [#281] We should lint the console code.
|
||||||
|
* [#302] Maven build project supports java 11.
|
||||||
|
* [#316] In stand alone mode, Nacos still checks the cluster.conf.
|
||||||
|
|
||||||
|
## 0.4.0(Nov 7, 2018)
|
||||||
|
|
||||||
|
* [#216] Fix tenant dir problem
|
||||||
|
* [#197] Service update ignored some properties
|
||||||
|
* [#190] Client beat lose weight info and metadata info
|
||||||
|
* [#188] Console delete data cannot be updated in time
|
||||||
|
* [#179] Listening query fail when namespace is not blank
|
||||||
|
* [#157] Lack information in readme.md to describe the related project repositories for Nacos echosystem
|
||||||
|
* [#144] There have a error and something are not clear
|
||||||
|
* [#106] Snapshot file create error
|
||||||
|
* [#92] Eliminate warnings, refactor code, show start.log detail
|
||||||
|
|
||||||
|
|
||||||
|
## 0.3.0(Oct 26, 2018)
|
||||||
|
|
||||||
|
* [#171] UI debug errors
|
||||||
|
* [#156] Web UI 404 problem
|
||||||
|
* [#155] use local resource
|
||||||
|
* [#145] nacos-example not found :org.apache.logging.log4j.core.Logger
|
||||||
|
* [#142] UI console show Group
|
||||||
|
* [#149] Fix naming client beat process failed bug.
|
||||||
|
* [#150] Fix naming service registration hangs bug.
|
||||||
|
|
||||||
|
## 0.3.0-RC1(Oct 19, 2018)
|
||||||
|
|
||||||
|
* [#33] Support console for config management.
|
||||||
|
* [#51] Support console for naming service.
|
||||||
|
* [#121] Fix get instance method hanging bug.
|
||||||
|
* [#138] Add a flag to indicate if instance is offline.
|
||||||
|
* [#130] Fix health check disabled if machine has one CPU core bug.
|
||||||
|
* [#139] Fix still get instance with zero weight bug.
|
||||||
|
* [#128] Fix console layout bug.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 0.2.1-release(Sept 28, 2018)
|
||||||
|
|
||||||
|
* FIx deregister last instance failed error.
|
||||||
|
* Fix url pattern error.
|
||||||
|
* Fully integrate with and seamlessly support Spring framework, Spring Boot and Spring Cloud
|
||||||
|
* Separate nacos-api from nacos client implementation
|
||||||
|
* Support high available cluster mode
|
||||||
|
* Fix cluster node health check abnormality
|
||||||
|
* Fix stand-alone mode gets the change history list exception
|
||||||
|
* Fix Pulling does not exist configuration print io exception
|
||||||
|
* Optimized log framework
|
||||||
|
* Service Discovery: Client support getting server status.
|
||||||
|
* Service Discovery: Client support get all service names of server.
|
||||||
|
* Service Discovery: Client support get all subscribed services.
|
||||||
|
|
||||||
## 0.2.0 (Sept 17, 2018)
|
## 0.2.0 (Sept 17, 2018)
|
||||||
|
|
||||||
#### FEATURES:
|
#### FEATURES:
|
||||||
|
73
CODE_OF_CONDUCT.md
Normal file
73
CODE_OF_CONDUCT.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
In the interest of fostering an open and welcoming environment, we as
|
||||||
|
contributors and maintainers pledge to making participation in our project and
|
||||||
|
our community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||||
|
education, socio-economic status, nationality, personal appearance, race,
|
||||||
|
religion, or sexual identity and orientation.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to creating a positive environment
|
||||||
|
include:
|
||||||
|
|
||||||
|
* Using welcoming and inclusive language
|
||||||
|
* Being respectful of differing viewpoints and experiences
|
||||||
|
* Gracefully accepting constructive criticism
|
||||||
|
* Focusing on what is best for the community
|
||||||
|
* Showing empathy towards other community members
|
||||||
|
|
||||||
|
Examples of unacceptable behavior by participants include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||||
|
advances
|
||||||
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or electronic
|
||||||
|
address, without explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Our Responsibilities
|
||||||
|
|
||||||
|
Project maintainers are responsible for clarifying the standards of acceptable
|
||||||
|
behavior and are expected to take appropriate and fair corrective action in
|
||||||
|
response to any instances of unacceptable behavior.
|
||||||
|
|
||||||
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||||
|
permanently any contributor for other behaviors that they deem inappropriate,
|
||||||
|
threatening, offensive, or harmful.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community. Examples of
|
||||||
|
representing a project or community include using an official project e-mail
|
||||||
|
address, posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event. Representation of a project may be
|
||||||
|
further defined and clarified by project maintainers.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported by contacting the project team at users-nacos@googlegroups.com. All
|
||||||
|
complaints will be reviewed and investigated and will result in a response that
|
||||||
|
is deemed necessary and appropriate to the circumstances. The project team is
|
||||||
|
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||||
|
Further details of specific enforcement policies may be posted separately.
|
||||||
|
|
||||||
|
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||||
|
faith may face temporary or permanent repercussions as determined by other
|
||||||
|
members of the project's leadership.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||||
|
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
135
CONTRIBUTING.md
135
CONTRIBUTING.md
@ -1,31 +1,124 @@
|
|||||||
## How To Contribute
|
# Contributing to Nacos
|
||||||
|
|
||||||
We are always very happy to have contributions, whether for trivial cleanups or big new features.
|
Welcome to Nacos! This document is a guideline about how to contribute to Nacos.
|
||||||
We want to have high quality, well documented codes for each programming language.
|
|
||||||
|
|
||||||
Nor is code the only way to contribute to the project. We strongly value documentation, integration with other project, and gladly accept improvements for these aspects.
|
If you find something incorrect or missing, please leave comments / suggestions.
|
||||||
|
|
||||||
## Contributing code
|
## Before you get started
|
||||||
|
|
||||||
To submit a change for inclusion, please do the following:
|
### Code of Conduct
|
||||||
|
|
||||||
#### If the change is non-trivial please include some unit tests that cover the new functionality.
|
Please make sure to read and observe our [Code of Conduct](./CODE_OF_CONDUCT.md).
|
||||||
#### If you are introducing a completely new feature or API it is a good idea to start a wiki and get consensus on the basic design first.
|
|
||||||
#### It is our job to follow up on patches in a timely fashion. Nag us if we aren't doing our job (sometimes we drop things).
|
|
||||||
|
|
||||||
## Becoming a Committer
|
## Contributing
|
||||||
|
|
||||||
We are always interested in adding new contributors. What we look for are series of contributions, good taste and ongoing interest in the project. If you are interested in becoming a committer, please let one of the existing committers know and they can help you walk through the process.
|
Nacos welcome new participants of any role, including user, contributor, committer and PMC.
|
||||||
|
|
||||||
Nowadays,we have several important contribution points:
|
![](http://acm-public.oss-cn-hangzhou.aliyuncs.com/contributor_definition.png)
|
||||||
#### Wiki & JavaDoc
|
|
||||||
#### Nacos Console
|
|
||||||
#### Nacos SDK(C++\.Net\Php\Python\Go\Node.js)
|
|
||||||
|
|
||||||
##### Prerequisite
|
|
||||||
If you want to contribute the above listing points, you must abide our some prerequisites:
|
|
||||||
|
|
||||||
###### Readability - API must have Javadoc,some very important methods also must have javadoc
|
We encourage new comers actively join in Nacos projects and involving from user role to committer role, and even PMC role. In order to accomplish this, new comers needs to actively contribute in Nacos project. The following paragraph introduce how to contribute in Nacos way.
|
||||||
###### Testability - 80% above unit test coverage about main process
|
|
||||||
###### Maintainability - Comply with our [PMD spec](style/codeStyle.xml), and at least 3 month update frequency
|
#### Open / pickup an issue for preparation
|
||||||
###### Deployability - We encourage you to deploy into [maven repository](http://search.maven.org/)
|
|
||||||
|
If you find a typo in document, find a bug in code, or want new features, or want to give suggestions, you can [open an issue on GitHub](https://github.com/alibaba/Nacos/issues/new) to report it.
|
||||||
|
|
||||||
|
If you just want to contribute directly you can choose the issue below.
|
||||||
|
|
||||||
|
- [Contribution Welcome](https://github.com/alibaba/nacos/labels/contribution%20welcome): Heavily needed issue, but currently short of hand.
|
||||||
|
|
||||||
|
- [good first issue](https://github.com/alibaba/nacos/labels/good%20first%20issue): Good for newcomers, new comer can pickup one for warm-up.
|
||||||
|
|
||||||
|
|
||||||
|
We strongly value documentation and integration with other projects such as Spring Cloud, Kubernetes, Dubbo, etc. We are very glad to work on any issue for these aspects.
|
||||||
|
|
||||||
|
Please note that any PR must be associated with a valid issue. Otherwise the PR will be rejected.
|
||||||
|
|
||||||
|
#### Begin your contribute
|
||||||
|
|
||||||
|
Now if you want to contribute, please create a new pull request.
|
||||||
|
|
||||||
|
We use the `develop` branch as the development branch, which indicates that this is a unstable branch.
|
||||||
|
|
||||||
|
Further more, our branching model complies to [https://nvie.com/posts/a-successful-git-branching-model/](https://nvie.com/posts/a-successful-git-branching-model/). We strongly suggest new comers walk through the above article before creating PR.
|
||||||
|
|
||||||
|
Now, if you are ready to create PR, here is the workflow for contributors:
|
||||||
|
|
||||||
|
1. Fork to your own
|
||||||
|
|
||||||
|
2. Clone fork to local repository
|
||||||
|
|
||||||
|
3. Create a new branch and work on it
|
||||||
|
|
||||||
|
4. Keep your branch in sync
|
||||||
|
|
||||||
|
5. Commit your changes (make sure your commit message concise)
|
||||||
|
|
||||||
|
6. Push your commits to your forked repository
|
||||||
|
|
||||||
|
7. Create a pull request to **develop** branch.
|
||||||
|
|
||||||
|
|
||||||
|
When creating pull request:
|
||||||
|
|
||||||
|
1. Please follow [the pull request template](./.github/PULL_REQUEST_TEMPLATE.md).
|
||||||
|
|
||||||
|
2. Please create the request to **develop** branch.
|
||||||
|
|
||||||
|
3. Please make sure the PR has a corresponding issue.
|
||||||
|
|
||||||
|
4. If your PR contains large changes, e.g. component refactor or new components, please write detailed documents about its design and usage.
|
||||||
|
|
||||||
|
5. Note that a single PR should not be too large. If heavy changes are required, it's better to separate the changes to a few individual PRs.
|
||||||
|
|
||||||
|
6. After creating a PR, one or more reviewers will be assigned to the pull request.
|
||||||
|
|
||||||
|
7. Before merging a PR, squash any fix review feedback, typo, merged, and rebased sorts of commits. The final commit message should be clear and concise.
|
||||||
|
|
||||||
|
|
||||||
|
If your PR contains large changes, e.g. component refactor or new components, please write detailed documents about its design and usage.
|
||||||
|
|
||||||
|
### Code review guidance
|
||||||
|
|
||||||
|
Committers will rotate reviewing the code to make sure all the PR will be reviewed timely and by at least one committer before merge. If we aren't doing our job (sometimes we drop things). And as always, we welcome volunteers for code review.
|
||||||
|
|
||||||
|
Some principles:
|
||||||
|
|
||||||
|
- Readability - Important code should be well-documented. API should have Javadoc. Code style should be complied with the existing one.
|
||||||
|
|
||||||
|
- Elegance: New functions, classes or components should be well designed.
|
||||||
|
|
||||||
|
- Testability - 80% of the new code should be covered by unit test cases.
|
||||||
|
|
||||||
|
- Maintainability - Comply with our [PMD spec](style/codeStyle.xml), and 3-month-frequency update should be maintained at least.
|
||||||
|
|
||||||
|
|
||||||
|
### Now how about try become a committer?
|
||||||
|
|
||||||
|
Generally speaking, contribute 8 non-trivial patches and get at least three different people to review them (you'll need three people to support you). Then ask someone to nominate you. You're demonstrating your:
|
||||||
|
|
||||||
|
- at least 8 PR and the associated issues to the project,
|
||||||
|
|
||||||
|
- ability to collaborate with the team,
|
||||||
|
|
||||||
|
- understanding of the projects' code base and coding style, and
|
||||||
|
|
||||||
|
- ability to write good code (last but certainly not least)
|
||||||
|
|
||||||
|
|
||||||
|
A current committer nominates you by slacking the team on the Nacos issue with label "nomination"
|
||||||
|
|
||||||
|
- your first and last name
|
||||||
|
|
||||||
|
- a link to your Git profile
|
||||||
|
|
||||||
|
- an explanation of why you should be a committer,
|
||||||
|
|
||||||
|
- Elaborate the top 3 PR and the associated issues the nominator has worked with you that can demonstrate your ability.
|
||||||
|
|
||||||
|
|
||||||
|
Two other committer need to second your nomination. If no one objects in 5 working days (China), you're a committer. If anyone objects or wants more information, the committers discuss and usually come to a consensus (within the 5 working days). If issues cannot be resolved, there's a vote among current committers.
|
||||||
|
|
||||||
|
![](http://acm-public.oss-cn-hangzhou.aliyuncs.com/nomination_process.png)
|
||||||
|
|
||||||
|
In the worst case, this can drag out for two weeks. Keep contributing! Even in the rare cases where a nomination fails, the objection is usually something easy to address like "more patches" or "not enough people are familiar with this person's work."
|
||||||
|
74
README.md
74
README.md
@ -1,12 +1,16 @@
|
|||||||
## Nacos
|
|
||||||
|
|
||||||
|
<img src="doc/Nacos_Logo.png" width="50%" height="50%" />
|
||||||
|
|
||||||
|
# Nacos: Dynamic *Na*ming and *Co*nfiguration *S*ervice
|
||||||
|
|
||||||
[![Gitter](https://badges.gitter.im/alibaba/nacos.svg)](https://gitter.im/alibaba/nacos?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
|
[![Gitter](https://badges.gitter.im/alibaba/nacos.svg)](https://gitter.im/alibaba/nacos?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||||
[![Gitter](https://travis-ci.org/alibaba/nacos.svg?branch=master)](https://travis-ci.org/alibaba/nacos)
|
[![Gitter](https://travis-ci.org/alibaba/nacos.svg?branch=master)](https://travis-ci.org/alibaba/nacos)
|
||||||
|
|
||||||
-------
|
-------
|
||||||
<img src="doc/Nacos_Logo.png" width="50%" height="50%" />
|
|
||||||
Nacos is an easy-to-use platform designed for dynamic service discovery and configuration and service management. It helps you to build cloud native applications and microservices platform easily.
|
## What does it do
|
||||||
|
|
||||||
|
Nacos (official site: [http://nacos.io](http://nacos.io)) is an easy-to-use platform designed for dynamic service discovery and configuration and service management. It helps you to build cloud native applications and microservices platform easily.
|
||||||
|
|
||||||
Service is a first-class citizen in Nacos. Nacos supports almost all type of services,for example,[Dubbo/gRPC service](https://nacos.io/en-us/docs/use-nacos-with-dubbo.html)、[Spring Cloud RESTFul service](https://nacos.io/en-us/docs/use-nacos-with-springcloud.html) or [Kubernetes service](https://nacos.io/en-us/docs/use-nacos-with-kubernetes.html).
|
Service is a first-class citizen in Nacos. Nacos supports almost all type of services,for example,[Dubbo/gRPC service](https://nacos.io/en-us/docs/use-nacos-with-dubbo.html)、[Spring Cloud RESTFul service](https://nacos.io/en-us/docs/use-nacos-with-springcloud.html) or [Kubernetes service](https://nacos.io/en-us/docs/use-nacos-with-kubernetes.html).
|
||||||
|
|
||||||
@ -29,60 +33,70 @@ Nacos provides four major functions.
|
|||||||
Nacos provides an easy-to-use service dashboard to help you manage your services metadata, configuration, kubernetes DNS, service health and metrics statistics.
|
Nacos provides an easy-to-use service dashboard to help you manage your services metadata, configuration, kubernetes DNS, service health and metrics statistics.
|
||||||
|
|
||||||
|
|
||||||
### Quick Start
|
## Quick Start
|
||||||
It is super easy to get started with your first project.
|
It is super easy to get started with your first project.
|
||||||
|
|
||||||
1. #### Download run package
|
#### Step 1: Download the binary package
|
||||||
[Download](https://github.com/alibaba/nacos/releases/download/0.2.1/nacos-server-0.2.1.zip)
|
|
||||||
|
|
||||||
|
You can download the package from the [latest stable release](https://github.com/alibaba/nacos/releases).
|
||||||
|
|
||||||
|
Take release nacos-server-0.6.1.zip for example.
|
||||||
```
|
```
|
||||||
unzip nacos-server-0.2.1.zip
|
unzip nacos-server-0.6.1.zip
|
||||||
cd nacos/bin
|
cd nacos/bin
|
||||||
```
|
```
|
||||||
|
|
||||||
2. #### Start Server
|
#### Step 2: Start Server
|
||||||
* ##### Linux/Unix/Mac
|
|
||||||
|
|
||||||
|
On the **Linux/Unix/Mac** platform, run the following command to start server with standalone mode:
|
||||||
```
|
```
|
||||||
Run the following command to start (standalone means non-cluster mode):
|
|
||||||
|
|
||||||
sh startup.sh -m standalone
|
sh startup.sh -m standalone
|
||||||
```
|
```
|
||||||
|
|
||||||
* ##### Windows
|
On the **Windows** platform, run the following command to start server with standalone mode. Alternatively, you can also double-click the startup.cmd to run NacosServer.
|
||||||
```
|
```
|
||||||
Run the following command to start:
|
cmd startup.cmd -m standalone
|
||||||
|
|
||||||
cmd startup.cmd
|
|
||||||
|
|
||||||
Or double-click the startup.cmd to run NacosServer.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
For more details, see [quick-start.](https://nacos.io/en-us/docs/quick-start.html)
|
For more details, see [quick-start.](https://nacos.io/en-us/docs/quick-start.html)
|
||||||
|
|
||||||
3. #### Quick start for other open-source projects:
|
## Quick start for other open-source projects:
|
||||||
|
* [Quick start with Nacos command and console](https://nacos.io/en-us/docs/quick-start.html)
|
||||||
|
|
||||||
* [quick start with spring cloud](https://nacos.io/en-us/docs/use-nacos-with-springcloud.html)
|
* [Quick start with dubbo](https://nacos.io/en-us/docs/use-nacos-with-dubbo.html)
|
||||||
|
|
||||||
* [quick start with dubbo](https://nacos.io/en-us/docs/use-nacos-with-dubbo.html)
|
* [Quick start with spring cloud](https://nacos.io/en-us/docs/quick-start-spring-cloud.html)
|
||||||
|
|
||||||
* [quick start with kubernetes](https://nacos.io/en-us/docs/use-nacos-with-kubernetes.html)
|
* [Quick start with kubernetes](https://nacos.io/en-us/docs/use-nacos-with-kubernetes.html)
|
||||||
|
|
||||||
* [more...](https://nacos.io/)
|
|
||||||
|
|
||||||
### Documentation
|
## Documentation
|
||||||
|
|
||||||
You can view full documentation on the Nacos website:
|
You can view the full documentation from the [Nacos website](https://nacos.io/en-us/docs/what-is-nacos.html).
|
||||||
|
|
||||||
* [nacos.io](https://nacos.io/en-us/docs/what-is-nacos.html)
|
All the latest and long-term notice can also be found here from [Github notice issue](https://github.com/alibaba/nacos/labels/notice)
|
||||||
|
|
||||||
### Contact
|
|
||||||
|
|
||||||
* #### Gitter-[Nacos Gitter](https://gitter.im/alibaba/nacos)
|
## Contributing
|
||||||
|
|
||||||
* #### Weibo-[Nacos Weibo](https://weibo.com/u/6574374908)
|
Contributors are welcomed to join Nacos project. Please check [CONTRIBUTING](./CONTRIBUTING.md) about how to contribute to this project.
|
||||||
|
|
||||||
* #### Segmentfault-[Nacos Segmentfault](https://segmentfault.com/t/nacos)
|
## Other Related Project Repositories
|
||||||
|
|
||||||
* #### Mailing list-[nacos\_dev@linux.alibaba.com](mailto:nacos_dev@linux.alibaba.com).
|
* [nacos-spring-project](https://github.com/nacos-group/nacos-spring-project) provides the integration functionality for Spring.
|
||||||
|
* [nacos-group](https://github.com/nacos-group) is the reposity that hosts the eco tools for Nacos, such as SDK, synchronization tool, etc.
|
||||||
|
* [spring-cloud-alibaba](https://github.com/spring-cloud-incubator/spring-cloud-alibaba) provides the one-stop solution for application development over Alibaba middleware which includes Nacos.
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
|
||||||
|
* [Gitter](https://gitter.im/alibaba/nacos): Nacos's IM tool for community messaging, collaboration and discovery.
|
||||||
|
* [Twitter](https://twitter.com/nacos2): Follow along for latest nacos news on Twitter.
|
||||||
|
* [Weibo](https://weibo.com/u/6574374908): Follow along for latest nacos news on Weibo (Twitter of China version).
|
||||||
|
* [Nacos Segmentfault](https://segmentfault.com/t/nacos): Get latest notice and prompt help from Segmentfault.
|
||||||
|
* Email Group:
|
||||||
|
* users-nacos@googlegroups.com: Nacos usage general discussion.
|
||||||
|
* dev-nacos@googlegroups.com: Nacos developer discussion (APIs, feature design, etc).
|
||||||
|
* commits-nacos@googlegroups.com: Commits notice, very high frequency.
|
||||||
|
* Join us from wechat. Welcome words: Nacos.
|
||||||
|
|
||||||
|
![cwex](http://acm-public.oss-cn-hangzhou.aliyuncs.com/xuc.png)
|
||||||
|
@ -21,7 +21,7 @@ We might ask for further information to locate a bug. A duplicated bug report wi
|
|||||||
|
|
||||||
# 如何提交错误报告
|
# 如何提交错误报告
|
||||||
|
|
||||||
如果Nacos项目的任何部分存在问题或文档问题,请通过[opening an issue][Nacos-issue]告诉我们。我们非常认真地对待错误和错误,在产品面前没有不重要的问题。不过在创建错误报告之前,请检查是否存在报告相同问题的issues。
|
如果Nacos项目的任何部分存在问题或文档问题,请通过[opening an issue][Nacos-issue]告诉我们。我们非常认真地对待错误和缺陷,在产品面前没有不重要的问题。不过在创建错误报告之前,请检查是否存在报告相同问题的issues。
|
||||||
|
|
||||||
为了使错误报告准确且易于理解,请尝试创建以下错误报告:
|
为了使错误报告准确且易于理解,请尝试创建以下错误报告:
|
||||||
|
|
||||||
|
29
api/pom.xml
29
api/pom.xml
@ -16,7 +16,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.nacos</groupId>
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
<artifactId>nacos-all</artifactId>
|
<artifactId>nacos-all</artifactId>
|
||||||
<version>0.2.1</version>
|
<version>0.7.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@ -26,6 +26,18 @@
|
|||||||
|
|
||||||
<name>nacos-api ${project.version}</name>
|
<name>nacos-api ${project.version}</name>
|
||||||
<url>http://maven.apache.org</url>
|
<url>http://maven.apache.org</url>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>7</source>
|
||||||
|
<target>7</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
@ -36,6 +48,19 @@
|
|||||||
<groupId>com.alibaba</groupId>
|
<groupId>com.alibaba</groupId>
|
||||||
<artifactId>fastjson</artifactId>
|
<artifactId>fastjson</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -31,7 +31,7 @@ import com.alibaba.nacos.api.naming.NamingService;
|
|||||||
public class NacosFactory {
|
public class NacosFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create config service
|
* Create config service
|
||||||
*
|
*
|
||||||
* @param properties init param
|
* @param properties init param
|
||||||
* @return config
|
* @return config
|
||||||
@ -42,7 +42,7 @@ public class NacosFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create config service
|
* Create config service
|
||||||
*
|
*
|
||||||
* @param serverAddr server list
|
* @param serverAddr server list
|
||||||
* @return config
|
* @return config
|
||||||
@ -53,7 +53,7 @@ public class NacosFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create naming service
|
* Create naming service
|
||||||
*
|
*
|
||||||
* @param serverAddr server list
|
* @param serverAddr server list
|
||||||
* @return Naming
|
* @return Naming
|
||||||
@ -64,7 +64,7 @@ public class NacosFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create naming service
|
* Create naming service
|
||||||
*
|
*
|
||||||
* @param properties init param
|
* @param properties init param
|
||||||
* @return Naming
|
* @return Naming
|
||||||
|
@ -38,4 +38,6 @@ public class PropertyKeyConst {
|
|||||||
|
|
||||||
public final static String ENCODE = "encode";
|
public final static String ENCODE = "encode";
|
||||||
|
|
||||||
|
public final static String NAMING_LOAD_CACHE_AT_START = "namingLoadCacheAtStart";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -13,41 +13,40 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package com.alibaba.nacos.core;
|
package com.alibaba.nacos.api.cmdb.pojo;
|
||||||
|
|
||||||
import junit.framework.Test;
|
import java.util.Map;
|
||||||
import junit.framework.TestCase;
|
|
||||||
import junit.framework.TestSuite;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unit test for simple App.
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
*/
|
*/
|
||||||
public class AppTest
|
public class Entity {
|
||||||
extends TestCase
|
|
||||||
{
|
private String type;
|
||||||
/**
|
private String name;
|
||||||
* Create the test case
|
private Map<String, String> labels;
|
||||||
*
|
|
||||||
* @param testName name of the test case
|
public String getType() {
|
||||||
*/
|
return type;
|
||||||
public AppTest( String testName )
|
|
||||||
{
|
|
||||||
super( testName );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public void setType(String type) {
|
||||||
* @return the suite of tests being tested
|
this.type = type;
|
||||||
*/
|
|
||||||
public static Test suite()
|
|
||||||
{
|
|
||||||
return new TestSuite( AppTest.class );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public String getName() {
|
||||||
* Rigourous Test :-)
|
return name;
|
||||||
*/
|
}
|
||||||
public void testApp()
|
|
||||||
{
|
public void setName(String name) {
|
||||||
assertTrue( true );
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getLabels() {
|
||||||
|
return labels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLabels(Map<String, String> labels) {
|
||||||
|
this.labels = labels;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.cmdb.pojo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public class EntityEvent {
|
||||||
|
|
||||||
|
private EntityEventType type;
|
||||||
|
private String entityName;
|
||||||
|
private String entityType;
|
||||||
|
|
||||||
|
public EntityEventType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(EntityEventType type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEntityName() {
|
||||||
|
return entityName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEntityName(String entityName) {
|
||||||
|
this.entityName = entityName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEntityType() {
|
||||||
|
return entityType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEntityType(String entityType) {
|
||||||
|
this.entityType = entityType;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.cmdb.pojo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public enum EntityEventType {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ENTITY_ADD_OR_UPDATE,
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ENTITY_REMOVE
|
||||||
|
}
|
52
api/src/main/java/com/alibaba/nacos/api/cmdb/pojo/Label.java
Normal file
52
api/src/main/java/com/alibaba/nacos/api/cmdb/pojo/Label.java
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.cmdb.pojo;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public class Label {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
private Set<String> values;
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getValues() {
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValues(Set<String> values) {
|
||||||
|
this.values = values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.cmdb.pojo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public enum PreservedEntityTypes {
|
||||||
|
/**
|
||||||
|
* Ip
|
||||||
|
*/
|
||||||
|
ip,
|
||||||
|
/**
|
||||||
|
* Service
|
||||||
|
*/
|
||||||
|
service
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.cmdb.spi;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.cmdb.pojo.Entity;
|
||||||
|
import com.alibaba.nacos.api.cmdb.pojo.EntityEvent;
|
||||||
|
import com.alibaba.nacos.api.cmdb.pojo.Label;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service to visit CMDB store
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public interface CmdbService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all label names stored in CMDB
|
||||||
|
*
|
||||||
|
* @return label name set
|
||||||
|
*/
|
||||||
|
Set<String> getLabelNames();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all possible entity types in CMDB
|
||||||
|
*
|
||||||
|
* @return all entity types
|
||||||
|
*/
|
||||||
|
Set<String> getEntityTypes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get label info
|
||||||
|
*
|
||||||
|
* @param labelName label name
|
||||||
|
* @return label info
|
||||||
|
*/
|
||||||
|
Label getLabel(String labelName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get label value of label name of ip
|
||||||
|
*
|
||||||
|
* @param entityName entity name
|
||||||
|
* @param entityType entity type
|
||||||
|
* @param labelName target label name
|
||||||
|
* @return label value
|
||||||
|
*/
|
||||||
|
String getLabelValue(String entityName, String entityType, String labelName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all label value of ip
|
||||||
|
*
|
||||||
|
* @param entityName entity name
|
||||||
|
* @param entityType entity type
|
||||||
|
* @return all label values
|
||||||
|
*/
|
||||||
|
Map<String, String> getLabelValues(String entityName, String entityType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dump all entities in CMDB
|
||||||
|
*
|
||||||
|
* @return all entities
|
||||||
|
*/
|
||||||
|
Map<String, Map<String, Entity>> getAllEntities();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get label change events
|
||||||
|
*
|
||||||
|
* @param timestamp start time of generated events
|
||||||
|
* @return label events
|
||||||
|
*/
|
||||||
|
List<EntityEvent> getEntityEvents(long timestamp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get single entity
|
||||||
|
*
|
||||||
|
* @param entityName name of entity
|
||||||
|
* @param entityType type of entity
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Entity getEntity(String entityName, String entityType);
|
||||||
|
}
|
@ -85,11 +85,6 @@ public class Constants {
|
|||||||
*/
|
*/
|
||||||
public static final int ONCE_TIMEOUT = 2000;
|
public static final int ONCE_TIMEOUT = 2000;
|
||||||
|
|
||||||
/**
|
|
||||||
* millisecond
|
|
||||||
*/
|
|
||||||
public static final int CONN_TIMEOUT = 2000;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* millisecond
|
* millisecond
|
||||||
*/
|
*/
|
||||||
@ -110,9 +105,9 @@ public class Constants {
|
|||||||
|
|
||||||
public static final int FLOW_CONTROL_INTERVAL = 1000;
|
public static final int FLOW_CONTROL_INTERVAL = 1000;
|
||||||
|
|
||||||
public static final String LINE_SEPARATOR = Character.toString((char) 1);
|
public static final String LINE_SEPARATOR = Character.toString((char)1);
|
||||||
|
|
||||||
public static final String WORD_SEPARATOR = Character.toString((char) 2);
|
public static final String WORD_SEPARATOR = Character.toString((char)2);
|
||||||
|
|
||||||
public static final String LONGPULLING_LINE_SEPARATOR = "\r\n";
|
public static final String LONGPULLING_LINE_SEPARATOR = "\r\n";
|
||||||
|
|
||||||
@ -124,4 +119,7 @@ public class Constants {
|
|||||||
|
|
||||||
public static final String NAMING_INSTANCE_ID_SPLITTER = "#";
|
public static final String NAMING_INSTANCE_ID_SPLITTER = "#";
|
||||||
public static final int NAMING_INSTANCE_ID_SEG_COUNT = 4;
|
public static final int NAMING_INSTANCE_ID_SEG_COUNT = 4;
|
||||||
|
public static final String NAMING_HTTP_HEADER_SPILIER = "\\|";
|
||||||
|
|
||||||
|
public static final String NAMING_DEFAULT_CLUSTER_NAME = "DEFAULT";
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ import com.alibaba.nacos.api.exception.NacosException;
|
|||||||
public class ConfigFactory {
|
public class ConfigFactory {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create config service
|
* Create Config
|
||||||
*
|
*
|
||||||
* @param properties init param
|
* @param properties init param
|
||||||
* @return ConfigService
|
* @return ConfigService
|
||||||
@ -47,11 +47,11 @@ public class ConfigFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create config service
|
* Create Config
|
||||||
*
|
*
|
||||||
* @param serverAddr serverlist
|
* @param serverAddr serverList
|
||||||
* @return ConfigService
|
* @return Config
|
||||||
* @throws NacosException Exception
|
* @throws ConfigService Exception
|
||||||
*/
|
*/
|
||||||
public static ConfigService createConfigService(String serverAddr) throws NacosException {
|
public static ConfigService createConfigService(String serverAddr) throws NacosException {
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
|
@ -26,7 +26,7 @@ import com.alibaba.nacos.api.exception.NacosException;
|
|||||||
public interface ConfigService {
|
public interface ConfigService {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get config
|
* Get config
|
||||||
*
|
*
|
||||||
* @param dataId dataId
|
* @param dataId dataId
|
||||||
* @param group group
|
* @param group group
|
||||||
@ -52,7 +52,7 @@ public interface ConfigService {
|
|||||||
void addListener(String dataId, String group, Listener listener) throws NacosException;
|
void addListener(String dataId, String group, Listener listener) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* publish config.
|
* Publish config.
|
||||||
*
|
*
|
||||||
* @param dataId dataId
|
* @param dataId dataId
|
||||||
* @param group group
|
* @param group group
|
||||||
@ -63,7 +63,7 @@ public interface ConfigService {
|
|||||||
boolean publishConfig(String dataId, String group, String content) throws NacosException;
|
boolean publishConfig(String dataId, String group, String content) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* remove config
|
* Remove config
|
||||||
*
|
*
|
||||||
* @param dataId dataId
|
* @param dataId dataId
|
||||||
* @param group group
|
* @param group group
|
||||||
@ -73,7 +73,7 @@ public interface ConfigService {
|
|||||||
boolean removeConfig(String dataId, String group) throws NacosException;
|
boolean removeConfig(String dataId, String group) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* remove listener
|
* Remove listener
|
||||||
*
|
*
|
||||||
* @param dataId dataId
|
* @param dataId dataId
|
||||||
* @param group group
|
* @param group group
|
||||||
@ -82,7 +82,7 @@ public interface ConfigService {
|
|||||||
void removeListener(String dataId, String group, Listener listener);
|
void removeListener(String dataId, String group, Listener listener);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get server status
|
* Get server status
|
||||||
*
|
*
|
||||||
* @return whether health
|
* @return whether health
|
||||||
*/
|
*/
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
@ -57,8 +56,7 @@ public @interface NacosConfigListener {
|
|||||||
Class<? extends NacosConfigConverter> converter() default NacosConfigConverter.class;
|
Class<? extends NacosConfigConverter> converter() default NacosConfigConverter.class;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link NacosProperties} attribute, If not specified, it will use
|
* The {@link NacosProperties} attribute, If not specified, it will use global Nacos Properties.
|
||||||
* global Nacos Properties.
|
|
||||||
*
|
*
|
||||||
* @return the default value is {@link NacosProperties}
|
* @return the default value is {@link NacosProperties}
|
||||||
*/
|
*/
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
@ -24,7 +23,6 @@ import java.lang.annotation.*;
|
|||||||
|
|
||||||
import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
|
import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An annotation for Nacos configuration Properties for binding POJO as Properties Object.
|
* An annotation for Nacos configuration Properties for binding POJO as Properties Object.
|
||||||
*
|
*
|
||||||
@ -52,51 +50,46 @@ public @interface NacosConfigurationProperties {
|
|||||||
String dataId();
|
String dataId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* It indicates the properties of current doBind bean is auto-refreshed
|
* It indicates the properties of current doBind bean is auto-refreshed when Nacos configuration is changed.
|
||||||
* when Nacos configuration is changed.
|
|
||||||
*
|
*
|
||||||
* @return default value is <code>false</code>
|
* @return default value is <code>false</code>
|
||||||
*/
|
*/
|
||||||
boolean autoRefreshed() default false;
|
boolean autoRefreshed() default false;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag to indicate that when binding to this object invalid fields should be ignored.
|
* Flag to indicate that when binding to this object invalid fields should be ignored. Invalid means invalid
|
||||||
* Invalid means invalid according to the binder that is used, and usually this means
|
* according to the binder that is used, and usually this means fields of the wrong type (or that cannot be coerced
|
||||||
* fields of the wrong type (or that cannot be coerced into the correct type).
|
* into the correct type).
|
||||||
*
|
*
|
||||||
* @return the flag value (default false)
|
* @return the flag value (default false)
|
||||||
*/
|
*/
|
||||||
boolean ignoreInvalidFields() default false;
|
boolean ignoreInvalidFields() default false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag to indicate that when binding to this object fields with periods in their
|
* Flag to indicate that when binding to this object fields with periods in their names should be ignored.
|
||||||
* names should be ignored.
|
|
||||||
*
|
*
|
||||||
* @return the flag value (default false)
|
* @return the flag value (default false)
|
||||||
*/
|
*/
|
||||||
boolean ignoreNestedProperties() default false;
|
boolean ignoreNestedProperties() default false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag to indicate that when binding to this object unknown fields should be ignored.
|
* Flag to indicate that when binding to this object unknown fields should be ignored. An unknown field could be a
|
||||||
* An unknown field could be a sign of a mistake in the Properties.
|
* sign of a mistake in the Properties.
|
||||||
*
|
*
|
||||||
* @return the flag value (default true)
|
* @return the flag value (default true)
|
||||||
*/
|
*/
|
||||||
boolean ignoreUnknownFields() default true;
|
boolean ignoreUnknownFields() default true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag to indicate that an exception should be raised if a Validator is available and
|
* Flag to indicate that an exception should be raised if a Validator is available and validation fails. If it is
|
||||||
* validation fails. If it is set to false, validation errors will be swallowed. They
|
* set to false, validation errors will be swallowed. They will be logged, but not propagated to the caller.
|
||||||
* will be logged, but not propagated to the caller.
|
|
||||||
*
|
*
|
||||||
* @return the flag value (default true)
|
* @return the flag value (default true)
|
||||||
*/
|
*/
|
||||||
boolean exceptionIfInvalid() default true;
|
boolean exceptionIfInvalid() default true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link NacosProperties} attribute, If not specified, it will use
|
* The {@link NacosProperties} attribute, If not specified, it will use global Nacos Properties.
|
||||||
* global Nacos Properties.
|
|
||||||
*
|
*
|
||||||
* @return the default value is {@link NacosProperties}
|
* @return the default value is {@link NacosProperties}
|
||||||
*/
|
*/
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
@ -19,8 +18,7 @@ package com.alibaba.nacos.api.config.annotation;
|
|||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An annotation for ignore field from annotated
|
* An annotation for ignore field from annotated {@link NacosConfigurationProperties} Properties Object.
|
||||||
* {@link NacosConfigurationProperties} Properties Object.
|
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
|
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
|
||||||
* @see NacosConfigurationProperties
|
* @see NacosConfigurationProperties
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
@ -19,9 +18,8 @@ package com.alibaba.nacos.api.config.annotation;
|
|||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An annotation for Nacos Property name of Nacos Configuration to
|
* An annotation for Nacos Property name of Nacos Configuration to bind a field from annotated {@link
|
||||||
* bind a field from annotated {@link NacosConfigurationProperties}
|
* NacosConfigurationProperties} Properties Object.
|
||||||
* Properties Object.
|
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
|
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
|
||||||
* @see NacosConfigurationProperties
|
* @see NacosConfigurationProperties
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
@ -41,5 +40,4 @@ public interface NacosConfigConverter<T> {
|
|||||||
*/
|
*/
|
||||||
T convert(String config);
|
T convert(String config);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ package com.alibaba.nacos.api.config.filter;
|
|||||||
*/
|
*/
|
||||||
public interface IConfigContext {
|
public interface IConfigContext {
|
||||||
/**
|
/**
|
||||||
* get context param by key
|
* Get context param by key
|
||||||
*
|
*
|
||||||
* @param key
|
* @param key
|
||||||
* @return context
|
* @return context
|
||||||
@ -30,7 +30,7 @@ public interface IConfigContext {
|
|||||||
Object getParameter(String key);
|
Object getParameter(String key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set context param
|
* Set context param
|
||||||
*
|
*
|
||||||
* @param key key
|
* @param key key
|
||||||
* @param value value
|
* @param value value
|
||||||
|
@ -24,7 +24,7 @@ import com.alibaba.nacos.api.exception.NacosException;
|
|||||||
*/
|
*/
|
||||||
public interface IConfigFilter {
|
public interface IConfigFilter {
|
||||||
/**
|
/**
|
||||||
* init
|
* Init
|
||||||
*
|
*
|
||||||
* @param filterConfig Filter Config
|
* @param filterConfig Filter Config
|
||||||
*/
|
*/
|
||||||
@ -47,14 +47,14 @@ public interface IConfigFilter {
|
|||||||
void deploy();
|
void deploy();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get order
|
* Get order
|
||||||
*
|
*
|
||||||
* @return order number
|
* @return order number
|
||||||
*/
|
*/
|
||||||
int getOrder();
|
int getOrder();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get filterName
|
* Get filterName
|
||||||
*
|
*
|
||||||
* @return filter name
|
* @return filter name
|
||||||
*/
|
*/
|
||||||
|
@ -24,7 +24,7 @@ import com.alibaba.nacos.api.exception.NacosException;
|
|||||||
*/
|
*/
|
||||||
public interface IConfigFilterChain {
|
public interface IConfigFilterChain {
|
||||||
/**
|
/**
|
||||||
* filter aciton
|
* Filter aciton
|
||||||
*
|
*
|
||||||
* @param request request
|
* @param request request
|
||||||
* @param response response
|
* @param response response
|
||||||
|
@ -30,7 +30,7 @@ public interface IConfigResponse {
|
|||||||
Object getParameter(String key);
|
Object getParameter(String key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get config context
|
* Get config context
|
||||||
*
|
*
|
||||||
* @return configContext
|
* @return configContext
|
||||||
*/
|
*/
|
||||||
|
@ -30,7 +30,7 @@ public interface IFilterConfig {
|
|||||||
String getFilterName();
|
String getFilterName();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get init param
|
* Get init param
|
||||||
*
|
*
|
||||||
* @param name
|
* @param name
|
||||||
* @return param
|
* @return param
|
||||||
|
@ -26,7 +26,7 @@ import java.util.concurrent.Executor;
|
|||||||
public abstract class AbstractListener implements Listener {
|
public abstract class AbstractListener implements Listener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* use default executor
|
* Use default executor
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Executor getExecutor() {
|
public Executor getExecutor() {
|
||||||
|
@ -17,7 +17,6 @@ package com.alibaba.nacos.api.config.listener;
|
|||||||
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listener for watch config
|
* Listener for watch config
|
||||||
*
|
*
|
||||||
@ -26,15 +25,14 @@ import java.util.concurrent.Executor;
|
|||||||
public interface Listener {
|
public interface Listener {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get executor for execute this receive
|
* Get executor for execute this receive
|
||||||
*
|
*
|
||||||
* @return Executor
|
* @return Executor
|
||||||
*/
|
*/
|
||||||
Executor getExecutor();
|
Executor getExecutor();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* receive config info
|
* Receive config info
|
||||||
*
|
*
|
||||||
* @param configInfo config info
|
* @param configInfo config info
|
||||||
*/
|
*/
|
||||||
|
@ -75,7 +75,6 @@ public class NacosException extends Exception {
|
|||||||
*/
|
*/
|
||||||
public static final int CLIENT_OVER_THRESHOLD = -503;
|
public static final int CLIENT_OVER_THRESHOLD = -503;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* server error code
|
* server error code
|
||||||
* 400 403 throw exception to user
|
* 400 403 throw exception to user
|
||||||
@ -107,5 +106,4 @@ public class NacosException extends Exception {
|
|||||||
*/
|
*/
|
||||||
public static final int OVER_THRESHOLD = 503;
|
public static final int OVER_THRESHOLD = 503;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ public class NamingFactory {
|
|||||||
try {
|
try {
|
||||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
||||||
Constructor constructor = driverImplClass.getConstructor(String.class);
|
Constructor constructor = driverImplClass.getConstructor(String.class);
|
||||||
NamingService vendorImpl = (NamingService) constructor.newInstance(serverList);
|
NamingService vendorImpl = (NamingService)constructor.newInstance(serverList);
|
||||||
return vendorImpl;
|
return vendorImpl;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new NacosException(-400, e.getMessage());
|
throw new NacosException(-400, e.getMessage());
|
||||||
@ -42,7 +42,7 @@ public class NamingFactory {
|
|||||||
try {
|
try {
|
||||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
||||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||||
NamingService vendorImpl = (NamingService) constructor.newInstance(properties);
|
NamingService vendorImpl = (NamingService)constructor.newInstance(properties);
|
||||||
return vendorImpl;
|
return vendorImpl;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
throw new NacosException(-400, e.getMessage());
|
throw new NacosException(-400, e.getMessage());
|
||||||
|
@ -20,6 +20,7 @@ import com.alibaba.nacos.api.naming.listener.EventListener;
|
|||||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||||
import com.alibaba.nacos.api.naming.pojo.ListView;
|
import com.alibaba.nacos.api.naming.pojo.ListView;
|
||||||
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
||||||
|
import com.alibaba.nacos.api.selector.AbstractSelector;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -189,7 +190,22 @@ public interface NamingService {
|
|||||||
ListView<String> getServicesOfServer(int pageNo, int pageSize) throws NacosException;
|
ListView<String> getServicesOfServer(int pageNo, int pageSize) throws NacosException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
<<<<<<< HEAD
|
||||||
* get all subscribed services of current client
|
* get all subscribed services of current client
|
||||||
|
=======
|
||||||
|
* Get all service names from server
|
||||||
|
*
|
||||||
|
* @param pageNo page index
|
||||||
|
* @param pageSize page size
|
||||||
|
* @param selector selector to filter the resource
|
||||||
|
* @return list of service names
|
||||||
|
* @throws NacosException
|
||||||
|
*/
|
||||||
|
ListView<String> getServicesOfServer(int pageNo, int pageSize, AbstractSelector selector) throws NacosException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all subscribed services of current client
|
||||||
|
>>>>>>> upstream/develop
|
||||||
*
|
*
|
||||||
* @return subscribed services
|
* @return subscribed services
|
||||||
* @throws NacosException
|
* @throws NacosException
|
||||||
|
@ -15,10 +15,17 @@
|
|||||||
*/
|
*/
|
||||||
package com.alibaba.nacos.api.naming.pojo;
|
package com.alibaba.nacos.api.naming.pojo;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
|
import com.alibaba.nacos.api.common.Constants;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author dungu.zpf
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
*/
|
*/
|
||||||
public abstract class AbstractHealthChecker implements Cloneable {
|
public abstract class AbstractHealthChecker implements Cloneable {
|
||||||
|
|
||||||
@ -32,6 +39,14 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone all fields of this instance to another one
|
||||||
|
*
|
||||||
|
* @return Another instance with exactly the same fields.
|
||||||
|
* @throws CloneNotSupportedException
|
||||||
|
*/
|
||||||
|
public abstract AbstractHealthChecker clone() throws CloneNotSupportedException;
|
||||||
|
|
||||||
public static class Http extends AbstractHealthChecker {
|
public static class Http extends AbstractHealthChecker {
|
||||||
public static final String TYPE = "HTTP";
|
public static final String TYPE = "HTTP";
|
||||||
|
|
||||||
@ -68,6 +83,25 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
this.headers = headers;
|
this.headers = headers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JSONField(serialize = false)
|
||||||
|
public Map<String, String> getCustomHeaders() {
|
||||||
|
if (StringUtils.isBlank(headers)) {
|
||||||
|
return Collections.emptyMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, String> headerMap = new HashMap<String, String>(16);
|
||||||
|
for (String s : headers.split(Constants.NAMING_HTTP_HEADER_SPILIER)) {
|
||||||
|
String[] splits = s.split(":");
|
||||||
|
if (splits.length != 2) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
headerMap.put(StringUtils.trim(splits[0]), StringUtils.trim(splits[1]));
|
||||||
|
}
|
||||||
|
|
||||||
|
return headerMap;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(path, headers, expectedResponseCode);
|
return Objects.hash(path, headers, expectedResponseCode);
|
||||||
@ -79,7 +113,7 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Http other = (Http) obj;
|
Http other = (Http)obj;
|
||||||
|
|
||||||
if (!strEquals(type, other.getType())) {
|
if (!strEquals(type, other.getType())) {
|
||||||
return false;
|
return false;
|
||||||
@ -93,6 +127,18 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
}
|
}
|
||||||
return expectedResponseCode == other.getExpectedResponseCode();
|
return expectedResponseCode == other.getExpectedResponseCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Http clone() throws CloneNotSupportedException {
|
||||||
|
Http config = new Http();
|
||||||
|
|
||||||
|
config.setPath(this.getPath());
|
||||||
|
config.setHeaders(this.getHeaders());
|
||||||
|
config.setType(this.getType());
|
||||||
|
config.setExpectedResponseCode(this.getExpectedResponseCode());
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Tcp extends AbstractHealthChecker {
|
public static class Tcp extends AbstractHealthChecker {
|
||||||
@ -112,6 +158,12 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
return obj instanceof Tcp;
|
return obj instanceof Tcp;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Tcp clone() throws CloneNotSupportedException {
|
||||||
|
Tcp config = new Tcp();
|
||||||
|
config.setType(this.type);
|
||||||
|
return config;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Mysql extends AbstractHealthChecker {
|
public static class Mysql extends AbstractHealthChecker {
|
||||||
@ -160,7 +212,7 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mysql other = (Mysql) obj;
|
Mysql other = (Mysql)obj;
|
||||||
|
|
||||||
if (!strEquals(user, other.getUser())) {
|
if (!strEquals(user, other.getUser())) {
|
||||||
return false;
|
return false;
|
||||||
@ -173,6 +225,17 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
|||||||
return strEquals(cmd, other.getCmd());
|
return strEquals(cmd, other.getCmd());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Mysql clone() throws CloneNotSupportedException {
|
||||||
|
Mysql config = new Mysql();
|
||||||
|
config.setUser(this.getUser());
|
||||||
|
config.setPwd(this.getPwd());
|
||||||
|
config.setCmd(this.getCmd());
|
||||||
|
config.setType(this.getType());
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean strEquals(String str1, String str2) {
|
private static boolean strEquals(String str1, String str2) {
|
||||||
|
@ -19,6 +19,7 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
<<<<<<< HEAD
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @author dungu.zpf
|
* @author dungu.zpf
|
||||||
@ -33,7 +34,7 @@ public class Cluster {
|
|||||||
/**
|
/**
|
||||||
* Name of cluster
|
* Name of cluster
|
||||||
*/
|
*/
|
||||||
private String name = "";
|
private String name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Health check config of this cluster
|
* Health check config of this cluster
|
||||||
@ -55,7 +56,6 @@ public class Cluster {
|
|||||||
*/
|
*/
|
||||||
private boolean useIPPort4Check = true;
|
private boolean useIPPort4Check = true;
|
||||||
|
|
||||||
|
|
||||||
private Map<String, String> metadata = new HashMap<String, String>();
|
private Map<String, String> metadata = new HashMap<String, String>();
|
||||||
|
|
||||||
public Cluster() {
|
public Cluster() {
|
||||||
|
@ -17,7 +17,6 @@ package com.alibaba.nacos.api.naming.pojo;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.annotation.JSONField;
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
import com.alibaba.nacos.api.common.Constants;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -55,17 +54,17 @@ public class Instance {
|
|||||||
@JSONField(name = "valid")
|
@JSONField(name = "valid")
|
||||||
private boolean healthy = true;
|
private boolean healthy = true;
|
||||||
|
|
||||||
|
private boolean enabled = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cluster information of instance
|
* cluster information of instance
|
||||||
*/
|
*/
|
||||||
@JSONField(serialize = false)
|
private String clusterName;
|
||||||
private Cluster cluster = new Cluster();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* service information of instance
|
* Service information of instance
|
||||||
*/
|
*/
|
||||||
@JSONField(serialize = false)
|
private String serviceName;
|
||||||
private Service service;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* user extended attributes
|
* user extended attributes
|
||||||
@ -80,14 +79,6 @@ public class Instance {
|
|||||||
this.instanceId = instanceId;
|
this.instanceId = instanceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String serviceName() {
|
|
||||||
String[] infos = instanceId.split(Constants.NAMING_INSTANCE_ID_SPLITTER);
|
|
||||||
if (infos.length < Constants.NAMING_INSTANCE_ID_SEG_COUNT) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return infos[Constants.NAMING_INSTANCE_ID_SEG_COUNT - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getIp() {
|
public String getIp() {
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
@ -120,20 +111,20 @@ public class Instance {
|
|||||||
this.healthy = healthy;
|
this.healthy = healthy;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Cluster getCluster() {
|
public String getClusterName() {
|
||||||
return cluster;
|
return clusterName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCluster(Cluster cluster) {
|
public void setClusterName(String clusterName) {
|
||||||
this.cluster = cluster;
|
this.clusterName = clusterName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Service getService() {
|
public String getServiceName() {
|
||||||
return service;
|
return serviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setService(Service service) {
|
public void setServiceName(String serviceName) {
|
||||||
this.service = service;
|
this.serviceName = serviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, String> getMetadata() {
|
public Map<String, String> getMetadata() {
|
||||||
@ -148,6 +139,14 @@ public class Instance {
|
|||||||
this.metadata.put(key, value);
|
this.metadata.put(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(boolean enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return JSON.toJSONString(this);
|
return JSON.toJSONString(this);
|
||||||
@ -163,7 +162,7 @@ public class Instance {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance host = (Instance) obj;
|
Instance host = (Instance)obj;
|
||||||
|
|
||||||
return strEquals(toString(), host.toString());
|
return strEquals(toString(), host.toString());
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.alibaba.nacos.api.naming.pojo;
|
package com.alibaba.nacos.api.naming.pojo;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.selector.AbstractSelector;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@ -41,21 +43,26 @@ public class Service {
|
|||||||
private String app;
|
private String app;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* service group which is meant to classify services into different sets.
|
* Service group which is meant to classify services into different sets.
|
||||||
*/
|
*/
|
||||||
private String group;
|
private String group;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* health check mode.
|
* Health check mode.
|
||||||
*/
|
*/
|
||||||
private String healthCheckMode;
|
private String healthCheckMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selector name of this service
|
||||||
|
*/
|
||||||
|
private AbstractSelector selector;
|
||||||
|
|
||||||
|
private Map<String, String> metadata = new HashMap<String, String>();
|
||||||
|
|
||||||
public Service(String name) {
|
public Service(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, String> metadata = new HashMap<String, String>();
|
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
@ -107,4 +114,12 @@ public class Service {
|
|||||||
public void addMetadata(String key, String value) {
|
public void addMetadata(String key, String value) {
|
||||||
this.metadata.put(key, value);
|
this.metadata.put(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AbstractSelector getSelector() {
|
||||||
|
return selector;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelector(AbstractSelector selector) {
|
||||||
|
this.selector = selector;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@ package com.alibaba.nacos.api.naming.pojo;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.annotation.JSONField;
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
|
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -193,6 +195,15 @@ public class ServiceInfo {
|
|||||||
return getKey(name, clusters, env, isAllIPs());
|
return getKey(name, clusters, env, isAllIPs());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JSONField(serialize = false)
|
||||||
|
public String getKeyEncoded() {
|
||||||
|
try {
|
||||||
|
return getKey(URLEncoder.encode(name, "UTF-8"), clusters, env, isAllIPs());
|
||||||
|
} catch (UnsupportedEncodingException e) {
|
||||||
|
return getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@JSONField(serialize = false)
|
@JSONField(serialize = false)
|
||||||
public static String getKey(String name, String clusters, String unit) {
|
public static String getKey(String name, String clusters, String unit) {
|
||||||
return getKey(name, clusters, unit, false);
|
return getKey(name, clusters, unit, false);
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.selector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract selector that only contains a type
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public abstract class AbstractSelector {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of this selector, each child class should announce its own unique type.
|
||||||
|
*/
|
||||||
|
private String type;
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.selector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The selector to filter resource with flexible expression.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public class ExpressionSelector extends AbstractSelector {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Label expression of this selector.
|
||||||
|
*/
|
||||||
|
private String expression;
|
||||||
|
|
||||||
|
public ExpressionSelector() {
|
||||||
|
this.setType(SelectorType.label.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getExpression() {
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExpression(String expression) {
|
||||||
|
this.expression = expression;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.nacos.api.selector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The types of selector accepted by Nacos
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||||
|
*/
|
||||||
|
public enum SelectorType {
|
||||||
|
/**
|
||||||
|
* not match any type
|
||||||
|
*/
|
||||||
|
unknown,
|
||||||
|
/**
|
||||||
|
* not filter out any entity
|
||||||
|
*/
|
||||||
|
none,
|
||||||
|
/**
|
||||||
|
* select by label
|
||||||
|
*/
|
||||||
|
label
|
||||||
|
}
|
@ -1,10 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
*
|
||||||
* this work for additional information regarding copyright ownership.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
* you may not use this file except in compliance with the License.
|
||||||
* (the "License"); you may not use this file except in compliance with
|
* You may obtain a copy of the License at
|
||||||
* the License. You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*
|
*
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.alibaba.nacos</groupId>
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
<artifactId>nacos-all</artifactId>
|
<artifactId>nacos-all</artifactId>
|
||||||
<version>0.2.1</version>
|
<version>0.7.0</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@ -32,67 +33,46 @@
|
|||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
<scope>provided</scope>
|
<optional>true</optional>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>log4j</groupId>
|
|
||||||
<artifactId>log4j</artifactId>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.logging.log4j</groupId>
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
<artifactId>log4j-core</artifactId>
|
<artifactId>log4j-core</artifactId>
|
||||||
<version>2.8.2</version>
|
<version>2.8.2</version>
|
||||||
<scope>provided</scope>
|
<optional>true</optional>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-logging</groupId>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>slf4j-log4j12</artifactId>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.logging.log4j</groupId>
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
<artifactId>log4j-slf4j-impl</artifactId>
|
<artifactId>log4j-slf4j-impl</artifactId>
|
||||||
<scope>provided</scope>
|
<optional>true</optional>
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>jcl-over-slf4j</artifactId>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>junit</groupId>
|
|
||||||
<artifactId>junit</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>${project.groupId}</groupId>
|
<groupId>${project.groupId}</groupId>
|
||||||
<artifactId>nacos-common</artifactId>
|
<artifactId>nacos-common</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>${project.groupId}</groupId>
|
<groupId>${project.groupId}</groupId>
|
||||||
<artifactId>nacos-api</artifactId>
|
<artifactId>nacos-api</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.alibaba</groupId>
|
|
||||||
<artifactId>fastjson</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>ch.qos.logback</groupId>
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<groupId>ch.qos.logback</groupId>
|
||||||
<artifactId>logback-core</artifactId>
|
<artifactId>logback-core</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@ -114,11 +94,18 @@
|
|||||||
<artifactId>jcip-annotations</artifactId>
|
<artifactId>jcip-annotations</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.spotbugs</groupId>
|
<groupId>com.github.spotbugs</groupId>
|
||||||
<artifactId>spotbugs-annotations</artifactId>
|
<artifactId>spotbugs-annotations</artifactId>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
|
@ -44,8 +44,8 @@ import java.util.Properties;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Config Impl
|
* Config Impl
|
||||||
* @author Nacos
|
|
||||||
*
|
*
|
||||||
|
* @author Nacos
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ServiceOrDaoClassShouldEndWithImplRule")
|
@SuppressWarnings("PMD.ServiceOrDaoClassShouldEndWithImplRule")
|
||||||
public class NacosConfigService implements ConfigService {
|
public class NacosConfigService implements ConfigService {
|
||||||
|
@ -18,8 +18,7 @@ package com.alibaba.nacos.client.config.common;
|
|||||||
import com.alibaba.nacos.client.utils.StringUtils;
|
import com.alibaba.nacos.client.utils.StringUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synthesize the form of dataId+groupId. Escapes reserved characters in dataId
|
* Synthesize the form of dataId+groupId. Escapes reserved characters in dataId and groupId.
|
||||||
* and groupId.
|
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*/
|
*/
|
||||||
@ -100,12 +99,11 @@ public class GroupKey {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new String[] { dataId, group, tenant };
|
return new String[] {dataId, group, tenant};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* + -> %2B
|
* + -> %2B % -> %25
|
||||||
* % -> %25
|
|
||||||
*/
|
*/
|
||||||
static void urlEncode(String str, StringBuilder sb) {
|
static void urlEncode(String str, StringBuilder sb) {
|
||||||
for (int idx = 0; idx < str.length(); ++idx) {
|
for (int idx = 0; idx < str.length(); ++idx) {
|
||||||
|
@ -24,7 +24,6 @@ import com.alibaba.nacos.api.config.filter.IConfigContext;
|
|||||||
* Config Context
|
* Config Context
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ConfigContext implements IConfigContext {
|
public class ConfigContext implements IConfigContext {
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ import com.google.common.collect.Lists;
|
|||||||
* Config Filter Chain Management
|
* Config Filter Chain Management
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ConfigFilterChainManager implements IConfigFilterChain {
|
public class ConfigFilterChainManager implements IConfigFilterChain {
|
||||||
|
|
||||||
@ -56,7 +55,6 @@ public class ConfigFilterChainManager implements IConfigFilterChain {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {
|
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {
|
||||||
new VirtualFilterChain(this.filters).doFilter(request, response);
|
new VirtualFilterChain(this.filters).doFilter(request, response);
|
||||||
|
@ -25,7 +25,6 @@ import com.alibaba.nacos.api.config.filter.IConfigRequest;
|
|||||||
* Config Request
|
* Config Request
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ConfigRequest implements IConfigRequest {
|
public class ConfigRequest implements IConfigRequest {
|
||||||
|
|
||||||
@ -34,7 +33,7 @@ public class ConfigRequest implements IConfigRequest {
|
|||||||
private IConfigContext configContext = new ConfigContext();
|
private IConfigContext configContext = new ConfigContext();
|
||||||
|
|
||||||
public String getTenant() {
|
public String getTenant() {
|
||||||
return (String) param.get("tenant");
|
return (String)param.get("tenant");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTenant(String tenant) {
|
public void setTenant(String tenant) {
|
||||||
@ -42,7 +41,7 @@ public class ConfigRequest implements IConfigRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getDataId() {
|
public String getDataId() {
|
||||||
return (String) param.get("dataId");
|
return (String)param.get("dataId");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDataId(String dataId) {
|
public void setDataId(String dataId) {
|
||||||
@ -50,7 +49,7 @@ public class ConfigRequest implements IConfigRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getGroup() {
|
public String getGroup() {
|
||||||
return (String) param.get("group");
|
return (String)param.get("group");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGroup(String group) {
|
public void setGroup(String group) {
|
||||||
@ -58,7 +57,7 @@ public class ConfigRequest implements IConfigRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getContent() {
|
public String getContent() {
|
||||||
return (String) param.get("content");
|
return (String)param.get("content");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setContent(String content) {
|
public void setContent(String content) {
|
||||||
|
@ -25,7 +25,6 @@ import com.alibaba.nacos.api.config.filter.IConfigResponse;
|
|||||||
* Config Response
|
* Config Response
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ConfigResponse implements IConfigResponse {
|
public class ConfigResponse implements IConfigResponse {
|
||||||
|
|
||||||
@ -34,7 +33,7 @@ public class ConfigResponse implements IConfigResponse {
|
|||||||
private IConfigContext configContext = new ConfigContext();
|
private IConfigContext configContext = new ConfigContext();
|
||||||
|
|
||||||
public String getTenant() {
|
public String getTenant() {
|
||||||
return (String) param.get("tenant");
|
return (String)param.get("tenant");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTenant(String tenant) {
|
public void setTenant(String tenant) {
|
||||||
@ -42,7 +41,7 @@ public class ConfigResponse implements IConfigResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getDataId() {
|
public String getDataId() {
|
||||||
return (String) param.get("dataId");
|
return (String)param.get("dataId");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDataId(String dataId) {
|
public void setDataId(String dataId) {
|
||||||
@ -50,7 +49,7 @@ public class ConfigResponse implements IConfigResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getGroup() {
|
public String getGroup() {
|
||||||
return (String) param.get("group");
|
return (String)param.get("group");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGroup(String group) {
|
public void setGroup(String group) {
|
||||||
@ -58,7 +57,7 @@ public class ConfigResponse implements IConfigResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getContent() {
|
public String getContent() {
|
||||||
return (String) param.get("content");
|
return (String)param.get("content");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setContent(String content) {
|
public void setContent(String content) {
|
||||||
|
@ -34,7 +34,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
* Listner Management
|
* Listner Management
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class CacheData {
|
public class CacheData {
|
||||||
|
|
||||||
@ -68,8 +67,7 @@ public class CacheData {
|
|||||||
/**
|
/**
|
||||||
* Add listener
|
* Add listener
|
||||||
*
|
*
|
||||||
* @param listener
|
* @param listener listener
|
||||||
* listener
|
|
||||||
*/
|
*/
|
||||||
public void addListener(Listener listener) {
|
public void addListener(Listener listener) {
|
||||||
if (null == listener) {
|
if (null == listener) {
|
||||||
@ -103,18 +101,18 @@ public class CacheData {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public long getLocalConfigInfoVersion() {
|
public long getLocalConfigInfoVersion() {
|
||||||
return localConfigLastModified;
|
return localConfigLastModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setLocalConfigInfoVersion(long localConfigLastModified) {
|
public void setLocalConfigInfoVersion(long localConfigLastModified) {
|
||||||
this.localConfigLastModified = localConfigLastModified;
|
this.localConfigLastModified = localConfigLastModified;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public boolean isUseLocalConfigInfo() {
|
public boolean isUseLocalConfigInfo() {
|
||||||
return isUseLocalConfig;
|
return isUseLocalConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setUseLocalConfigInfo(boolean useLocalConfigInfo) {
|
public void setUseLocalConfigInfo(boolean useLocalConfigInfo) {
|
||||||
this.isUseLocalConfig = useLocalConfigInfo;
|
this.isUseLocalConfig = useLocalConfigInfo;
|
||||||
if (!useLocalConfigInfo) {
|
if (!useLocalConfigInfo) {
|
||||||
@ -147,7 +145,7 @@ public class CacheData {
|
|||||||
if (this == obj) {
|
if (this == obj) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
CacheData other = (CacheData) obj;
|
CacheData other = (CacheData)obj;
|
||||||
return dataId.equals(other.dataId) && group.equals(other.group);
|
return dataId.equals(other.dataId) && group.equals(other.group);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,10 +169,10 @@ public class CacheData {
|
|||||||
Runnable job = new Runnable() {
|
Runnable job = new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
|
ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
|
||||||
ClassLoader appClassLoader= listener.getClass().getClassLoader();
|
ClassLoader appClassLoader = listener.getClass().getClassLoader();
|
||||||
try {
|
try {
|
||||||
if(listener instanceof AbstractSharedListener){
|
if (listener instanceof AbstractSharedListener) {
|
||||||
AbstractSharedListener adapter = (AbstractSharedListener) listener;
|
AbstractSharedListener adapter = (AbstractSharedListener)listener;
|
||||||
adapter.fillContext(dataId, group);
|
adapter.fillContext(dataId, group);
|
||||||
log.info(name, "[notify-context] dataId={}, group={}, md5={}", dataId, group, md5);
|
log.info(name, "[notify-context] dataId={}, group={}, md5={}", dataId, group, md5);
|
||||||
}
|
}
|
||||||
@ -201,9 +199,7 @@ public class CacheData {
|
|||||||
log.error(name, "NACOS-XXXX",
|
log.error(name, "NACOS-XXXX",
|
||||||
"[notify-error] dataId={}, group={}, md5={}, listener={} tx={}", dataId, group, md5,
|
"[notify-error] dataId={}, group={}, md5={}, listener={} tx={}", dataId, group, md5,
|
||||||
listener, t.getCause());
|
listener, t.getCause());
|
||||||
}
|
} finally {
|
||||||
finally
|
|
||||||
{
|
|
||||||
Thread.currentThread().setContextClassLoader(myClassLoader);
|
Thread.currentThread().setContextClassLoader(myClassLoader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -224,7 +220,8 @@ public class CacheData {
|
|||||||
dataId, group, md5, listener, t.getCause());
|
dataId, group, md5, listener, t.getCause());
|
||||||
}
|
}
|
||||||
final long finishNotify = System.currentTimeMillis();
|
final long finishNotify = System.currentTimeMillis();
|
||||||
log.info(name, "[notify-listener] time cost={}ms in ClientWorker, dataId={}, group={}, md5={}, listener={} ",(finishNotify - startNotify), dataId ,group, md5, listener);
|
log.info(name, "[notify-listener] time cost={}ms in ClientWorker, dataId={}, group={}, md5={}, listener={} ",
|
||||||
|
(finishNotify - startNotify), dataId, group, md5, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
static public String getMd5String(String config) {
|
static public String getMd5String(String config) {
|
||||||
@ -253,7 +250,8 @@ public class CacheData {
|
|||||||
this.md5 = getMd5String(content);
|
this.md5 = getMd5String(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group, String tenant) {
|
public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group,
|
||||||
|
String tenant) {
|
||||||
if (null == dataId || null == group) {
|
if (null == dataId || null == group) {
|
||||||
throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group);
|
throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group);
|
||||||
}
|
}
|
||||||
@ -307,7 +305,7 @@ class ManagerListenerWrap {
|
|||||||
if (obj == this) {
|
if (obj == this) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
ManagerListenerWrap other = (ManagerListenerWrap) obj;
|
ManagerListenerWrap other = (ManagerListenerWrap)obj;
|
||||||
return listener.equals(other.listener);
|
return listener.equals(other.listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,6 @@ import static com.alibaba.nacos.api.common.Constants.WORD_SEPARATOR;
|
|||||||
* Longpulling
|
* Longpulling
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ClientWorker {
|
public class ClientWorker {
|
||||||
|
|
||||||
@ -128,12 +127,12 @@ public class ClientWorker {
|
|||||||
CacheData cacheFromMap = getCache(dataId, group);
|
CacheData cacheFromMap = getCache(dataId, group);
|
||||||
// multiple listeners on the same dataid+group and race condition,so double check again
|
// multiple listeners on the same dataid+group and race condition,so double check again
|
||||||
//other listener thread beat me to set to cacheMap
|
//other listener thread beat me to set to cacheMap
|
||||||
if(null != cacheFromMap) {
|
if (null != cacheFromMap) {
|
||||||
cache = cacheFromMap;
|
cache = cacheFromMap;
|
||||||
//reset so that server not hang this check
|
//reset so that server not hang this check
|
||||||
cache.setInitializing(true);
|
cache.setInitializing(true);
|
||||||
} else {
|
} else {
|
||||||
int taskId = cacheMap.get().size() / (int) ParamUtil.getPerTaskConfigSize();
|
int taskId = cacheMap.get().size() / (int)ParamUtil.getPerTaskConfigSize();
|
||||||
cache.setTaskId(taskId);
|
cache.setTaskId(taskId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,6 +145,7 @@ public class ClientWorker {
|
|||||||
|
|
||||||
return cache;
|
return cache;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||||
public CacheData addCacheDataIfAbsent(String dataId, String group, String tenant) {
|
public CacheData addCacheDataIfAbsent(String dataId, String group, String tenant) {
|
||||||
CacheData cache = getCache(dataId, group, tenant);
|
CacheData cache = getCache(dataId, group, tenant);
|
||||||
@ -184,7 +184,6 @@ public class ClientWorker {
|
|||||||
return cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
|
return cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getServerConfig(String dataId, String group, String tenant, long readTimeout)
|
public String getServerConfig(String dataId, String group, String tenant, long readTimeout)
|
||||||
throws NacosException {
|
throws NacosException {
|
||||||
if (StringUtils.isBlank(group)) {
|
if (StringUtils.isBlank(group)) {
|
||||||
@ -286,9 +285,9 @@ public class ClientWorker {
|
|||||||
// 分任务
|
// 分任务
|
||||||
int listenerSize = cacheMap.get().size();
|
int listenerSize = cacheMap.get().size();
|
||||||
// 向上取整为批数
|
// 向上取整为批数
|
||||||
int longingTaskCount = (int) Math.ceil(listenerSize / ParamUtil.getPerTaskConfigSize());
|
int longingTaskCount = (int)Math.ceil(listenerSize / ParamUtil.getPerTaskConfigSize());
|
||||||
if (longingTaskCount > currentLongingTaskCount) {
|
if (longingTaskCount > currentLongingTaskCount) {
|
||||||
for (int i = (int) currentLongingTaskCount; i < longingTaskCount; i++) {
|
for (int i = (int)currentLongingTaskCount; i < longingTaskCount; i++) {
|
||||||
// 要判断任务是否在执行 这块需要好好想想。 任务列表现在是无序的。变化过程可能有问题
|
// 要判断任务是否在执行 这块需要好好想想。 任务列表现在是无序的。变化过程可能有问题
|
||||||
executorService.execute(new LongPullingRunnable(i));
|
executorService.execute(new LongPullingRunnable(i));
|
||||||
}
|
}
|
||||||
@ -521,7 +520,8 @@ public class ClientWorker {
|
|||||||
/**
|
/**
|
||||||
* groupKey -> cacheData
|
* groupKey -> cacheData
|
||||||
*/
|
*/
|
||||||
AtomicReference<Map<String, CacheData>> cacheMap = new AtomicReference<Map<String, CacheData>>(new HashMap<String, CacheData>());
|
AtomicReference<Map<String, CacheData>> cacheMap = new AtomicReference<Map<String, CacheData>>(
|
||||||
|
new HashMap<String, CacheData>());
|
||||||
ServerHttpAgent agent;
|
ServerHttpAgent agent;
|
||||||
ConfigFilterChainManager configFilterChainManager;
|
ConfigFilterChainManager configFilterChainManager;
|
||||||
private boolean isHealthServer = true;
|
private boolean isHealthServer = true;
|
||||||
|
@ -24,12 +24,10 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
import com.alibaba.nacos.client.config.utils.LogUtils;
|
import com.alibaba.nacos.client.config.utils.LogUtils;
|
||||||
import com.alibaba.nacos.client.logger.Logger;
|
import com.alibaba.nacos.client.logger.Logger;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event subscription and publishing tools.
|
* Event subscription and publishing tools.
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class EventDispatcher {
|
public class EventDispatcher {
|
||||||
|
|
||||||
@ -85,7 +83,8 @@ public class EventDispatcher {
|
|||||||
|
|
||||||
// ========================
|
// ========================
|
||||||
|
|
||||||
static final Map<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>> LISTENER_MAP = new HashMap<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>>();
|
static final Map<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>> LISTENER_MAP
|
||||||
|
= new HashMap<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>>();
|
||||||
|
|
||||||
// ========================
|
// ========================
|
||||||
|
|
||||||
@ -120,6 +119,7 @@ public class EventDispatcher {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理事件
|
* 处理事件
|
||||||
|
*
|
||||||
* @param abstractEvent event to do
|
* @param abstractEvent event to do
|
||||||
*/
|
*/
|
||||||
abstract public void onEvent(AbstractEvent abstractEvent);
|
abstract public void onEvent(AbstractEvent abstractEvent);
|
||||||
|
@ -20,7 +20,7 @@ import com.alibaba.nacos.api.exception.NacosException;
|
|||||||
import com.alibaba.nacos.client.config.utils.IOUtils;
|
import com.alibaba.nacos.client.config.utils.IOUtils;
|
||||||
import com.alibaba.nacos.client.config.utils.MD5;
|
import com.alibaba.nacos.client.config.utils.MD5;
|
||||||
import com.alibaba.nacos.client.utils.ParamUtil;
|
import com.alibaba.nacos.client.utils.ParamUtil;
|
||||||
import com.alibaba.nacos.common.util.UuidUtil;
|
import com.alibaba.nacos.common.util.UuidUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
@ -40,9 +40,8 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class HttpSimpleClient {
|
public class HttpSimpleClient {
|
||||||
|
|
||||||
|
|
||||||
static public HttpResult httpGet(String url, List<String> headers, List<String> paramValues,
|
static public HttpResult httpGet(String url, List<String> headers, List<String> paramValues,
|
||||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException{
|
String encoding, long readTimeoutMs, boolean isSSL) throws IOException {
|
||||||
String encodedContent = encodingParams(paramValues, encoding);
|
String encodedContent = encodingParams(paramValues, encoding);
|
||||||
url += (null == encodedContent) ? "" : ("?" + encodedContent);
|
url += (null == encodedContent) ? "" : ("?" + encodedContent);
|
||||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||||
@ -54,10 +53,10 @@ public class HttpSimpleClient {
|
|||||||
HttpURLConnection conn = null;
|
HttpURLConnection conn = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||||
conn.setRequestMethod("GET");
|
conn.setRequestMethod("GET");
|
||||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||||
conn.setReadTimeout((int) readTimeoutMs);
|
conn.setReadTimeout((int)readTimeoutMs);
|
||||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||||
setHeaders(conn, newHeaders, encoding);
|
setHeaders(conn, newHeaders, encoding);
|
||||||
|
|
||||||
@ -79,7 +78,6 @@ public class HttpSimpleClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送GET请求。
|
* 发送GET请求。
|
||||||
*/
|
*/
|
||||||
@ -92,16 +90,11 @@ public class HttpSimpleClient {
|
|||||||
* 发送POST请求。
|
* 发送POST请求。
|
||||||
*
|
*
|
||||||
* @param url
|
* @param url
|
||||||
* @param headers
|
* @param headers 请求Header,可以为null
|
||||||
* 请求Header,可以为null
|
* @param paramValues 参数,可以为null
|
||||||
* @param paramValues
|
* @param encoding URL编码使用的字符集
|
||||||
* 参数,可以为null
|
* @param readTimeoutMs 响应超时
|
||||||
* @param encoding
|
* @param isSSL 是否https
|
||||||
* URL编码使用的字符集
|
|
||||||
* @param readTimeoutMs
|
|
||||||
* 响应超时
|
|
||||||
* @param isSSL
|
|
||||||
* 是否https
|
|
||||||
* @return
|
* @return
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
@ -115,10 +108,10 @@ public class HttpSimpleClient {
|
|||||||
}
|
}
|
||||||
HttpURLConnection conn = null;
|
HttpURLConnection conn = null;
|
||||||
try {
|
try {
|
||||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||||
conn.setRequestMethod("POST");
|
conn.setRequestMethod("POST");
|
||||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 3000 ? ParamUtil.getConnectTimeout() : 3000);
|
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 3000 ? ParamUtil.getConnectTimeout() : 3000);
|
||||||
conn.setReadTimeout((int) readTimeoutMs);
|
conn.setReadTimeout((int)readTimeoutMs);
|
||||||
conn.setDoOutput(true);
|
conn.setDoOutput(true);
|
||||||
conn.setDoInput(true);
|
conn.setDoInput(true);
|
||||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||||
@ -146,14 +139,10 @@ public class HttpSimpleClient {
|
|||||||
* 发送POST请求。
|
* 发送POST请求。
|
||||||
*
|
*
|
||||||
* @param url
|
* @param url
|
||||||
* @param headers
|
* @param headers 请求Header,可以为null
|
||||||
* 请求Header,可以为null
|
* @param paramValues 参数,可以为null
|
||||||
* @param paramValues
|
* @param encoding URL编码使用的字符集
|
||||||
* 参数,可以为null
|
* @param readTimeoutMs 响应超时
|
||||||
* @param encoding
|
|
||||||
* URL编码使用的字符集
|
|
||||||
* @param readTimeoutMs
|
|
||||||
* 响应超时
|
|
||||||
* @return
|
* @return
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
@ -162,9 +151,8 @@ public class HttpSimpleClient {
|
|||||||
return httpPost(url, headers, paramValues, encoding, readTimeoutMs, false);
|
return httpPost(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues,
|
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues,
|
||||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException{
|
String encoding, long readTimeoutMs, boolean isSSL) throws IOException {
|
||||||
String encodedContent = encodingParams(paramValues, encoding);
|
String encodedContent = encodingParams(paramValues, encoding);
|
||||||
url += (null == encodedContent) ? "" : ("?" + encodedContent);
|
url += (null == encodedContent) ? "" : ("?" + encodedContent);
|
||||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||||
@ -176,10 +164,10 @@ public class HttpSimpleClient {
|
|||||||
HttpURLConnection conn = null;
|
HttpURLConnection conn = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||||
conn.setRequestMethod("DELETE");
|
conn.setRequestMethod("DELETE");
|
||||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||||
conn.setReadTimeout((int) readTimeoutMs);
|
conn.setReadTimeout((int)readTimeoutMs);
|
||||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||||
setHeaders(conn, newHeaders, encoding);
|
setHeaders(conn, newHeaders, encoding);
|
||||||
|
|
||||||
@ -201,7 +189,6 @@ public class HttpSimpleClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues, String encoding,
|
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||||
long readTimeoutMs) throws IOException {
|
long readTimeoutMs) throws IOException {
|
||||||
return httpGet(url, headers, paramValues, encoding, readTimeoutMs, false);
|
return httpGet(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||||
@ -209,7 +196,7 @@ public class HttpSimpleClient {
|
|||||||
|
|
||||||
static private void setHeaders(HttpURLConnection conn, List<String> headers, String encoding) {
|
static private void setHeaders(HttpURLConnection conn, List<String> headers, String encoding) {
|
||||||
if (null != headers) {
|
if (null != headers) {
|
||||||
for (Iterator<String> iter = headers.iterator(); iter.hasNext();) {
|
for (Iterator<String> iter = headers.iterator(); iter.hasNext(); ) {
|
||||||
conn.addRequestProperty(iter.next(), iter.next());
|
conn.addRequestProperty(iter.next(), iter.next());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,8 +217,8 @@ public class HttpSimpleClient {
|
|||||||
newHeaders.add("exConfigInfo");
|
newHeaders.add("exConfigInfo");
|
||||||
newHeaders.add("true");
|
newHeaders.add("true");
|
||||||
newHeaders.add("RequestId");
|
newHeaders.add("RequestId");
|
||||||
newHeaders.add(UuidUtil.generateUuid());
|
newHeaders.add(UuidUtils.generateUuid());
|
||||||
if (headers!=null) {
|
if (headers != null) {
|
||||||
newHeaders.addAll(headers);
|
newHeaders.addAll(headers);
|
||||||
}
|
}
|
||||||
return newHeaders;
|
return newHeaders;
|
||||||
@ -244,7 +231,7 @@ public class HttpSimpleClient {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext();) {
|
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext(); ) {
|
||||||
sb.append(iter.next()).append("=");
|
sb.append(iter.next()).append("=");
|
||||||
sb.append(URLEncoder.encode(iter.next(), encoding));
|
sb.append(URLEncoder.encode(iter.next(), encoding));
|
||||||
if (iter.hasNext()) {
|
if (iter.hasNext()) {
|
||||||
@ -256,7 +243,7 @@ public class HttpSimpleClient {
|
|||||||
|
|
||||||
static public class HttpResult {
|
static public class HttpResult {
|
||||||
final public int code;
|
final public int code;
|
||||||
final public Map<String,List<String>> headers;
|
final public Map<String, List<String>> headers;
|
||||||
final public String content;
|
final public String content;
|
||||||
|
|
||||||
public HttpResult(int code, String content) {
|
public HttpResult(int code, String content) {
|
||||||
|
@ -29,7 +29,6 @@ import com.google.common.util.concurrent.RateLimiter;
|
|||||||
* Limiter
|
* Limiter
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class Limiter {
|
public class Limiter {
|
||||||
|
|
||||||
|
@ -25,7 +25,6 @@ import java.io.FileInputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local Disaster Recovery Directory Tool
|
* Local Disaster Recovery Directory Tool
|
||||||
*
|
*
|
||||||
@ -44,7 +43,7 @@ public class LocalConfigInfoProcessor {
|
|||||||
try {
|
try {
|
||||||
return readFile(localPath);
|
return readFile(localPath);
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error(serverName, "NACOS-XXXX","get failover error, " + localPath + ioe.toString());
|
log.error(serverName, "NACOS-XXXX", "get failover error, " + localPath + ioe.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,7 +63,7 @@ public class LocalConfigInfoProcessor {
|
|||||||
try {
|
try {
|
||||||
return readFile(file);
|
return readFile(file);
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error(name, "NACOS-XXXX","get snapshot error, " + file + ", " + ioe.toString());
|
log.error(name, "NACOS-XXXX", "get snapshot error, " + file + ", " + ioe.toString());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,7 +91,6 @@ public class LocalConfigInfoProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static public void saveSnapshot(String envName, String dataId, String group, String tenant, String config) {
|
static public void saveSnapshot(String envName, String dataId, String group, String tenant, String config) {
|
||||||
if (!SnapShotSwitch.getIsSnapShot()) {
|
if (!SnapShotSwitch.getIsSnapShot()) {
|
||||||
return;
|
return;
|
||||||
@ -102,14 +100,18 @@ public class LocalConfigInfoProcessor {
|
|||||||
try {
|
try {
|
||||||
IOUtils.delete(file);
|
IOUtils.delete(file);
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error(envName, "NACOS-XXXX","delete snapshot error, " + file + ", " + ioe.toString());
|
log.error(envName, "NACOS-XXXX", "delete snapshot error, " + file + ", " + ioe.toString());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
boolean isMdOk = file.getParentFile().mkdirs();
|
File parentFile = file.getParentFile();
|
||||||
|
if (!parentFile.exists()) {
|
||||||
|
boolean isMdOk = parentFile.mkdirs();
|
||||||
if (!isMdOk) {
|
if (!isMdOk) {
|
||||||
log.error(envName, "NACOS-XXXX", "save snapshot error");
|
log.error(envName, "NACOS-XXXX", "save snapshot error");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (JVMUtil.isMultiInstance()) {
|
if (JVMUtil.isMultiInstance()) {
|
||||||
ConcurrentDiskUtil.writeFileContent(file, config,
|
ConcurrentDiskUtil.writeFileContent(file, config,
|
||||||
Constants.ENCODE);
|
Constants.ENCODE);
|
||||||
@ -117,7 +119,7 @@ public class LocalConfigInfoProcessor {
|
|||||||
IOUtils.writeStringToFile(file, config, Constants.ENCODE);
|
IOUtils.writeStringToFile(file, config, Constants.ENCODE);
|
||||||
}
|
}
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error(envName, "NACOS-XXXX","save snapshot error, " + file + ", " + ioe.toString());
|
log.error(envName, "NACOS-XXXX", "save snapshot error, " + file + ", " + ioe.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,36 +134,34 @@ public class LocalConfigInfoProcessor {
|
|||||||
if (files == null || files.length == 0) {
|
if (files == null || files.length == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for(File file : files){
|
for (File file : files) {
|
||||||
if(file.getName().endsWith("_nacos")){
|
if (file.getName().endsWith("_nacos")) {
|
||||||
IOUtils.cleanDirectory(file);
|
IOUtils.cleanDirectory(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error("NACOS-XXXX","clean all snapshot error, " + ioe.toString(), ioe);
|
log.error("NACOS-XXXX", "clean all snapshot error, " + ioe.toString(), ioe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static public void cleanEnvSnapshot(String envName){
|
static public void cleanEnvSnapshot(String envName) {
|
||||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos");
|
File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos");
|
||||||
tmp = new File(tmp, "snapshot");
|
tmp = new File(tmp, "snapshot");
|
||||||
try {
|
try {
|
||||||
IOUtils.cleanDirectory(tmp);
|
IOUtils.cleanDirectory(tmp);
|
||||||
log.info("success dlelet " + envName + "-snapshot");
|
log.info("success delete " + envName + "-snapshot");
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.info("fail dlelet " + envName + "-snapshot, " + e.toString());
|
log.info("fail delete " + envName + "-snapshot, " + e.toString());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static File getFailoverFile(String serverName, String dataId, String group, String tenant) {
|
static File getFailoverFile(String serverName, String dataId, String group, String tenant) {
|
||||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, serverName + "_nacos");
|
File tmp = new File(LOCAL_SNAPSHOT_PATH, serverName + "_nacos");
|
||||||
tmp = new File(tmp, "data");
|
tmp = new File(tmp, "data");
|
||||||
if (StringUtils.isBlank(tenant)) {
|
if (StringUtils.isBlank(tenant)) {
|
||||||
tmp = new File(tmp, "config-data");
|
tmp = new File(tmp, "config-data");
|
||||||
} else
|
} else {
|
||||||
{
|
|
||||||
tmp = new File(tmp, "config-data-tenant");
|
tmp = new File(tmp, "config-data-tenant");
|
||||||
tmp = new File(tmp, tenant);
|
tmp = new File(tmp, tenant);
|
||||||
}
|
}
|
||||||
@ -182,6 +182,7 @@ public class LocalConfigInfoProcessor {
|
|||||||
|
|
||||||
public static final String LOCAL_FILEROOT_PATH;
|
public static final String LOCAL_FILEROOT_PATH;
|
||||||
public static final String LOCAL_SNAPSHOT_PATH;
|
public static final String LOCAL_SNAPSHOT_PATH;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
LOCAL_FILEROOT_PATH = System.getProperty("JM.LOG.PATH", System.getProperty("user.home")) + File.separator
|
LOCAL_FILEROOT_PATH = System.getProperty("JM.LOG.PATH", System.getProperty("user.home")) + File.separator
|
||||||
+ "nacos" + File.separator + "config";
|
+ "nacos" + File.separator + "config";
|
||||||
|
@ -44,14 +44,13 @@ import java.util.Properties;
|
|||||||
* Server Agent
|
* Server Agent
|
||||||
*
|
*
|
||||||
* @author water.lyl
|
* @author water.lyl
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ServerHttpAgent {
|
public class ServerHttpAgent {
|
||||||
|
|
||||||
final static public Logger log = LogUtils.logger(ServerHttpAgent.class);
|
final static public Logger log = LogUtils.logger(ServerHttpAgent.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param path
|
* @param path 相对于web应用根,以/开头
|
||||||
* 相对于web应用根,以/开头
|
|
||||||
* @param headers
|
* @param headers
|
||||||
* @param paramValues
|
* @param paramValues
|
||||||
* @param encoding
|
* @param encoding
|
||||||
@ -78,21 +77,21 @@ public class ServerHttpAgent {
|
|||||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr(), result.code });
|
new Object[] {serverListMgr.getCurrentServerAddr(), result.code});
|
||||||
} else {
|
} else {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} catch (ConnectException ce) {
|
} catch (ConnectException ce) {
|
||||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr() });
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
serverListMgr.refreshCurrentServerAddr();
|
serverListMgr.refreshCurrentServerAddr();
|
||||||
} catch (SocketTimeoutException stoe) {
|
} catch (SocketTimeoutException stoe) {
|
||||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
serverListMgr.refreshCurrentServerAddr();
|
serverListMgr.refreshCurrentServerAddr();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
throw ioe;
|
throw ioe;
|
||||||
}
|
}
|
||||||
} while (System.currentTimeMillis() <= endTime);
|
} while (System.currentTimeMillis() <= endTime);
|
||||||
@ -119,21 +118,21 @@ public class ServerHttpAgent {
|
|||||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr(), result.code });
|
new Object[] {serverListMgr.getCurrentServerAddr(), result.code});
|
||||||
} else {
|
} else {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} catch (ConnectException ce) {
|
} catch (ConnectException ce) {
|
||||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
serverListMgr.refreshCurrentServerAddr();
|
serverListMgr.refreshCurrentServerAddr();
|
||||||
} catch (SocketTimeoutException stoe) {
|
} catch (SocketTimeoutException stoe) {
|
||||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
serverListMgr.refreshCurrentServerAddr();
|
serverListMgr.refreshCurrentServerAddr();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
throw ioe;
|
throw ioe;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,21 +160,21 @@ public class ServerHttpAgent {
|
|||||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr(), result.code });
|
new Object[] {serverListMgr.getCurrentServerAddr(), result.code});
|
||||||
} else {
|
} else {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} catch (ConnectException ce) {
|
} catch (ConnectException ce) {
|
||||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
serverListMgr.refreshCurrentServerAddr();
|
serverListMgr.refreshCurrentServerAddr();
|
||||||
} catch (SocketTimeoutException stoe) {
|
} catch (SocketTimeoutException stoe) {
|
||||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
serverListMgr.refreshCurrentServerAddr();
|
serverListMgr.refreshCurrentServerAddr();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||||
throw ioe;
|
throw ioe;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,7 +320,8 @@ public class ServerHttpAgent {
|
|||||||
}
|
}
|
||||||
log.error(respCode + "", "can not get security credentials, securityCredentialsUrl:{}, response:{}",
|
log.error(respCode + "", "can not get security credentials, securityCredentialsUrl:{}, response:{}",
|
||||||
new Object[] {securityCredentialsUrl, response});
|
new Object[] {securityCredentialsUrl, response});
|
||||||
throw new IOException("can not get security credentials, responseCode: " + respCode + ", response: " + response);
|
throw new IOException(
|
||||||
|
"can not get security credentials, responseCode: " + respCode + ", response: " + response);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
@ -331,6 +331,7 @@ public class ServerHttpAgent {
|
|||||||
public String getNamespace() {
|
public String getNamespace() {
|
||||||
return serverListMgr.getNamespace();
|
return serverListMgr.getNamespace();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getTenant() {
|
public String getTenant() {
|
||||||
return serverListMgr.getTenant();
|
return serverListMgr.getTenant();
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,6 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
|||||||
|
|
||||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serverlist Manager
|
* Serverlist Manager
|
||||||
*
|
*
|
||||||
@ -49,6 +48,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
|||||||
public class ServerListManager {
|
public class ServerListManager {
|
||||||
|
|
||||||
final static public Logger log = LogUtils.logger(ServerListManager.class);
|
final static public Logger log = LogUtils.logger(ServerListManager.class);
|
||||||
|
|
||||||
public ServerListManager() {
|
public ServerListManager() {
|
||||||
isFixed = false;
|
isFixed = false;
|
||||||
isStarted = false;
|
isStarted = false;
|
||||||
@ -209,7 +209,6 @@ public class ServerListManager {
|
|||||||
return new ServerAddressIterator(serverUrls);
|
return new ServerAddressIterator(serverUrls);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class GetServerListTask implements Runnable {
|
class GetServerListTask implements Runnable {
|
||||||
final String url;
|
final String url;
|
||||||
|
|
||||||
@ -225,7 +224,8 @@ public class ServerListManager {
|
|||||||
try {
|
try {
|
||||||
updateIfChanged(getApacheServerList(url, name));
|
updateIfChanged(getApacheServerList(url, name));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(name, "NACOS-XXXX", "[update-serverlist] failed to update serverlist from address server!", e);
|
log.error(name, "NACOS-XXXX", "[update-serverlist] failed to update serverlist from address server!",
|
||||||
|
e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -233,7 +233,8 @@ public class ServerListManager {
|
|||||||
private void updateIfChanged(List<String> newList) {
|
private void updateIfChanged(List<String> newList) {
|
||||||
if (null == newList || newList.isEmpty()) {
|
if (null == newList || newList.isEmpty()) {
|
||||||
|
|
||||||
log.warn("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题","[update-serverlist] current serverlist from address server is empty!!!"));
|
log.warn("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题",
|
||||||
|
"[update-serverlist] current serverlist from address server is empty!!!"));
|
||||||
log.warn(name, "[update-serverlist] current serverlist from address server is empty!!!");
|
log.warn(name, "[update-serverlist] current serverlist from address server is empty!!!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -255,7 +256,7 @@ public class ServerListManager {
|
|||||||
HttpResult httpResult = HttpSimpleClient.httpGet(url, null, null, null, 3000);
|
HttpResult httpResult = HttpSimpleClient.httpGet(url, null, null, null, 3000);
|
||||||
|
|
||||||
if (HttpURLConnection.HTTP_OK == httpResult.code) {
|
if (HttpURLConnection.HTTP_OK == httpResult.code) {
|
||||||
if (DEFAULT_NAME.equals(name) ) {
|
if (DEFAULT_NAME.equals(name)) {
|
||||||
EnvUtil.setSelfEnv(httpResult.headers);
|
EnvUtil.setSelfEnv(httpResult.headers);
|
||||||
}
|
}
|
||||||
List<String> lines = IOUtils.readLines(new StringReader(httpResult.content));
|
List<String> lines = IOUtils.readLines(new StringReader(httpResult.content));
|
||||||
@ -279,7 +280,7 @@ public class ServerListManager {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
log.error("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题",e.toString()));
|
log.error("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题", e.toString()));
|
||||||
log.error(addressServerUrl, "NACOS-XXXX", "[check-serverlist] exception. msg={}", e.toString(), e);
|
log.error(addressServerUrl, "NACOS-XXXX", "[check-serverlist] exception. msg={}", e.toString(), e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -294,7 +295,7 @@ public class ServerListManager {
|
|||||||
String split = "";
|
String split = "";
|
||||||
for (String serverIp : serverIps) {
|
for (String serverIp : serverIps) {
|
||||||
sb.append(split);
|
sb.append(split);
|
||||||
sb.append(serverIp);
|
sb.append(serverIp.replaceAll(":", "_"));
|
||||||
split = "-";
|
split = "-";
|
||||||
}
|
}
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
@ -302,10 +303,10 @@ public class ServerListManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "ServerManager-" + name + "-" +getUrlString();
|
return "ServerManager-" + name + "-" + getUrlString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean contain(String ip){
|
public boolean contain(String ip) {
|
||||||
|
|
||||||
return serverUrls.contains(ip);
|
return serverUrls.contains(ip);
|
||||||
}
|
}
|
||||||
@ -321,7 +322,6 @@ public class ServerListManager {
|
|||||||
return currentServerAddr;
|
return currentServerAddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getContentPath() {
|
public String getContentPath() {
|
||||||
return contentPath;
|
return contentPath;
|
||||||
}
|
}
|
||||||
@ -369,7 +369,6 @@ public class ServerListManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对地址列表排序,同机房优先。
|
* 对地址列表排序,同机房优先。
|
||||||
*/
|
*/
|
||||||
|
@ -29,7 +29,6 @@ import java.util.*;
|
|||||||
* 适配spas接口
|
* 适配spas接口
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class SpasAdapter {
|
public class SpasAdapter {
|
||||||
|
|
||||||
@ -51,13 +50,12 @@ public class SpasAdapter {
|
|||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static List<String> getSignHeaders(List<String> paramValues, String secretKey) {
|
public static List<String> getSignHeaders(List<String> paramValues, String secretKey) {
|
||||||
if (null == paramValues) {
|
if (null == paramValues) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Map<String, String> signMap = new HashMap<String, String>(5);
|
Map<String, String> signMap = new HashMap<String, String>(5);
|
||||||
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext();) {
|
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext(); ) {
|
||||||
String key = iter.next();
|
String key = iter.next();
|
||||||
if (TENANT_KEY.equals(key) || GROUP_KEY.equals(key)) {
|
if (TENANT_KEY.equals(key) || GROUP_KEY.equals(key)) {
|
||||||
signMap.put(key, iter.next());
|
signMap.put(key, iter.next());
|
||||||
|
@ -21,11 +21,10 @@ import java.util.concurrent.ScheduledFuture;
|
|||||||
import java.util.concurrent.ThreadFactory;
|
import java.util.concurrent.ThreadFactory;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Time Service
|
* Time Service
|
||||||
* @author Nacos
|
|
||||||
*
|
*
|
||||||
|
* @author Nacos
|
||||||
*/
|
*/
|
||||||
public class TimerService {
|
public class TimerService {
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ import java.util.Properties;
|
|||||||
* Properties Listener
|
* Properties Listener
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
|
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
|
||||||
public abstract class PropertiesListener extends AbstractListener {
|
public abstract class PropertiesListener extends AbstractListener {
|
||||||
@ -43,9 +42,8 @@ public abstract class PropertiesListener extends AbstractListener {
|
|||||||
try {
|
try {
|
||||||
properties.load(new StringReader(configInfo));
|
properties.load(new StringReader(configInfo));
|
||||||
innerReceive(properties);
|
innerReceive(properties);
|
||||||
}
|
} catch (IOException e) {
|
||||||
catch (IOException e) {
|
log.error("NACOS-XXXX", "load properties error:" + configInfo, e);
|
||||||
log.error("NACOS-XXXX","load properties error:" + configInfo, e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -53,8 +51,7 @@ public abstract class PropertiesListener extends AbstractListener {
|
|||||||
/**
|
/**
|
||||||
* properties type for receiver
|
* properties type for receiver
|
||||||
*
|
*
|
||||||
* @param properties
|
* @param properties properties
|
||||||
* properties
|
|
||||||
*/
|
*/
|
||||||
public abstract void innerReceive(Properties properties);
|
public abstract void innerReceive(Properties properties);
|
||||||
|
|
||||||
|
@ -32,20 +32,16 @@ import java.nio.charset.CharsetDecoder;
|
|||||||
* concurrent disk util;op file with file lock
|
* concurrent disk util;op file with file lock
|
||||||
*
|
*
|
||||||
* @author configCenter
|
* @author configCenter
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ConcurrentDiskUtil {
|
public class ConcurrentDiskUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get file content
|
* get file content
|
||||||
*
|
*
|
||||||
* @param path
|
* @param path file path
|
||||||
* file path
|
* @param charsetName charsetName
|
||||||
* @param charsetName
|
|
||||||
* charsetName
|
|
||||||
* @return content
|
* @return content
|
||||||
* @throws IOException
|
* @throws IOException IOException
|
||||||
* IOException
|
|
||||||
*/
|
*/
|
||||||
public static String getFileContent(String path, String charsetName)
|
public static String getFileContent(String path, String charsetName)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
@ -56,13 +52,10 @@ public class ConcurrentDiskUtil {
|
|||||||
/**
|
/**
|
||||||
* get file content
|
* get file content
|
||||||
*
|
*
|
||||||
* @param file
|
* @param file file
|
||||||
* file
|
* @param charsetName charsetName
|
||||||
* @param charsetName
|
|
||||||
* charsetName
|
|
||||||
* @return content
|
* @return content
|
||||||
* @throws IOException
|
* @throws IOException IOException
|
||||||
* IOException
|
|
||||||
*/
|
*/
|
||||||
public static String getFileContent(File file, String charsetName)
|
public static String getFileContent(File file, String charsetName)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
@ -88,7 +81,7 @@ public class ConcurrentDiskUtil {
|
|||||||
i);
|
i);
|
||||||
}
|
}
|
||||||
} while (null == rlock);
|
} while (null == rlock);
|
||||||
int fileSize = (int) fcin.size();
|
int fileSize = (int)fcin.size();
|
||||||
ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
|
ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
|
||||||
fcin.read(byteBuffer);
|
fcin.read(byteBuffer);
|
||||||
byteBuffer.flip();
|
byteBuffer.flip();
|
||||||
@ -108,15 +101,11 @@ public class ConcurrentDiskUtil {
|
|||||||
/**
|
/**
|
||||||
* write file content
|
* write file content
|
||||||
*
|
*
|
||||||
* @param path
|
* @param path file path
|
||||||
* file path
|
* @param content content
|
||||||
* @param content
|
* @param charsetName charsetName
|
||||||
* content
|
|
||||||
* @param charsetName
|
|
||||||
* charsetName
|
|
||||||
* @return whether write ok
|
* @return whether write ok
|
||||||
* @throws IOException
|
* @throws IOException IOException
|
||||||
* IOException
|
|
||||||
*/
|
*/
|
||||||
public static Boolean writeFileContent(String path, String content,
|
public static Boolean writeFileContent(String path, String content,
|
||||||
String charsetName) throws IOException {
|
String charsetName) throws IOException {
|
||||||
@ -127,15 +116,11 @@ public class ConcurrentDiskUtil {
|
|||||||
/**
|
/**
|
||||||
* write file content
|
* write file content
|
||||||
*
|
*
|
||||||
* @param file
|
* @param file file
|
||||||
* file
|
* @param content content
|
||||||
* @param content
|
* @param charsetName charsetName
|
||||||
* content
|
|
||||||
* @param charsetName
|
|
||||||
* charsetName
|
|
||||||
* @return whether write ok
|
* @return whether write ok
|
||||||
* @throws IOException
|
* @throws IOException IOException
|
||||||
* IOException
|
|
||||||
*/
|
*/
|
||||||
public static Boolean writeFileContent(File file, String content,
|
public static Boolean writeFileContent(File file, String content,
|
||||||
String charsetName) throws IOException {
|
String charsetName) throws IOException {
|
||||||
@ -210,13 +195,10 @@ public class ConcurrentDiskUtil {
|
|||||||
/**
|
/**
|
||||||
* transfer ByteBuffer to String
|
* transfer ByteBuffer to String
|
||||||
*
|
*
|
||||||
* @param buffer
|
* @param buffer buffer
|
||||||
* buffer
|
* @param charsetName charsetName
|
||||||
* @param charsetName
|
|
||||||
* charsetName
|
|
||||||
* @return String
|
* @return String
|
||||||
* @throws IOException
|
* @throws IOException IOException
|
||||||
* IOException
|
|
||||||
*/
|
*/
|
||||||
public static String byteBufferToString(ByteBuffer buffer,
|
public static String byteBufferToString(ByteBuffer buffer,
|
||||||
String charsetName) throws IOException {
|
String charsetName) throws IOException {
|
||||||
|
@ -23,7 +23,6 @@ import static com.alibaba.nacos.api.common.Constants.WORD_SEPARATOR;
|
|||||||
* Content Util
|
* Content Util
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ContentUtils {
|
public class ContentUtils {
|
||||||
|
|
||||||
@ -43,7 +42,6 @@ public class ContentUtils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getContentIdentity(String content) {
|
public static String getContentIdentity(String content) {
|
||||||
int index = content.indexOf(WORD_SEPARATOR);
|
int index = content.indexOf(WORD_SEPARATOR);
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
@ -52,7 +50,6 @@ public class ContentUtils {
|
|||||||
return content.substring(0, index);
|
return content.substring(0, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getContent(String content) {
|
public static String getContent(String content) {
|
||||||
int index = content.indexOf(WORD_SEPARATOR);
|
int index = content.indexOf(WORD_SEPARATOR);
|
||||||
if (index == -1) {
|
if (index == -1) {
|
||||||
@ -61,15 +58,12 @@ public class ContentUtils {
|
|||||||
return content.substring(index + 1);
|
return content.substring(index + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String truncateContent(String content) {
|
public static String truncateContent(String content) {
|
||||||
if (content == null) {
|
if (content == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
} else if (content.length() <= SHOW_CONTENT_SIZE) {
|
||||||
else if (content.length() <= SHOW_CONTENT_SIZE) {
|
|
||||||
return content;
|
return content;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return content.substring(0, SHOW_CONTENT_SIZE) + "...";
|
return content.substring(0, SHOW_CONTENT_SIZE) + "...";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,12 +21,10 @@ import java.io.*;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IO Util
|
* IO Util
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class IOUtils {
|
public class IOUtils {
|
||||||
@ -45,7 +43,7 @@ public class IOUtils {
|
|||||||
static public long copy(Reader input, Writer output) throws IOException {
|
static public long copy(Reader input, Writer output) throws IOException {
|
||||||
char[] buffer = new char[1 << 12];
|
char[] buffer = new char[1 << 12];
|
||||||
long count = 0;
|
long count = 0;
|
||||||
for (int n = 0; (n = input.read(buffer)) >= 0;) {
|
for (int n = 0; (n = input.read(buffer)) >= 0; ) {
|
||||||
output.write(buffer, 0, n);
|
output.write(buffer, 0, n);
|
||||||
count += n;
|
count += n;
|
||||||
}
|
}
|
||||||
@ -59,7 +57,7 @@ public class IOUtils {
|
|||||||
BufferedReader reader = toBufferedReader(input);
|
BufferedReader reader = toBufferedReader(input);
|
||||||
List<String> list = new ArrayList<String>();
|
List<String> list = new ArrayList<String>();
|
||||||
String line = null;
|
String line = null;
|
||||||
for (;;) {
|
for (; ; ) {
|
||||||
line = reader.readLine();
|
line = reader.readLine();
|
||||||
if (null != line) {
|
if (null != line) {
|
||||||
list.add(line);
|
list.add(line);
|
||||||
@ -71,7 +69,7 @@ public class IOUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static private BufferedReader toBufferedReader(Reader reader) {
|
static private BufferedReader toBufferedReader(Reader reader) {
|
||||||
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(
|
return reader instanceof BufferedReader ? (BufferedReader)reader : new BufferedReader(
|
||||||
reader);
|
reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ import com.alibaba.nacos.client.logger.Logger;
|
|||||||
* Get jvm config
|
* Get jvm config
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class JVMUtil {
|
public class JVMUtil {
|
||||||
|
@ -24,7 +24,6 @@ import com.alibaba.nacos.client.logger.LoggerFactory;
|
|||||||
* Log Util
|
* Log Util
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class LogUtils {
|
public class LogUtils {
|
||||||
|
|
||||||
@ -37,20 +36,21 @@ public class LogUtils {
|
|||||||
/**
|
/**
|
||||||
* change timeout from 100 to 200
|
* change timeout from 100 to 200
|
||||||
*/
|
*/
|
||||||
tmp = System.getProperty("JM.LOG.RETAIN.COUNT","7");
|
tmp = System.getProperty("JM.LOG.RETAIN.COUNT", "7");
|
||||||
JM_LOG_RETAIN_COUNT = Integer.parseInt(tmp);
|
JM_LOG_RETAIN_COUNT = Integer.parseInt(tmp);
|
||||||
} catch (NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
JM_LOG_FILE_SIZE = System.getProperty("JM.LOG.FILE.SIZE","10MB");
|
JM_LOG_FILE_SIZE = System.getProperty("JM.LOG.FILE.SIZE", "10MB");
|
||||||
|
|
||||||
// logger init
|
// logger init
|
||||||
Logger logger = LoggerFactory.getLogger("com.alibaba.nacos.client.config");
|
Logger logger = LoggerFactory.getLogger("com.alibaba.nacos.client.config");
|
||||||
logger.setLevel(Level.INFO);
|
logger.setLevel(Level.INFO);
|
||||||
logger.setAdditivity(false);
|
logger.setAdditivity(false);
|
||||||
logger.activateAppenderWithSizeRolling("nacos", "config.log", Constants.ENCODE, JM_LOG_FILE_SIZE, JM_LOG_RETAIN_COUNT);
|
logger.activateAppenderWithSizeRolling("nacos", "config.log", Constants.ENCODE, JM_LOG_FILE_SIZE,
|
||||||
|
JM_LOG_RETAIN_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Logger logger(Class<?> clazz) {
|
public static Logger logger(Class<?> clazz) {
|
||||||
|
@ -27,14 +27,14 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
* MD5 util
|
* MD5 util
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class MD5 {
|
public class MD5 {
|
||||||
private static int DIGITS_SIZE = 16;
|
private static int DIGITS_SIZE = 16;
|
||||||
private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
private static char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
|
||||||
|
|
||||||
private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(16);
|
private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(16);
|
||||||
|
|
||||||
static {
|
static {
|
||||||
for (int i = 0; i < digits.length; ++i) {
|
for (int i = 0; i < digits.length; ++i) {
|
||||||
rDigits.put(digits[i], i);
|
rDigits.put(digits[i], i);
|
||||||
@ -45,38 +45,31 @@ public class MD5 {
|
|||||||
private MessageDigest mHasher;
|
private MessageDigest mHasher;
|
||||||
private ReentrantLock opLock = new ReentrantLock();
|
private ReentrantLock opLock = new ReentrantLock();
|
||||||
|
|
||||||
|
|
||||||
private MD5() {
|
private MD5() {
|
||||||
try {
|
try {
|
||||||
mHasher = MessageDigest.getInstance("md5");
|
mHasher = MessageDigest.getInstance("md5");
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static MD5 getInstance() {
|
public static MD5 getInstance() {
|
||||||
return me;
|
return me;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getMD5String(String content) {
|
public String getMD5String(String content) {
|
||||||
return bytes2string(hash(content));
|
return bytes2string(hash(content));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getMD5String(byte[] content) {
|
public String getMD5String(byte[] content) {
|
||||||
return bytes2string(hash(content));
|
return bytes2string(hash(content));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public byte[] getMD5Bytes(byte[] content) {
|
public byte[] getMD5Bytes(byte[] content) {
|
||||||
return hash(content);
|
return hash(content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对字符串进行md5
|
* 对字符串进行md5
|
||||||
*
|
*
|
||||||
@ -91,20 +84,17 @@ public class MD5 {
|
|||||||
throw new IllegalArgumentException("md5 need");
|
throw new IllegalArgumentException("md5 need");
|
||||||
}
|
}
|
||||||
return bt;
|
return bt;
|
||||||
}
|
} catch (UnsupportedEncodingException e) {
|
||||||
catch (UnsupportedEncodingException e) {
|
|
||||||
throw new RuntimeException("unsupported utf-8 encoding", e);
|
throw new RuntimeException("unsupported utf-8 encoding", e);
|
||||||
}
|
} finally {
|
||||||
finally {
|
|
||||||
opLock.unlock();
|
opLock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对二进制数据进行md5
|
* 对二进制数据进行md5
|
||||||
*
|
*
|
||||||
* @param str
|
* @param data
|
||||||
* @return md5 byte[16]
|
* @return md5 byte[16]
|
||||||
*/
|
*/
|
||||||
public byte[] hash(byte[] data) {
|
public byte[] hash(byte[] data) {
|
||||||
@ -115,13 +105,11 @@ public class MD5 {
|
|||||||
throw new IllegalArgumentException("md5 need");
|
throw new IllegalArgumentException("md5 need");
|
||||||
}
|
}
|
||||||
return bt;
|
return bt;
|
||||||
}
|
} finally {
|
||||||
finally {
|
|
||||||
opLock.unlock();
|
opLock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 将一个字节数组转化为可见的字符串
|
* 将一个字节数组转化为可见的字符串
|
||||||
*
|
*
|
||||||
@ -141,5 +129,4 @@ public class MD5 {
|
|||||||
return new String(out);
|
return new String(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,12 +25,10 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
|||||||
* Param check util
|
* Param check util
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ParamUtils {
|
public class ParamUtils {
|
||||||
|
|
||||||
private static char[] validChars = new char[] { '_', '-', '.', ':' };
|
private static char[] validChars = new char[] {'_', '-', '.', ':'};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 白名单的方式检查, 合法的参数只能包含字母、数字、以及validChars中的字符, 并且不能为空
|
* 白名单的方式检查, 合法的参数只能包含字母、数字、以及validChars中的字符, 并且不能为空
|
||||||
@ -47,18 +45,15 @@ public class ParamUtils {
|
|||||||
char ch = param.charAt(i);
|
char ch = param.charAt(i);
|
||||||
if (Character.isLetterOrDigit(ch)) {
|
if (Character.isLetterOrDigit(ch)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
} else if (isValidChar(ch)) {
|
||||||
else if (isValidChar(ch)) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static boolean isValidChar(char ch) {
|
private static boolean isValidChar(char ch) {
|
||||||
for (char c : validChars) {
|
for (char c : validChars) {
|
||||||
if (c == ch) {
|
if (c == ch) {
|
||||||
|
@ -21,7 +21,6 @@ import com.alibaba.nacos.client.config.impl.LocalConfigInfoProcessor;
|
|||||||
* Snapshot switch
|
* Snapshot switch
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class SnapShotSwitch {
|
public class SnapShotSwitch {
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
|||||||
* Tenant Util
|
* Tenant Util
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class TenantUtil {
|
public class TenantUtil {
|
||||||
|
|
||||||
|
@ -1,19 +1,3 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.alibaba.nacos.client.identify;
|
|
||||||
/*
|
/*
|
||||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
* contributor license agreements. See the NOTICE file distributed with
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
@ -30,43 +14,31 @@ package com.alibaba.nacos.client.identify;
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
package com.alibaba.nacos.client.identify;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides Base64 encoding and decoding as defined by <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>.
|
* Provides Base64 encoding and decoding as defined by <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>.
|
||||||
*
|
* <p>
|
||||||
* <p>
|
* <p> This class implements section <cite>6.8. Base64 Content-Transfer-Encoding</cite> from RFC 2045 <cite>Multipurpose
|
||||||
* This class implements section <cite>6.8. Base64 Content-Transfer-Encoding</cite> from RFC 2045 <cite>Multipurpose
|
* Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</cite> by Freed and Borenstein. </p> <p>
|
||||||
* Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</cite> by Freed and Borenstein.
|
* The class can be parameterized in the following manner with various constructors: <ul> <li>URL-safe mode: Default
|
||||||
* </p>
|
* off.</li> <li>Line length: Default 76. Line length that aren't multiples of 4 will still essentially end up being
|
||||||
* <p>
|
* multiples of 4 in the encoded data. <li>Line separator: Default is CRLF ("\r\n")</li> </ul> </p> <p> Since this class
|
||||||
* The class can be parameterized in the following manner with various constructors:
|
* operates directly on byte streams, and not character streams, it is hard-coded to only encode/decode character
|
||||||
* <ul>
|
* encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, etc). </p> <p> This
|
||||||
* <li>URL-safe mode: Default off.</li>
|
* class is not thread-safe. Each thread should use its own instance. </p>
|
||||||
* <li>Line length: Default 76. Line length that aren't multiples of 4 will still essentially end up being multiples of
|
*
|
||||||
* 4 in the encoded data.
|
* @author Apache Software Foundation
|
||||||
* <li>Line separator: Default is CRLF ("\r\n")</li>
|
* @version $Revision: 1080712 $
|
||||||
* </ul>
|
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
|
||||||
* </p>
|
* @since 1.0
|
||||||
* <p>
|
*/
|
||||||
* Since this class operates directly on byte streams, and not character streams, it is hard-coded to only encode/decode
|
|
||||||
* character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, etc).
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* This class is not thread-safe. Each thread should use its own instance.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>
|
|
||||||
* @author Apache Software Foundation
|
|
||||||
* @since 1.0
|
|
||||||
* @version $Revision: 1080712 $
|
|
||||||
*/
|
|
||||||
public class Base64 {
|
public class Base64 {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BASE32 characters are 6 bits in length.
|
* BASE32 characters are 6 bits in length. They are formed by taking a block of 3 octets to form a 24-bit string,
|
||||||
* They are formed by taking a block of 3 octets to form a 24-bit string,
|
|
||||||
* which is converted into 4 BASE64 characters.
|
* which is converted into 4 BASE64 characters.
|
||||||
*/
|
*/
|
||||||
private static final int BITS_PER_ENCODED_BYTE = 6;
|
private static final int BITS_PER_ENCODED_BYTE = 6;
|
||||||
@ -75,10 +47,8 @@ public class Base64 {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Chunk separator per RFC 2045 section 2.1.
|
* Chunk separator per RFC 2045 section 2.1.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* N.B. The next major release may break compatibility and make this field private.
|
* <p> N.B. The next major release may break compatibility and make this field private. </p>
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 2.1</a>
|
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 2.1</a>
|
||||||
*/
|
*/
|
||||||
@ -87,9 +57,9 @@ public class Base64 {
|
|||||||
/**
|
/**
|
||||||
* This array is a lookup table that translates 6-bit positive integer index values into their "Base64 Alphabet"
|
* This array is a lookup table that translates 6-bit positive integer index values into their "Base64 Alphabet"
|
||||||
* equivalents as specified in Table 1 of RFC 2045.
|
* equivalents as specified in Table 1 of RFC 2045.
|
||||||
*
|
* <p>
|
||||||
* Thanks to "commons" project in ws.apache.org for this code.
|
* Thanks to "commons" project in ws.apache.org for this code. http://svn.apache
|
||||||
* http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
|
* .org/repos/asf/webservices/commons/trunk/modules/util/
|
||||||
*/
|
*/
|
||||||
private static final byte[] STANDARD_ENCODE_TABLE = {
|
private static final byte[] STANDARD_ENCODE_TABLE = {
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
@ -100,9 +70,8 @@ public class Base64 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a copy of the STANDARD_ENCODE_TABLE above, but with + and /
|
* This is a copy of the STANDARD_ENCODE_TABLE above, but with + and / changed to - and _ to make the encoded Base64
|
||||||
* changed to - and _ to make the encoded Base64 results more URL-SAFE.
|
* results more URL-SAFE. This table is only used when the Base64's mode is set to URL-SAFE.
|
||||||
* This table is only used when the Base64's mode is set to URL-SAFE.
|
|
||||||
*/
|
*/
|
||||||
private static final byte[] URL_SAFE_ENCODE_TABLE = {
|
private static final byte[] URL_SAFE_ENCODE_TABLE = {
|
||||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
@ -116,12 +85,12 @@ public class Base64 {
|
|||||||
* This array is a lookup table that translates Unicode characters drawn from the "Base64 Alphabet" (as specified in
|
* This array is a lookup table that translates Unicode characters drawn from the "Base64 Alphabet" (as specified in
|
||||||
* Table 1 of RFC 2045) into their 6-bit positive integer equivalents. Characters that are not in the Base64
|
* Table 1 of RFC 2045) into their 6-bit positive integer equivalents. Characters that are not in the Base64
|
||||||
* alphabet but fall within the bounds of the array are translated to -1.
|
* alphabet but fall within the bounds of the array are translated to -1.
|
||||||
*
|
* <p>
|
||||||
* Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This means decoder seamlessly handles both
|
* Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This means decoder seamlessly handles both
|
||||||
* URL_SAFE and STANDARD base64. (The encoder, on the other hand, needs to know ahead of time what to emit).
|
* URL_SAFE and STANDARD base64. (The encoder, on the other hand, needs to know ahead of time what to emit).
|
||||||
*
|
* <p>
|
||||||
* Thanks to "commons" project in ws.apache.org for this code.
|
* Thanks to "commons" project in ws.apache.org for this code. http://svn.apache
|
||||||
* http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
|
* .org/repos/asf/webservices/commons/trunk/modules/util/
|
||||||
*/
|
*/
|
||||||
private static final byte[] DECODE_TABLE = {
|
private static final byte[] DECODE_TABLE = {
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
@ -136,7 +105,9 @@ public class Base64 {
|
|||||||
/**
|
/**
|
||||||
* Base64 uses 6-bit fields.
|
* Base64 uses 6-bit fields.
|
||||||
*/
|
*/
|
||||||
/** Mask used to extract 6 bits, used when encoding */
|
/**
|
||||||
|
* Mask used to extract 6 bits, used when encoding
|
||||||
|
*/
|
||||||
private static final int MASK_6BITS = 0x3f;
|
private static final int MASK_6BITS = 0x3f;
|
||||||
|
|
||||||
// The static final fields above are used for the original static byte[] methods on Base64.
|
// The static final fields above are used for the original static byte[] methods on Base64.
|
||||||
@ -173,55 +144,43 @@ public class Base64 {
|
|||||||
private final int encodeSize;
|
private final int encodeSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Place holder for the bytes we're dealing with for our based logic.
|
* Place holder for the bytes we're dealing with for our based logic. Bitwise operations store and extract the
|
||||||
* Bitwise operations store and extract the encoding or decoding from this variable.
|
* encoding or decoding from this variable.
|
||||||
*/
|
*/
|
||||||
private int bitWorkArea;
|
private int bitWorkArea;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
|
* Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. <p> When encoding the line
|
||||||
|
* length is 0 (no chunking), and the encoding table is STANDARD_ENCODE_TABLE. </p>
|
||||||
* <p>
|
* <p>
|
||||||
* When encoding the line length is 0 (no chunking), and the encoding table is STANDARD_ENCODE_TABLE.
|
* <p> When decoding all variants are supported. </p>
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* When decoding all variants are supported.
|
|
||||||
* </p>
|
|
||||||
*/
|
*/
|
||||||
public Base64() {
|
public Base64() {
|
||||||
this(0, CHUNK_SEPARATOR, false);
|
this(0, CHUNK_SEPARATOR, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode.
|
* Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. <p> When encoding the line
|
||||||
* <p>
|
* length and line separator are given in the constructor, and the encoding table is STANDARD_ENCODE_TABLE. </p> <p>
|
||||||
* When encoding the line length and line separator are given in the constructor, and the encoding table is
|
|
||||||
* STANDARD_ENCODE_TABLE.
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data.
|
* Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data.
|
||||||
* </p>
|
* </p> <p> When decoding all variants are supported. </p>
|
||||||
* <p>
|
|
||||||
* When decoding all variants are supported.
|
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @param lineLength
|
* @param lineLength Each line of encoded data will be at most of the given length (rounded down to nearest
|
||||||
* Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4).
|
* multiple of 4). If lineLength <= 0, then the output will not be divided into lines (chunks).
|
||||||
* If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding.
|
* Ignored when decoding.
|
||||||
* @param lineSeparator
|
* @param lineSeparator Each line of encoded data will end with this sequence of bytes.
|
||||||
* Each line of encoded data will end with this sequence of bytes.
|
* @param urlSafe Instead of emitting '+' and '/' we emit '-' and '_' respectively. urlSafe is only applied to
|
||||||
* @param urlSafe
|
* encode operations. Decoding seamlessly handles both modes.
|
||||||
* Instead of emitting '+' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode
|
* @throws IllegalArgumentException The provided lineSeparator included some base64 characters. That's not going to
|
||||||
* operations. Decoding seamlessly handles both modes.
|
* work!
|
||||||
* @throws IllegalArgumentException
|
|
||||||
* The provided lineSeparator included some base64 characters. That's not going to work!
|
|
||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
public Base64(int lineLength, byte[] lineSeparator, boolean urlSafe) {
|
public Base64(int lineLength, byte[] lineSeparator, boolean urlSafe) {
|
||||||
chunkSeparatorLength = lineSeparator == null ? 0 : lineSeparator.length;
|
chunkSeparatorLength = lineSeparator == null ? 0 : lineSeparator.length;
|
||||||
unencodedBlockSize = BYTES_PER_UNENCODED_BLOCK;
|
unencodedBlockSize = BYTES_PER_UNENCODED_BLOCK;
|
||||||
encodedBlockSize = BYTES_PER_ENCODED_BLOCK;
|
encodedBlockSize = BYTES_PER_ENCODED_BLOCK;
|
||||||
this.lineLength = (lineLength > 0 && chunkSeparatorLength > 0) ? (lineLength / encodedBlockSize) * encodedBlockSize : 0;
|
this.lineLength = (lineLength > 0 && chunkSeparatorLength > 0) ? (lineLength / encodedBlockSize)
|
||||||
|
* encodedBlockSize : 0;
|
||||||
// TODO could be simplified if there is no requirement to reject invalid line sep when length <=0
|
// TODO could be simplified if there is no requirement to reject invalid line sep when length <=0
|
||||||
// @see test case Base64Test.testConstructors()
|
// @see test case Base64Test.testConstructors()
|
||||||
if (lineSeparator != null) {
|
if (lineSeparator != null) {
|
||||||
@ -233,7 +192,7 @@ public class Base64 {
|
|||||||
}
|
}
|
||||||
throw new IllegalArgumentException("lineSeparator must not contain base64 characters: [" + sep + "]");
|
throw new IllegalArgumentException("lineSeparator must not contain base64 characters: [" + sep + "]");
|
||||||
}
|
}
|
||||||
if (lineLength > 0){
|
if (lineLength > 0) {
|
||||||
this.encodeSize = BYTES_PER_ENCODED_BLOCK + lineSeparator.length;
|
this.encodeSize = BYTES_PER_ENCODED_BLOCK + lineSeparator.length;
|
||||||
this.lineSeparator = new byte[lineSeparator.length];
|
this.lineSeparator = new byte[lineSeparator.length];
|
||||||
System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length);
|
System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length);
|
||||||
@ -250,22 +209,15 @@ public class Base64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p> Encodes all of the provided data, starting at inPos, for inAvail bytes. Must be called at least twice: once
|
||||||
* Encodes all of the provided data, starting at inPos, for inAvail bytes. Must be called at least twice: once with
|
* with the data to encode, and once with inAvail set to "-1" to alert encoder that EOF has been reached, so flush
|
||||||
* the data to encode, and once with inAvail set to "-1" to alert encoder that EOF has been reached, so flush last
|
* last remaining bytes (if not multiple of 3). </p> <p> Thanks to "commons" project in ws.apache.org for the
|
||||||
* remaining bytes (if not multiple of 3).
|
* bitwise operations, and general approach. http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach.
|
|
||||||
* http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
|
|
||||||
* </p>
|
* </p>
|
||||||
*
|
*
|
||||||
* @param in
|
* @param in byte[] array of binary data to base64 encode.
|
||||||
* byte[] array of binary data to base64 encode.
|
* @param inPos Position to start reading data from.
|
||||||
* @param inPos
|
* @param inAvail Amount of bytes available from input for encoding.
|
||||||
* Position to start reading data from.
|
|
||||||
* @param inAvail
|
|
||||||
* Amount of bytes available from input for encoding.
|
|
||||||
*/
|
*/
|
||||||
void encode(byte[] in, int inPos, int inAvail) {
|
void encode(byte[] in, int inPos, int inAvail) {
|
||||||
if (eof) {
|
if (eof) {
|
||||||
@ -279,7 +231,7 @@ public class Base64 {
|
|||||||
ensureBufferSize(encodeSize);
|
ensureBufferSize(encodeSize);
|
||||||
int savedPos = pos;
|
int savedPos = pos;
|
||||||
switch (modulus) {
|
switch (modulus) {
|
||||||
case 1 :
|
case 1:
|
||||||
buffer[pos++] = encodeTable[(bitWorkArea >> 2) & MASK_6BITS];
|
buffer[pos++] = encodeTable[(bitWorkArea >> 2) & MASK_6BITS];
|
||||||
buffer[pos++] = encodeTable[(bitWorkArea << 4) & MASK_6BITS];
|
buffer[pos++] = encodeTable[(bitWorkArea << 4) & MASK_6BITS];
|
||||||
|
|
||||||
@ -289,7 +241,7 @@ public class Base64 {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2 :
|
case 2:
|
||||||
buffer[pos++] = encodeTable[(bitWorkArea >> 10) & MASK_6BITS];
|
buffer[pos++] = encodeTable[(bitWorkArea >> 10) & MASK_6BITS];
|
||||||
buffer[pos++] = encodeTable[(bitWorkArea >> 4) & MASK_6BITS];
|
buffer[pos++] = encodeTable[(bitWorkArea >> 4) & MASK_6BITS];
|
||||||
buffer[pos++] = encodeTable[(bitWorkArea << 2) & MASK_6BITS];
|
buffer[pos++] = encodeTable[(bitWorkArea << 2) & MASK_6BITS];
|
||||||
@ -312,7 +264,7 @@ public class Base64 {
|
|||||||
} else {
|
} else {
|
||||||
for (int i = 0; i < inAvail; i++) {
|
for (int i = 0; i < inAvail; i++) {
|
||||||
ensureBufferSize(encodeSize);
|
ensureBufferSize(encodeSize);
|
||||||
modulus = (modulus+1) % BYTES_PER_UNENCODED_BLOCK;
|
modulus = (modulus + 1) % BYTES_PER_UNENCODED_BLOCK;
|
||||||
int b = in[inPos++];
|
int b = in[inPos++];
|
||||||
if (b < 0) {
|
if (b < 0) {
|
||||||
b += 256;
|
b += 256;
|
||||||
@ -335,27 +287,17 @@ public class Base64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p> Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at least twice: once
|
||||||
* Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at least twice: once
|
|
||||||
* with the data to decode, and once with inAvail set to "-1" to alert decoder that EOF has been reached. The "-1"
|
* with the data to decode, and once with inAvail set to "-1" to alert decoder that EOF has been reached. The "-1"
|
||||||
* call is not necessary when decoding, but it doesn't hurt, either.
|
* call is not necessary when decoding, but it doesn't hurt, either. </p> <p> Ignores all non-base64 characters.
|
||||||
* </p>
|
* This is how chunked (e.g. 76 character) data is handled, since CR and LF are silently ignored, but has
|
||||||
* <p>
|
* implications for other bytes, too. This method subscribes to the garbage-in, garbage-out philosophy: it will not
|
||||||
* Ignores all non-base64 characters. This is how chunked (e.g. 76 character) data is handled, since CR and LF are
|
* check the provided data for validity. </p> <p> Thanks to "commons" project in ws.apache.org for the bitwise
|
||||||
* silently ignored, but has implications for other bytes, too. This method subscribes to the garbage-in,
|
* operations, and general approach. http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ </p>
|
||||||
* garbage-out philosophy: it will not check the provided data for validity.
|
|
||||||
* </p>
|
|
||||||
* <p>
|
|
||||||
* Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach.
|
|
||||||
* http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/
|
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @param in
|
* @param in byte[] array of ascii data to base64 decode.
|
||||||
* byte[] array of ascii data to base64 decode.
|
* @param inPos Position to start reading data from.
|
||||||
* @param inPos
|
* @param inAvail Amount of bytes available from input for encoding.
|
||||||
* Position to start reading data from.
|
|
||||||
* @param inAvail
|
|
||||||
* Amount of bytes available from input for encoding.
|
|
||||||
*/
|
*/
|
||||||
void decode(byte[] in, int inPos, int inAvail) {
|
void decode(byte[] in, int inPos, int inAvail) {
|
||||||
if (eof) {
|
if (eof) {
|
||||||
@ -375,12 +317,12 @@ public class Base64 {
|
|||||||
if (b >= 0 && b < DECODE_TABLE.length) {
|
if (b >= 0 && b < DECODE_TABLE.length) {
|
||||||
int result = DECODE_TABLE[b];
|
int result = DECODE_TABLE[b];
|
||||||
if (result >= 0) {
|
if (result >= 0) {
|
||||||
modulus = (modulus+1) % BYTES_PER_ENCODED_BLOCK;
|
modulus = (modulus + 1) % BYTES_PER_ENCODED_BLOCK;
|
||||||
bitWorkArea = (bitWorkArea << BITS_PER_ENCODED_BYTE) + result;
|
bitWorkArea = (bitWorkArea << BITS_PER_ENCODED_BYTE) + result;
|
||||||
if (modulus == 0) {
|
if (modulus == 0) {
|
||||||
buffer[pos++] = (byte) ((bitWorkArea >> 16) & MASK_8BITS);
|
buffer[pos++] = (byte)((bitWorkArea >> 16) & MASK_8BITS);
|
||||||
buffer[pos++] = (byte) ((bitWorkArea >> 8) & MASK_8BITS);
|
buffer[pos++] = (byte)((bitWorkArea >> 8) & MASK_8BITS);
|
||||||
buffer[pos++] = (byte) (bitWorkArea & MASK_8BITS);
|
buffer[pos++] = (byte)(bitWorkArea & MASK_8BITS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -398,14 +340,14 @@ public class Base64 {
|
|||||||
switch (modulus) {
|
switch (modulus) {
|
||||||
// case 1: // 6 bits - ignore entirely
|
// case 1: // 6 bits - ignore entirely
|
||||||
// break;
|
// break;
|
||||||
case 2 :
|
case 2:
|
||||||
bitWorkArea = bitWorkArea >> 4;
|
bitWorkArea = bitWorkArea >> 4;
|
||||||
buffer[pos++] = (byte) ((bitWorkArea) & MASK_8BITS);
|
buffer[pos++] = (byte)((bitWorkArea) & MASK_8BITS);
|
||||||
break;
|
break;
|
||||||
case 3 :
|
case 3:
|
||||||
bitWorkArea = bitWorkArea >> 2;
|
bitWorkArea = bitWorkArea >> 2;
|
||||||
buffer[pos++] = (byte) ((bitWorkArea >> 8) & MASK_8BITS);
|
buffer[pos++] = (byte)((bitWorkArea >> 8) & MASK_8BITS);
|
||||||
buffer[pos++] = (byte) ((bitWorkArea) & MASK_8BITS);
|
buffer[pos++] = (byte)((bitWorkArea) & MASK_8BITS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -416,8 +358,7 @@ public class Base64 {
|
|||||||
/**
|
/**
|
||||||
* Encodes binary data using the base64 algorithm but does not chunk the output.
|
* Encodes binary data using the base64 algorithm but does not chunk the output.
|
||||||
*
|
*
|
||||||
* @param binaryData
|
* @param binaryData binary data to encode
|
||||||
* binary data to encode
|
|
||||||
* @return byte[] containing Base64 characters in their UTF-8 representation.
|
* @return byte[] containing Base64 characters in their UTF-8 representation.
|
||||||
*/
|
*/
|
||||||
public static byte[] encodeBase64(byte[] binaryData) {
|
public static byte[] encodeBase64(byte[] binaryData) {
|
||||||
@ -427,17 +368,13 @@ public class Base64 {
|
|||||||
/**
|
/**
|
||||||
* Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
|
* Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks.
|
||||||
*
|
*
|
||||||
* @param binaryData
|
* @param binaryData Array containing binary data to encode.
|
||||||
* Array containing binary data to encode.
|
* @param isChunked if <code>true</code> this encoder will chunk the base64 output into 76 character blocks
|
||||||
* @param isChunked
|
* @param urlSafe if <code>true</code> this encoder will emit - and _ instead of the usual + and /
|
||||||
* if <code>true</code> this encoder will chunk the base64 output into 76 character blocks
|
* characters.
|
||||||
* @param urlSafe
|
* @param maxResultSize The maximum result size to accept.
|
||||||
* if <code>true</code> this encoder will emit - and _ instead of the usual + and / characters.
|
|
||||||
* @param maxResultSize
|
|
||||||
* The maximum result size to accept.
|
|
||||||
* @return Base64-encoded data.
|
* @return Base64-encoded data.
|
||||||
* @throws IllegalArgumentException
|
* @throws IllegalArgumentException Thrown when the input array needs an output array bigger than maxResultSize
|
||||||
* Thrown when the input array needs an output array bigger than maxResultSize
|
|
||||||
* @since 1.4
|
* @since 1.4
|
||||||
*/
|
*/
|
||||||
public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe, int maxResultSize) {
|
public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe, int maxResultSize) {
|
||||||
@ -447,7 +384,8 @@ public class Base64 {
|
|||||||
|
|
||||||
// Create this so can use the super-class method
|
// Create this so can use the super-class method
|
||||||
// Also ensures that the same roundings are performed by the ctor and the code
|
// Also ensures that the same roundings are performed by the ctor and the code
|
||||||
Base64 b64 = isChunked ? new Base64(MIME_CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe);
|
Base64 b64 = isChunked ? new Base64(MIME_CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe) : new Base64(0, CHUNK_SEPARATOR,
|
||||||
|
urlSafe);
|
||||||
long len = b64.getEncodedLength(binaryData);
|
long len = b64.getEncodedLength(binaryData);
|
||||||
if (len > maxResultSize) {
|
if (len > maxResultSize) {
|
||||||
throw new IllegalArgumentException("Input array too big, the output array would be bigger (" +
|
throw new IllegalArgumentException("Input array too big, the output array would be bigger (" +
|
||||||
@ -459,25 +397,20 @@ public class Base64 {
|
|||||||
return b64.encode(binaryData);
|
return b64.encode(binaryData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes Base64 data into octets
|
* Decodes Base64 data into octets
|
||||||
*
|
*
|
||||||
* @param base64Data
|
* @param base64Data Byte array containing Base64 data
|
||||||
* Byte array containing Base64 data
|
|
||||||
* @return Array containing decoded data.
|
* @return Array containing decoded data.
|
||||||
*/
|
*/
|
||||||
public static byte[] decodeBase64(byte[] base64Data) {
|
public static byte[] decodeBase64(byte[] base64Data) {
|
||||||
return new Base64().decode(base64Data);
|
return new Base64().decode(base64Data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether or not the <code>octet</code> is in the Base32 alphabet.
|
* Returns whether or not the <code>octet</code> is in the Base32 alphabet.
|
||||||
*
|
*
|
||||||
* @param octet
|
* @param octet The value to test
|
||||||
* The value to test
|
|
||||||
* @return <code>true</code> if the value is defined in the the Base32 alphabet <code>false</code> otherwise.
|
* @return <code>true</code> if the value is defined in the the Base32 alphabet <code>false</code> otherwise.
|
||||||
*/
|
*/
|
||||||
protected boolean isInAlphabet(byte octet) {
|
protected boolean isInAlphabet(byte octet) {
|
||||||
@ -490,11 +423,9 @@ public class Base64 {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* MIME chunk size per RFC 2045 section 6.8.
|
* MIME chunk size per RFC 2045 section 6.8.
|
||||||
*
|
|
||||||
* <p>
|
* <p>
|
||||||
* The {@value} character limit does not count the trailing CRLF, but counts all other characters, including any
|
* <p> The {@value} character limit does not count the trailing CRLF, but counts all other characters, including any
|
||||||
* equal signs.
|
* equal signs. </p>
|
||||||
* </p>
|
|
||||||
*
|
*
|
||||||
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 6.8</a>
|
* @see <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045 section 6.8</a>
|
||||||
*/
|
*/
|
||||||
@ -503,12 +434,14 @@ public class Base64 {
|
|||||||
private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2;
|
private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the default buffer size - currently {@value}
|
* Defines the default buffer size - currently {@value} - must be large enough for at least one encoded
|
||||||
* - must be large enough for at least one encoded block+separator
|
* block+separator
|
||||||
*/
|
*/
|
||||||
private static final int DEFAULT_BUFFER_SIZE = 8192;
|
private static final int DEFAULT_BUFFER_SIZE = 8192;
|
||||||
|
|
||||||
/** Mask used to extract 8 bits, used in decoding bytes */
|
/**
|
||||||
|
* Mask used to extract 8 bits, used in decoding bytes
|
||||||
|
*/
|
||||||
private static final int MASK_8BITS = 0xff;
|
private static final int MASK_8BITS = 0xff;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -518,15 +451,18 @@ public class Base64 {
|
|||||||
|
|
||||||
private static final byte PAD = PAD_DEFAULT;
|
private static final byte PAD = PAD_DEFAULT;
|
||||||
|
|
||||||
/** Number of bytes in each full block of unencoded data, e.g. 4 for Base64 and 5 for Base32 */
|
/**
|
||||||
|
* Number of bytes in each full block of unencoded data, e.g. 4 for Base64 and 5 for Base32
|
||||||
|
*/
|
||||||
private final int unencodedBlockSize;
|
private final int unencodedBlockSize;
|
||||||
|
|
||||||
/** Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8 for Base32 */
|
/**
|
||||||
|
* Number of bytes in each full block of encoded data, e.g. 3 for Base64 and 8 for Base32
|
||||||
|
*/
|
||||||
private final int encodedBlockSize;
|
private final int encodedBlockSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Chunksize for encoding. Not used when decoding.
|
* Chunksize for encoding. Not used when decoding. A value of zero or less implies no chunking of the encoded data.
|
||||||
* A value of zero or less implies no chunking of the encoded data.
|
|
||||||
* Rounded down to nearest multiple of encodedBlockSize.
|
* Rounded down to nearest multiple of encodedBlockSize.
|
||||||
*/
|
*/
|
||||||
private final int lineLength;
|
private final int lineLength;
|
||||||
@ -552,8 +488,8 @@ public class Base64 {
|
|||||||
private int readPos;
|
private int readPos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boolean flag to indicate the EOF has been reached. Once EOF has been reached, this object becomes useless,
|
* Boolean flag to indicate the EOF has been reached. Once EOF has been reached, this object becomes useless, and
|
||||||
* and must be thrown away.
|
* must be thrown away.
|
||||||
*/
|
*/
|
||||||
private boolean eof;
|
private boolean eof;
|
||||||
|
|
||||||
@ -564,8 +500,8 @@ public class Base64 {
|
|||||||
private int currentLinePos;
|
private int currentLinePos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes to the buffer only occur after every 3/5 reads when encoding, and every 4/8 reads when decoding.
|
* Writes to the buffer only occur after every 3/5 reads when encoding, and every 4/8 reads when decoding. This
|
||||||
* This variable helps track that.
|
* variable helps track that.
|
||||||
*/
|
*/
|
||||||
private int modulus;
|
private int modulus;
|
||||||
|
|
||||||
@ -574,8 +510,8 @@ public class Base64 {
|
|||||||
*
|
*
|
||||||
* @param size minimum spare space required
|
* @param size minimum spare space required
|
||||||
*/
|
*/
|
||||||
private void ensureBufferSize(int size){
|
private void ensureBufferSize(int size) {
|
||||||
if ((buffer == null) || (buffer.length < pos + size)){
|
if ((buffer == null) || (buffer.length < pos + size)) {
|
||||||
if (buffer == null) {
|
if (buffer == null) {
|
||||||
buffer = new byte[DEFAULT_BUFFER_SIZE];
|
buffer = new byte[DEFAULT_BUFFER_SIZE];
|
||||||
pos = 0;
|
pos = 0;
|
||||||
@ -589,15 +525,12 @@ public class Base64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts buffered data into the provided byte[] array, starting at position bPos,
|
* Extracts buffered data into the provided byte[] array, starting at position bPos, up to a maximum of bAvail
|
||||||
* up to a maximum of bAvail bytes. Returns how many bytes were actually extracted.
|
* bytes. Returns how many bytes were actually extracted.
|
||||||
*
|
*
|
||||||
* @param b
|
* @param b byte[] array to extract the buffered data into.
|
||||||
* byte[] array to extract the buffered data into.
|
* @param bPos position in byte[] array to start extraction at.
|
||||||
* @param bPos
|
* @param bAvail amount of bytes we're allowed to extract. We may extract fewer (if fewer are available).
|
||||||
* position in byte[] array to start extraction at.
|
|
||||||
* @param bAvail
|
|
||||||
* amount of bytes we're allowed to extract. We may extract fewer (if fewer are available).
|
|
||||||
* @return The number of bytes successfully extracted into the provided byte[] array.
|
* @return The number of bytes successfully extracted into the provided byte[] array.
|
||||||
*/
|
*/
|
||||||
private int readResults(byte[] b, int bPos, int bAvail) {
|
private int readResults(byte[] b, int bPos, int bAvail) {
|
||||||
@ -628,8 +561,7 @@ public class Base64 {
|
|||||||
/**
|
/**
|
||||||
* Decodes a byte[] containing characters in the Base-N alphabet.
|
* Decodes a byte[] containing characters in the Base-N alphabet.
|
||||||
*
|
*
|
||||||
* @param pArray
|
* @param pArray A byte array containing Base-N character data
|
||||||
* A byte array containing Base-N character data
|
|
||||||
* @return a byte array containing binary data
|
* @return a byte array containing binary data
|
||||||
*/
|
*/
|
||||||
private byte[] decode(byte[] pArray) {
|
private byte[] decode(byte[] pArray) {
|
||||||
@ -647,8 +579,7 @@ public class Base64 {
|
|||||||
/**
|
/**
|
||||||
* Encodes a byte[] containing binary data, into a byte[] containing characters in the alphabet.
|
* Encodes a byte[] containing binary data, into a byte[] containing characters in the alphabet.
|
||||||
*
|
*
|
||||||
* @param pArray
|
* @param pArray a byte array containing binary data
|
||||||
* a byte array containing binary data
|
|
||||||
* @return A byte array containing only the basen alphabetic character data
|
* @return A byte array containing only the basen alphabetic character data
|
||||||
*/
|
*/
|
||||||
private byte[] encode(byte[] pArray) {
|
private byte[] encode(byte[] pArray) {
|
||||||
@ -665,11 +596,10 @@ public class Base64 {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests a given byte array to see if it contains any characters within the alphabet or PAD.
|
* Tests a given byte array to see if it contains any characters within the alphabet or PAD.
|
||||||
*
|
* <p>
|
||||||
* Intended for use in checking line-ending arrays
|
* Intended for use in checking line-ending arrays
|
||||||
*
|
*
|
||||||
* @param arrayOctet
|
* @param arrayOctet byte array to test
|
||||||
* byte array to test
|
|
||||||
* @return <code>true</code> if any byte is a valid character in the alphabet or PAD; <code>false</code> otherwise
|
* @return <code>true</code> if any byte is a valid character in the alphabet or PAD; <code>false</code> otherwise
|
||||||
*/
|
*/
|
||||||
private boolean containsAlphabetOrPad(byte[] arrayOctet) {
|
private boolean containsAlphabetOrPad(byte[] arrayOctet) {
|
||||||
@ -688,19 +618,18 @@ public class Base64 {
|
|||||||
* Calculates the amount of space needed to encode the supplied array.
|
* Calculates the amount of space needed to encode the supplied array.
|
||||||
*
|
*
|
||||||
* @param pArray byte[] array which will later be encoded
|
* @param pArray byte[] array which will later be encoded
|
||||||
*
|
* @return amount of space needed to encoded the supplied array. Returns a long since a max-len array will require >
|
||||||
* @return amount of space needed to encoded the supplied array.
|
* Integer.MAX_VALUE
|
||||||
* Returns a long since a max-len array will require > Integer.MAX_VALUE
|
|
||||||
*/
|
*/
|
||||||
private long getEncodedLength(byte[] pArray) {
|
private long getEncodedLength(byte[] pArray) {
|
||||||
// Calculate non-chunked size - rounded up to allow for padding
|
// Calculate non-chunked size - rounded up to allow for padding
|
||||||
// cast to long is needed to avoid possibility of overflow
|
// cast to long is needed to avoid possibility of overflow
|
||||||
long len = ((pArray.length + unencodedBlockSize-1) / unencodedBlockSize) * (long) encodedBlockSize;
|
long len = ((pArray.length + unencodedBlockSize - 1) / unencodedBlockSize) * (long)encodedBlockSize;
|
||||||
if (lineLength > 0) {
|
if (lineLength > 0) {
|
||||||
/**
|
/**
|
||||||
* Round up to nearest multiple
|
* Round up to nearest multiple
|
||||||
*/
|
*/
|
||||||
len += ((len + lineLength-1) / lineLength) * chunkSeparatorLength;
|
len += ((len + lineLength - 1) / lineLength) * chunkSeparatorLength;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ package com.alibaba.nacos.client.identify;
|
|||||||
* Identify Constants
|
* Identify Constants
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class Constants {
|
public class Constants {
|
||||||
public static final String ACCESS_KEY = "accessKey";
|
public static final String ACCESS_KEY = "accessKey";
|
||||||
|
@ -19,7 +19,6 @@ package com.alibaba.nacos.client.identify;
|
|||||||
* Credential Listener
|
* Credential Listener
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface CredentialListener {
|
public interface CredentialListener {
|
||||||
/**
|
/**
|
||||||
|
@ -25,11 +25,11 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
* Credential Service
|
* Credential Service
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public final class CredentialService implements SpasCredentialLoader {
|
public final class CredentialService implements SpasCredentialLoader {
|
||||||
static final public Logger log = LogUtils.logger(CredentialService.class);
|
static final public Logger log = LogUtils.logger(CredentialService.class);
|
||||||
private static ConcurrentHashMap<String, CredentialService> instances = new ConcurrentHashMap<String, CredentialService>();
|
private static ConcurrentHashMap<String, CredentialService> instances
|
||||||
|
= new ConcurrentHashMap<String, CredentialService>();
|
||||||
|
|
||||||
private String appName;
|
private String appName;
|
||||||
private Credentials credentials = new Credentials();
|
private Credentials credentials = new Credentials();
|
||||||
@ -47,7 +47,6 @@ public final class CredentialService implements SpasCredentialLoader {
|
|||||||
watcher = new CredentialWatcher(appName, this);
|
watcher = new CredentialWatcher(appName, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static CredentialService getInstance() {
|
public static CredentialService getInstance() {
|
||||||
return getInstance(null);
|
return getInstance(null);
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,6 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
|||||||
* Credential Watcher
|
* Credential Watcher
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class CredentialWatcher {
|
public class CredentialWatcher {
|
||||||
static final public Logger SpasLogger = LogUtils.logger(CredentialWatcher.class);
|
static final public Logger SpasLogger = LogUtils.logger(CredentialWatcher.class);
|
||||||
@ -110,15 +109,14 @@ public class CredentialWatcher {
|
|||||||
propertyPath = value;
|
propertyPath = value;
|
||||||
}
|
}
|
||||||
if (propertyPath == null || propertyPath.isEmpty()) {
|
if (propertyPath == null || propertyPath.isEmpty()) {
|
||||||
propertyPath = Constants.CREDENTIAL_PATH + (appName == null ? Constants.CREDENTIAL_DEFAULT : appName);
|
propertyPath = Constants.CREDENTIAL_PATH + (appName == null ? Constants.CREDENTIAL_DEFAULT
|
||||||
}
|
: appName);
|
||||||
else {
|
} else {
|
||||||
if (logWarn) {
|
if (logWarn) {
|
||||||
SpasLogger.info(appName, "Defined credential file: -D" + "spas.identity" + "=" + propertyPath);
|
SpasLogger.info(appName, "Defined credential file: -D" + "spas.identity" + "=" + propertyPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (logWarn) {
|
if (logWarn) {
|
||||||
SpasLogger.info(appName, "Load credential file from classpath: " + Constants.PROPERTIES_FILENAME);
|
SpasLogger.info(appName, "Load credential file from classpath: " + Constants.PROPERTIES_FILENAME);
|
||||||
}
|
}
|
||||||
@ -130,7 +128,8 @@ public class CredentialWatcher {
|
|||||||
try {
|
try {
|
||||||
propertiesIS = new FileInputStream(propertyPath);
|
propertiesIS = new FileInputStream(propertyPath);
|
||||||
} catch (FileNotFoundException e) {
|
} catch (FileNotFoundException e) {
|
||||||
if (appName != null && !appName.equals(Constants.CREDENTIAL_DEFAULT) && propertyPath.equals(Constants.CREDENTIAL_PATH + appName)) {
|
if (appName != null && !appName.equals(Constants.CREDENTIAL_DEFAULT) && propertyPath.equals(
|
||||||
|
Constants.CREDENTIAL_PATH + appName)) {
|
||||||
propertyPath = Constants.CREDENTIAL_PATH + Constants.CREDENTIAL_DEFAULT;
|
propertyPath = Constants.CREDENTIAL_PATH + Constants.CREDENTIAL_DEFAULT;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -154,8 +153,7 @@ public class CredentialWatcher {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
Properties properties = new Properties();
|
Properties properties = new Properties();
|
||||||
try {
|
try {
|
||||||
properties.load(propertiesIS);
|
properties.load(propertiesIS);
|
||||||
|
@ -19,7 +19,6 @@ package com.alibaba.nacos.client.identify;
|
|||||||
* Credentials
|
* Credentials
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class Credentials implements SpasCredential {
|
public class Credentials implements SpasCredential {
|
||||||
|
|
||||||
@ -59,7 +58,9 @@ public class Credentials implements SpasCredential {
|
|||||||
public boolean identical(Credentials other) {
|
public boolean identical(Credentials other) {
|
||||||
return this == other ||
|
return this == other ||
|
||||||
(other != null &&
|
(other != null &&
|
||||||
(accessKey == null && other.accessKey == null || accessKey != null && accessKey.equals(other.accessKey)) &&
|
(accessKey == null && other.accessKey == null || accessKey != null && accessKey.equals(other.accessKey))
|
||||||
(secretKey == null && other.secretKey == null || secretKey != null && secretKey.equals(other.secretKey)));
|
&&
|
||||||
|
(secretKey == null && other.secretKey == null || secretKey != null && secretKey.equals(
|
||||||
|
other.secretKey)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ package com.alibaba.nacos.client.identify;
|
|||||||
* Spas Credential Interface
|
* Spas Credential Interface
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface SpasCredential {
|
public interface SpasCredential {
|
||||||
/**
|
/**
|
||||||
|
@ -19,7 +19,6 @@ package com.alibaba.nacos.client.identify;
|
|||||||
* Spas Credential Loader
|
* Spas Credential Loader
|
||||||
*
|
*
|
||||||
* @author Nacos
|
* @author Nacos
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public interface SpasCredentialLoader {
|
public interface SpasCredentialLoader {
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +24,11 @@ public enum Level {
|
|||||||
/**
|
/**
|
||||||
* log level
|
* log level
|
||||||
*/
|
*/
|
||||||
DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR"), OFF("OFF");
|
DEBUG("DEBUG"),
|
||||||
|
INFO("INFO"),
|
||||||
|
WARN("WARN"),
|
||||||
|
ERROR("ERROR"),
|
||||||
|
OFF("OFF");
|
||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
@ -213,12 +213,14 @@ public interface Logger extends ActivateOption {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断Info级别是否开启
|
* 判断Info级别是否开启
|
||||||
|
*
|
||||||
* @return Info级别是否开启
|
* @return Info级别是否开启
|
||||||
*/
|
*/
|
||||||
boolean isInfoEnabled();
|
boolean isInfoEnabled();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断Warn级别是否开启
|
* 判断Warn级别是否开启
|
||||||
|
*
|
||||||
* @return Warn级别是否开启
|
* @return Warn级别是否开启
|
||||||
*/
|
*/
|
||||||
boolean isWarnEnabled();
|
boolean isWarnEnabled();
|
||||||
@ -232,6 +234,7 @@ public interface Logger extends ActivateOption {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* * 获取内部日志实现对象
|
* * 获取内部日志实现对象
|
||||||
|
*
|
||||||
* @return 内部日志实现对象
|
* @return 内部日志实现对象
|
||||||
*/
|
*/
|
||||||
Object getDelegate();
|
Object getDelegate();
|
||||||
|
@ -15,16 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
package com.alibaba.nacos.client.logger;
|
package com.alibaba.nacos.client.logger;
|
||||||
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.client.logger.log4j.Log4jLoggerFactory;
|
|
||||||
import com.alibaba.nacos.client.logger.log4j2.Log4j2LoggerFactory;
|
import com.alibaba.nacos.client.logger.log4j2.Log4j2LoggerFactory;
|
||||||
import com.alibaba.nacos.client.logger.nop.NopLoggerFactory;
|
import com.alibaba.nacos.client.logger.nop.NopLoggerFactory;
|
||||||
import com.alibaba.nacos.client.logger.slf4j.Slf4jLoggerFactory;
|
import com.alibaba.nacos.client.logger.slf4j.Slf4jLoggerFactory;
|
||||||
import com.alibaba.nacos.client.logger.support.ILoggerFactory;
|
import com.alibaba.nacos.client.logger.support.ILoggerFactory;
|
||||||
import com.alibaba.nacos.client.logger.support.LogLog;
|
import com.alibaba.nacos.client.logger.support.LogLog;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <pre>
|
* <pre>
|
||||||
* 阿里中间件LoggerFactory,获取具体日志实现
|
* 阿里中间件LoggerFactory,获取具体日志实现
|
||||||
@ -56,20 +55,15 @@ public class LoggerFactory {
|
|||||||
setLoggerFactory(new Slf4jLoggerFactory());
|
setLoggerFactory(new Slf4jLoggerFactory());
|
||||||
LogLog.info("Init JM logger with Slf4jLoggerFactory success, " + LoggerFactory.class.getClassLoader());
|
LogLog.info("Init JM logger with Slf4jLoggerFactory success, " + LoggerFactory.class.getClassLoader());
|
||||||
} catch (Throwable e1) {
|
} catch (Throwable e1) {
|
||||||
try {
|
|
||||||
setLoggerFactory(new Log4jLoggerFactory());
|
|
||||||
LogLog.info("Init JM logger with Log4jLoggerFactory, " + LoggerFactory.class.getClassLoader());
|
|
||||||
} catch (Throwable e2) {
|
|
||||||
try {
|
try {
|
||||||
setLoggerFactory(new Log4j2LoggerFactory());
|
setLoggerFactory(new Log4j2LoggerFactory());
|
||||||
LogLog.info("Init JM logger with Log4j2LoggerFactory, " + LoggerFactory.class.getClassLoader());
|
LogLog.info("Init JM logger with Log4j2LoggerFactory, " + LoggerFactory.class.getClassLoader());
|
||||||
} catch (Throwable e3) {
|
} catch (Throwable e2) {
|
||||||
setLoggerFactory(new NopLoggerFactory());
|
setLoggerFactory(new NopLoggerFactory());
|
||||||
LogLog.warn("Init JM logger with NopLoggerFactory, pay attention. "
|
LogLog.warn("Init JM logger with NopLoggerFactory, pay attention. "
|
||||||
+ LoggerFactory.class.getClassLoader(), e2);
|
+ LoggerFactory.class.getClassLoader(), e2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
loggerCache = new ConcurrentHashMap<String, Logger>();
|
loggerCache = new ConcurrentHashMap<String, Logger>();
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ import java.util.Iterator;
|
|||||||
/**
|
/**
|
||||||
* A JSON array. JSONObject supports java.util.List interface.
|
* A JSON array. JSONObject supports java.util.List interface.
|
||||||
*
|
*
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
||||||
@ -38,48 +38,46 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
/**
|
/**
|
||||||
* Constructs an empty JSONArray.
|
* Constructs an empty JSONArray.
|
||||||
*/
|
*/
|
||||||
public JSONArray(){
|
public JSONArray() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a JSONArray containing the elements of the specified
|
* Constructs a JSONArray containing the elements of the specified collection, in the order they are returned by the
|
||||||
* collection, in the order they are returned by the collection's iterator.
|
* collection's iterator.
|
||||||
*
|
*
|
||||||
* @param c the collection whose elements are to be placed into this JSONArray
|
* @param c the collection whose elements are to be placed into this JSONArray
|
||||||
*/
|
*/
|
||||||
public JSONArray(Collection c){
|
public JSONArray(Collection c) {
|
||||||
super(c);
|
super(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode a list into JSON text and write it to out.
|
* Encode a list into JSON text and write it to out. If this list is also a JSONStreamAware or a JSONAware,
|
||||||
* If this list is also a JSONStreamAware or a JSONAware, JSONStreamAware and JSONAware specific behaviours will be ignored at this top level.
|
* JSONStreamAware and JSONAware specific behaviours will be ignored at this top level.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
|
||||||
*
|
*
|
||||||
* @param collection
|
* @param collection
|
||||||
* @param out
|
* @param out
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
||||||
*/
|
*/
|
||||||
public static void writeJSONString(Collection collection, Writer out) throws IOException{
|
public static void writeJSONString(Collection collection, Writer out) throws IOException {
|
||||||
if(collection == null){
|
if (collection == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
Iterator iter=collection.iterator();
|
Iterator iter = collection.iterator();
|
||||||
|
|
||||||
out.write('[');
|
out.write('[');
|
||||||
while(iter.hasNext()){
|
while (iter.hasNext()) {
|
||||||
if(first) {
|
if (first) {
|
||||||
first = false;
|
first = false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
out.write(',');
|
out.write(',');
|
||||||
}
|
}
|
||||||
Object value=iter.next();
|
Object value = iter.next();
|
||||||
if(value == null){
|
if (value == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -89,41 +87,40 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
out.write(']');
|
out.write(']');
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeJSONString(Writer out) throws IOException{
|
public void writeJSONString(Writer out) throws IOException {
|
||||||
writeJSONString(this, out);
|
writeJSONString(this, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a list to JSON text. The result is a JSON array.
|
* Convert a list to JSON text. The result is a JSON array. If this list is also a JSONAware, JSONAware specific
|
||||||
* If this list is also a JSONAware, JSONAware specific behaviours will be omitted at this top level.
|
* behaviours will be omitted at this top level.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
|
||||||
*
|
*
|
||||||
* @param collection
|
* @param collection
|
||||||
* @return JSON text, or "null" if list is null.
|
* @return JSON text, or "null" if list is null.
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
||||||
*/
|
*/
|
||||||
public static String toJSONString(Collection collection){
|
public static String toJSONString(Collection collection) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(collection, writer);
|
writeJSONString(collection, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(byte[] array, Writer out) throws IOException{
|
public static void writeJSONString(byte[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -132,28 +129,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(byte[] array){
|
public static String toJSONString(byte[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(short[] array, Writer out) throws IOException{
|
public static void writeJSONString(short[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -162,28 +159,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(short[] array){
|
public static String toJSONString(short[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(int[] array, Writer out) throws IOException{
|
public static void writeJSONString(int[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -192,28 +189,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(int[] array){
|
public static String toJSONString(int[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(long[] array, Writer out) throws IOException{
|
public static void writeJSONString(long[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -222,28 +219,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(long[] array){
|
public static String toJSONString(long[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(float[] array, Writer out) throws IOException{
|
public static void writeJSONString(float[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -252,28 +249,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(float[] array){
|
public static String toJSONString(float[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(double[] array, Writer out) throws IOException{
|
public static void writeJSONString(double[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -282,28 +279,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(double[] array){
|
public static String toJSONString(double[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(boolean[] array, Writer out) throws IOException{
|
public static void writeJSONString(boolean[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -312,28 +309,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(boolean[] array){
|
public static String toJSONString(boolean[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(char[] array, Writer out) throws IOException{
|
public static void writeJSONString(char[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[\"");
|
out.write("[\"");
|
||||||
out.write(String.valueOf(array[0]));
|
out.write(String.valueOf(array[0]));
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write("\",\"");
|
out.write("\",\"");
|
||||||
out.write(String.valueOf(array[i]));
|
out.write(String.valueOf(array[i]));
|
||||||
}
|
}
|
||||||
@ -342,28 +339,28 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(char[] array){
|
public static String toJSONString(char[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeJSONString(Object[] array, Writer out) throws IOException{
|
public static void writeJSONString(Object[] array, Writer out) throws IOException {
|
||||||
if(array == null){
|
if (array == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
} else if(array.length == 0) {
|
} else if (array.length == 0) {
|
||||||
out.write("[]");
|
out.write("[]");
|
||||||
} else {
|
} else {
|
||||||
out.write("[");
|
out.write("[");
|
||||||
JSONValue.writeJSONString(array[0], out);
|
JSONValue.writeJSONString(array[0], out);
|
||||||
|
|
||||||
for(int i = 1; i < array.length; i++){
|
for (int i = 1; i < array.length; i++) {
|
||||||
out.write(",");
|
out.write(",");
|
||||||
JSONValue.writeJSONString(array[i], out);
|
JSONValue.writeJSONString(array[i], out);
|
||||||
}
|
}
|
||||||
@ -372,25 +369,24 @@ public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toJSONString(Object[] array){
|
public static String toJSONString(Object[] array) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
writeJSONString(array, writer);
|
writeJSONString(array, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toJSONString(){
|
public String toJSONString() {
|
||||||
return toJSONString(this);
|
return toJSONString(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a string representation of this array. This is equivalent to
|
* Returns a string representation of this array. This is equivalent to calling {@link JSONArray#toJSONString()}.
|
||||||
* calling {@link JSONArray#toJSONString()}.
|
|
||||||
*/
|
*/
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return toJSONString();
|
return toJSONString();
|
||||||
|
@ -17,7 +17,8 @@ package com.alibaba.nacos.client.logger.json;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Beans that support customized output of JSON text shall implement this interface.
|
* Beans that support customized output of JSON text shall implement this interface.
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
*
|
||||||
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public interface JSONAware {
|
public interface JSONAware {
|
||||||
|
@ -29,21 +29,20 @@ import java.util.Map;
|
|||||||
/**
|
/**
|
||||||
* A JSON object. Key value pairs are unordered. JSONObject supports java.util.Map interface.
|
* A JSON object. Key value pairs are unordered. JSONObject supports java.util.Map interface.
|
||||||
*
|
*
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{
|
public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware {
|
||||||
|
|
||||||
private static final long serialVersionUID = -503443796854799292L;
|
private static final long serialVersionUID = -503443796854799292L;
|
||||||
|
|
||||||
|
|
||||||
public JSONObject() {
|
public JSONObject() {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows creation of a JSONObject from a Map. After that, both the
|
* Allows creation of a JSONObject from a Map. After that, both the generated JSONObject and the Map can be modified
|
||||||
* generated JSONObject and the Map can be modified independently.
|
* independently.
|
||||||
*
|
*
|
||||||
* @param map
|
* @param map
|
||||||
*/
|
*/
|
||||||
@ -51,34 +50,31 @@ public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAwa
|
|||||||
super(map);
|
super(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode a map into JSON text and write it to out.
|
* Encode a map into JSON text and write it to out. If this map is also a JSONAware or JSONStreamAware, JSONAware or
|
||||||
* If this map is also a JSONAware or JSONStreamAware, JSONAware or JSONStreamAware specific behaviours will be ignored at this top level.
|
* JSONStreamAware specific behaviours will be ignored at this top level.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
|
||||||
*
|
*
|
||||||
* @param map
|
* @param map
|
||||||
* @param out
|
* @param out
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
||||||
*/
|
*/
|
||||||
public static void writeJSONString(Map map, Writer out) throws IOException {
|
public static void writeJSONString(Map map, Writer out) throws IOException {
|
||||||
if(map == null){
|
if (map == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean first = true;
|
boolean first = true;
|
||||||
Iterator iter=map.entrySet().iterator();
|
Iterator iter = map.entrySet().iterator();
|
||||||
|
|
||||||
out.write('{');
|
out.write('{');
|
||||||
while(iter.hasNext()){
|
while (iter.hasNext()) {
|
||||||
if (first) {
|
if (first) {
|
||||||
first = false;
|
first = false;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
out.write(',');
|
out.write(',');
|
||||||
}
|
}
|
||||||
Map.Entry entry = (Map.Entry) iter.next();
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
out.write('\"');
|
out.write('\"');
|
||||||
out.write(escape(String.valueOf(entry.getKey())));
|
out.write(escape(String.valueOf(entry.getKey())));
|
||||||
out.write('\"');
|
out.write('\"');
|
||||||
@ -88,20 +84,19 @@ public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAwa
|
|||||||
out.write('}');
|
out.write('}');
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeJSONString(Writer out) throws IOException{
|
public void writeJSONString(Writer out) throws IOException {
|
||||||
writeJSONString(this, out);
|
writeJSONString(this, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert a map to JSON text. The result is a JSON object.
|
* Convert a map to JSON text. The result is a JSON object. If this map is also a JSONAware, JSONAware specific
|
||||||
* If this map is also a JSONAware, JSONAware specific behaviours will be omitted at this top level.
|
* behaviours will be omitted at this top level.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
|
||||||
*
|
*
|
||||||
* @param map
|
* @param map
|
||||||
* @return JSON text, or "null" if map is null.
|
* @return JSON text, or "null" if map is null.
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
||||||
*/
|
*/
|
||||||
public static String toJSONString(Map map){
|
public static String toJSONString(Map map) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -113,21 +108,20 @@ public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAwa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toJSONString(){
|
public String toJSONString() {
|
||||||
return toJSONString(this);
|
return toJSONString(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString(){
|
public String toString() {
|
||||||
return toJSONString();
|
return toJSONString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String toString(String key,Object value){
|
public static String toString(String key, Object value) {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
sb.append('\"');
|
sb.append('\"');
|
||||||
if(key == null) {
|
if (key == null) {
|
||||||
sb.append("null");
|
sb.append("null");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
JSONValue.escape(key, sb);
|
JSONValue.escape(key, sb);
|
||||||
}
|
}
|
||||||
sb.append('\"').append(':');
|
sb.append('\"').append(':');
|
||||||
@ -138,15 +132,14 @@ public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAwa
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
|
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). It's the same as
|
||||||
* It's the same as JSONValue.escape() only for compatibility here.
|
* JSONValue.escape() only for compatibility here.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#escape(String)
|
|
||||||
*
|
*
|
||||||
* @param s
|
* @param s
|
||||||
* @return
|
* @return
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.JSONValue#escape(String)
|
||||||
*/
|
*/
|
||||||
public static String escape(String s){
|
public static String escape(String s) {
|
||||||
return JSONValue.escape(s);
|
return JSONValue.escape(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,20 +19,17 @@ import java.io.IOException;
|
|||||||
import java.io.Writer;
|
import java.io.Writer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Beans that support customized output of JSON text to a writer shall implement
|
* Beans that support customized output of JSON text to a writer shall implement this interface.
|
||||||
* this interface.
|
|
||||||
*
|
*
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public interface JSONStreamAware {
|
public interface JSONStreamAware {
|
||||||
/**
|
/**
|
||||||
* write JSON string to out.
|
* write JSON string to out.
|
||||||
*
|
*
|
||||||
* @param out
|
* @param out out writer
|
||||||
* out writer
|
* @throws IOException Exception
|
||||||
* @throws IOException
|
|
||||||
* Exception
|
|
||||||
*/
|
*/
|
||||||
void writeJSONString(Writer out) throws IOException;
|
void writeJSONString(Writer out) throws IOException;
|
||||||
}
|
}
|
||||||
|
@ -30,213 +30,186 @@ import java.util.Map;
|
|||||||
import com.alibaba.nacos.client.logger.json.parser.JSONParser;
|
import com.alibaba.nacos.client.logger.json.parser.JSONParser;
|
||||||
import com.alibaba.nacos.client.logger.json.parser.ParseException;
|
import com.alibaba.nacos.client.logger.json.parser.ParseException;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class JSONValue {
|
public class JSONValue {
|
||||||
/**
|
/**
|
||||||
* Parse JSON text into java object from the input source.
|
* Parse JSON text into java object from the input source. Please use parseWithException() if you don't want to
|
||||||
* Please use parseWithException() if you don't want to ignore the exception.
|
* ignore the exception.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
|
||||||
* @see #parseWithException(Reader)
|
|
||||||
*
|
*
|
||||||
* @param in
|
* @param in
|
||||||
* @return Instance of the following:
|
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
||||||
* java.lang.String,
|
* @see #parseWithException(Reader)
|
||||||
* java.lang.Number,
|
* @deprecated this method may throw an {@code Error} instead of returning {@code null}; please use {@link
|
||||||
* java.lang.Boolean,
|
* JSONValue#parseWithException(Reader)} instead
|
||||||
* null
|
|
||||||
*
|
|
||||||
* @deprecated this method may throw an {@code Error} instead of returning
|
|
||||||
* {@code null}; please use {@link JSONValue#parseWithException(Reader)}
|
|
||||||
* instead
|
|
||||||
*/
|
*/
|
||||||
public static Object parse(Reader in){
|
public static Object parse(Reader in) {
|
||||||
try{
|
try {
|
||||||
JSONParser parser=new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
return parser.parse(in);
|
return parser.parse(in);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch(Exception e){
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse JSON text into java object from the given string.
|
* Parse JSON text into java object from the given string. Please use parseWithException() if you don't want to
|
||||||
* Please use parseWithException() if you don't want to ignore the exception.
|
* ignore the exception.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
|
||||||
* @see #parseWithException(Reader)
|
|
||||||
*
|
*
|
||||||
* @param s
|
* @param s
|
||||||
* @return Instance of the following:
|
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
||||||
* java.lang.String,
|
* @see #parseWithException(Reader)
|
||||||
* java.lang.Number,
|
* @deprecated this method may throw an {@code Error} instead of returning {@code null}; please use {@link
|
||||||
* java.lang.Boolean,
|
* JSONValue#parseWithException(String)} instead
|
||||||
* null
|
|
||||||
*
|
|
||||||
* @deprecated this method may throw an {@code Error} instead of returning
|
|
||||||
* {@code null}; please use {@link JSONValue#parseWithException(String)}
|
|
||||||
* instead
|
|
||||||
*/
|
*/
|
||||||
public static Object parse(String s){
|
public static Object parse(String s) {
|
||||||
StringReader in=new StringReader(s);
|
StringReader in = new StringReader(s);
|
||||||
return parse(in);
|
return parse(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse JSON text into java object from the input source.
|
* Parse JSON text into java object from the input source.
|
||||||
*
|
*
|
||||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser
|
|
||||||
*
|
|
||||||
* @param in
|
* @param in
|
||||||
* @return Instance of the following:
|
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
|
||||||
* java.lang.String,
|
|
||||||
* java.lang.Number,
|
|
||||||
* java.lang.Boolean,
|
|
||||||
* null
|
|
||||||
*
|
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws ParseException
|
* @throws ParseException
|
||||||
|
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser
|
||||||
*/
|
*/
|
||||||
public static Object parseWithException(Reader in) throws IOException, ParseException {
|
public static Object parseWithException(Reader in) throws IOException, ParseException {
|
||||||
JSONParser parser=new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
return parser.parse(in);
|
return parser.parse(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Object parseWithException(String s) throws ParseException{
|
public static Object parseWithException(String s) throws ParseException {
|
||||||
JSONParser parser=new JSONParser();
|
JSONParser parser = new JSONParser();
|
||||||
return parser.parse(s);
|
return parser.parse(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode an object into JSON text and write it to out.
|
* Encode an object into JSON text and write it to out.
|
||||||
* <p>
|
* <p>
|
||||||
* If this object is a Map or a List, and it's also a JSONStreamAware or a JSONAware, JSONStreamAware or JSONAware will be considered firstly.
|
* If this object is a Map or a List, and it's also a JSONStreamAware or a JSONAware, JSONStreamAware or JSONAware
|
||||||
|
* will be considered firstly.
|
||||||
* <p>
|
* <p>
|
||||||
* DO NOT call this method from writeJSONString(Writer) of a class that implements both JSONStreamAware and (Map or List) with
|
* DO NOT call this method from writeJSONString(Writer) of a class that implements both JSONStreamAware and (Map or
|
||||||
* "this" as the first parameter, use JSONObject.writeJSONString(Map, Writer) or JSONArray.writeJSONString(List, Writer) instead.
|
* List) with "this" as the first parameter, use JSONObject.writeJSONString(Map, Writer) or
|
||||||
*
|
* JSONArray.writeJSONString(List, Writer) instead.
|
||||||
* @see com.alibaba.nacos.client.logger.jsonJSONObject#writeJSONString(Map, Writer)
|
|
||||||
* @see com.alibaba.nacos.client.logger.jsonJSONArray#writeJSONString(List, Writer)
|
|
||||||
*
|
*
|
||||||
* @param value
|
* @param value
|
||||||
* @param writer
|
* @param writer
|
||||||
|
* @see com.alibaba.nacos.client.logger.jsonJSONObject#writeJSONString(Map, Writer)
|
||||||
|
* @see com.alibaba.nacos.client.logger.jsonJSONArray#writeJSONString(List, Writer)
|
||||||
*/
|
*/
|
||||||
public static void writeJSONString(Object value, Writer out) throws IOException {
|
public static void writeJSONString(Object value, Writer out) throws IOException {
|
||||||
if(value == null){
|
if (value == null) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof String){
|
if (value instanceof String) {
|
||||||
out.write('\"');
|
out.write('\"');
|
||||||
out.write(escape((String)value));
|
out.write(escape((String)value));
|
||||||
out.write('\"');
|
out.write('\"');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Double){
|
if (value instanceof Double) {
|
||||||
if(((Double)value).isInfinite() || ((Double)value).isNaN()) {
|
if (((Double)value).isInfinite() || ((Double)value).isNaN()) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
out.write(value.toString());
|
out.write(value.toString());
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Float){
|
if (value instanceof Float) {
|
||||||
if(((Float)value).isInfinite() || ((Float)value).isNaN()) {
|
if (((Float)value).isInfinite() || ((Float)value).isNaN()) {
|
||||||
out.write("null");
|
out.write("null");
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
out.write(value.toString());
|
out.write(value.toString());
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Number){
|
if (value instanceof Number) {
|
||||||
out.write(value.toString());
|
out.write(value.toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Boolean){
|
if (value instanceof Boolean) {
|
||||||
out.write(value.toString());
|
out.write(value.toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((value instanceof JSONStreamAware)){
|
if ((value instanceof JSONStreamAware)) {
|
||||||
((JSONStreamAware)value).writeJSONString(out);
|
((JSONStreamAware)value).writeJSONString(out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((value instanceof JSONAware)){
|
if ((value instanceof JSONAware)) {
|
||||||
out.write(((JSONAware)value).toJSONString());
|
out.write(((JSONAware)value).toJSONString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Map){
|
if (value instanceof Map) {
|
||||||
JSONObject.writeJSONString((Map)value, out);
|
JSONObject.writeJSONString((Map)value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Collection){
|
if (value instanceof Collection) {
|
||||||
JSONArray.writeJSONString((Collection)value, out);
|
JSONArray.writeJSONString((Collection)value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof byte[]){
|
if (value instanceof byte[]) {
|
||||||
JSONArray.writeJSONString((byte[])value, out);
|
JSONArray.writeJSONString((byte[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof short[]){
|
if (value instanceof short[]) {
|
||||||
JSONArray.writeJSONString((short[])value, out);
|
JSONArray.writeJSONString((short[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof int[]){
|
if (value instanceof int[]) {
|
||||||
JSONArray.writeJSONString((int[])value, out);
|
JSONArray.writeJSONString((int[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof long[]){
|
if (value instanceof long[]) {
|
||||||
JSONArray.writeJSONString((long[])value, out);
|
JSONArray.writeJSONString((long[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof float[]){
|
if (value instanceof float[]) {
|
||||||
JSONArray.writeJSONString((float[])value, out);
|
JSONArray.writeJSONString((float[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof double[]){
|
if (value instanceof double[]) {
|
||||||
JSONArray.writeJSONString((double[])value, out);
|
JSONArray.writeJSONString((double[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof boolean[]){
|
if (value instanceof boolean[]) {
|
||||||
JSONArray.writeJSONString((boolean[])value, out);
|
JSONArray.writeJSONString((boolean[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof char[]){
|
if (value instanceof char[]) {
|
||||||
JSONArray.writeJSONString((char[])value, out);
|
JSONArray.writeJSONString((char[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(value instanceof Object[]){
|
if (value instanceof Object[]) {
|
||||||
JSONArray.writeJSONString((Object[])value, out);
|
JSONArray.writeJSONString((Object[])value, out);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -249,21 +222,20 @@ public class JSONValue {
|
|||||||
* <p>
|
* <p>
|
||||||
* If this object is a Map or a List, and it's also a JSONAware, JSONAware will be considered firstly.
|
* If this object is a Map or a List, and it's also a JSONAware, JSONAware will be considered firstly.
|
||||||
* <p>
|
* <p>
|
||||||
* DO NOT call this method from toJSONString() of a class that implements both JSONAware and Map or List with
|
* DO NOT call this method from toJSONString() of a class that implements both JSONAware and Map or List with "this"
|
||||||
* "this" as the parameter, use JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead.
|
* as the parameter, use JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead.
|
||||||
*
|
|
||||||
* @see com.alibaba.nacos.client.logger.json.JSONObject#toJSONString(Map)
|
|
||||||
*
|
*
|
||||||
* @param value
|
* @param value
|
||||||
* @return JSON text, or "null" if value is null or it's an NaN or an INF number.
|
* @return JSON text, or "null" if value is null or it's an NaN or an INF number.
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.JSONObject#toJSONString(Map)
|
||||||
*/
|
*/
|
||||||
public static String toJSONString(Object value){
|
public static String toJSONString(Object value) {
|
||||||
final StringWriter writer = new StringWriter();
|
final StringWriter writer = new StringWriter();
|
||||||
|
|
||||||
try{
|
try {
|
||||||
writeJSONString(value, writer);
|
writeJSONString(value, writer);
|
||||||
return writer.toString();
|
return writer.toString();
|
||||||
} catch(IOException e){
|
} catch (IOException e) {
|
||||||
// This should never happen for a StringWriter
|
// This should never happen for a StringWriter
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@ -271,11 +243,12 @@ public class JSONValue {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
|
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
|
||||||
|
*
|
||||||
* @param s
|
* @param s
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String escape(String s){
|
public static String escape(String s) {
|
||||||
if(s==null) {
|
if (s == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
@ -289,9 +262,9 @@ public class JSONValue {
|
|||||||
*/
|
*/
|
||||||
static void escape(String s, StringBuffer sb) {
|
static void escape(String s, StringBuffer sb) {
|
||||||
final int len = s.length();
|
final int len = s.length();
|
||||||
for(int i=0;i<len;i++){
|
for (int i = 0; i < len; i++) {
|
||||||
char ch=s.charAt(i);
|
char ch = s.charAt(i);
|
||||||
switch(ch){
|
switch (ch) {
|
||||||
case '"':
|
case '"':
|
||||||
sb.append("\\\"");
|
sb.append("\\\"");
|
||||||
break;
|
break;
|
||||||
@ -318,15 +291,14 @@ public class JSONValue {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
//Reference: http://www.unicode.org/versions/Unicode5.1.0/
|
//Reference: http://www.unicode.org/versions/Unicode5.1.0/
|
||||||
if(isUnicodeChar(ch)){
|
if (isUnicodeChar(ch)) {
|
||||||
String ss=Integer.toHexString(ch);
|
String ss = Integer.toHexString(ch);
|
||||||
sb.append("\\u");
|
sb.append("\\u");
|
||||||
for(int k=0;k<FOUR-ss.length();k++){
|
for (int k = 0; k < FOUR - ss.length(); k++) {
|
||||||
sb.append('0');
|
sb.append('0');
|
||||||
}
|
}
|
||||||
sb.append(ss.toUpperCase());
|
sb.append(ss.toUpperCase());
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
sb.append(ch);
|
sb.append(ch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,20 +21,23 @@ import java.util.Map;
|
|||||||
/**
|
/**
|
||||||
* Container factory for creating containers for JSON object and JSON array.
|
* Container factory for creating containers for JSON object and JSON array.
|
||||||
*
|
*
|
||||||
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#parse(java.io.Reader, ContainerFactory)
|
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#parse(java.io.Reader, ContainerFactory)
|
||||||
*
|
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
|
||||||
*/
|
*/
|
||||||
public interface ContainerFactory {
|
public interface ContainerFactory {
|
||||||
/**
|
/**
|
||||||
* create json container
|
* create json container
|
||||||
* @return A Map instance to store JSON object, or null if you want to use com.alibaba.nacos.client.logger.jsonJSONObject.
|
*
|
||||||
|
* @return A Map instance to store JSON object, or null if you want to use com.alibaba.nacos.client.logger
|
||||||
|
* .jsonJSONObject.
|
||||||
*/
|
*/
|
||||||
Map createObjectContainer();
|
Map createObjectContainer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create array json container
|
* create array json container
|
||||||
* @return A List instance to store JSON array, or null if you want to use com.alibaba.nacos.client.logger.jsonJSONArray.
|
*
|
||||||
|
* @return A List instance to store JSON array, or null if you want to use com.alibaba.nacos.client.logger
|
||||||
|
* .jsonJSONArray.
|
||||||
*/
|
*/
|
||||||
List creatArrayContainer();
|
List creatArrayContainer();
|
||||||
}
|
}
|
||||||
|
@ -20,18 +20,16 @@ import java.io.IOException;
|
|||||||
/**
|
/**
|
||||||
* A simplified and stoppable SAX-like content handler for stream processing of JSON text.
|
* A simplified and stoppable SAX-like content handler for stream processing of JSON text.
|
||||||
*
|
*
|
||||||
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
* @see org.xml.sax.ContentHandler
|
* @see org.xml.sax.ContentHandler
|
||||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#parse(java.io.Reader, ContentHandler, boolean)
|
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#parse(java.io.Reader, ContentHandler, boolean)
|
||||||
*
|
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
|
||||||
*/
|
*/
|
||||||
public interface ContentHandler {
|
public interface ContentHandler {
|
||||||
/**
|
/**
|
||||||
* Receive notification of the beginning of JSON processing.
|
* Receive notification of the beginning of JSON processing. The parser will invoke this method only once.
|
||||||
* The parser will invoke this method only once.
|
|
||||||
*
|
*
|
||||||
* @throws ParseException
|
* @throws ParseException - JSONParser will stop and throw the same exception to the caller when receiving this
|
||||||
* - JSONParser will stop and throw the same exception to the caller when receiving this exception.
|
* exception.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
void startJSON() throws ParseException, IOException;
|
void startJSON() throws ParseException, IOException;
|
||||||
@ -48,8 +46,8 @@ public interface ContentHandler {
|
|||||||
* Receive notification of the beginning of a JSON object.
|
* Receive notification of the beginning of a JSON object.
|
||||||
*
|
*
|
||||||
* @return false if the handler wants to stop parsing after return.
|
* @return false if the handler wants to stop parsing after return.
|
||||||
* @throws ParseException
|
* @throws ParseException - JSONParser will stop and throw the same exception to the caller when receiving this
|
||||||
* - JSONParser will stop and throw the same exception to the caller when receiving this exception.
|
* exception.
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @see #endJSON
|
* @see #endJSON
|
||||||
*/
|
*/
|
||||||
@ -69,7 +67,6 @@ public interface ContentHandler {
|
|||||||
* Receive notification of the beginning of a JSON object entry.
|
* Receive notification of the beginning of a JSON object entry.
|
||||||
*
|
*
|
||||||
* @param key - Key of a JSON object entry.
|
* @param key - Key of a JSON object entry.
|
||||||
*
|
|
||||||
* @return false if the handler wants to stop parsing after return.
|
* @return false if the handler wants to stop parsing after return.
|
||||||
* @throws ParseException
|
* @throws ParseException
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
@ -108,18 +105,9 @@ public interface ContentHandler {
|
|||||||
boolean endArray() throws ParseException, IOException;
|
boolean endArray() throws ParseException, IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receive notification of the JSON primitive values:
|
* Receive notification of the JSON primitive values: java.lang.String, java.lang.Number, java.lang.Boolean null
|
||||||
* java.lang.String,
|
|
||||||
* java.lang.Number,
|
|
||||||
* java.lang.Boolean
|
|
||||||
* null
|
|
||||||
*
|
|
||||||
* @param value - Instance of the following:
|
|
||||||
* java.lang.String,
|
|
||||||
* java.lang.Number,
|
|
||||||
* java.lang.Boolean
|
|
||||||
* null
|
|
||||||
*
|
*
|
||||||
|
* @param value - Instance of the following: java.lang.String, java.lang.Number, java.lang.Boolean null
|
||||||
* @return false if the handler wants to stop parsing after return.
|
* @return false if the handler wants to stop parsing after return.
|
||||||
* @throws ParseException
|
* @throws ParseException
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
|
@ -29,41 +29,39 @@ import java.util.Map;
|
|||||||
import com.alibaba.nacos.client.logger.json.JSONArray;
|
import com.alibaba.nacos.client.logger.json.JSONArray;
|
||||||
import com.alibaba.nacos.client.logger.json.JSONObject;
|
import com.alibaba.nacos.client.logger.json.JSONObject;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parser for JSON text. Please note that JSONParser is NOT thread-safe.
|
* Parser for JSON text. Please note that JSONParser is NOT thread-safe.
|
||||||
*
|
*
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||||
public class JSONParser {
|
public class JSONParser {
|
||||||
public static final int S_INIT=0;
|
public static final int S_INIT = 0;
|
||||||
public static final int S_IN_FINISHED_VALUE=1;
|
public static final int S_IN_FINISHED_VALUE = 1;
|
||||||
public static final int S_IN_OBJECT=2;
|
public static final int S_IN_OBJECT = 2;
|
||||||
public static final int S_IN_ARRAY=3;
|
public static final int S_IN_ARRAY = 3;
|
||||||
public static final int S_PASSED_PAIR_KEY=4;
|
public static final int S_PASSED_PAIR_KEY = 4;
|
||||||
public static final int S_IN_PAIR_VALUE=5;
|
public static final int S_IN_PAIR_VALUE = 5;
|
||||||
public static final int S_END=6;
|
public static final int S_END = 6;
|
||||||
public static final int S_IN_ERROR=-1;
|
public static final int S_IN_ERROR = -1;
|
||||||
|
|
||||||
private LinkedList handlerStatusStack;
|
private LinkedList handlerStatusStack;
|
||||||
private Yylex lexer = new Yylex((Reader)null);
|
private Yylex lexer = new Yylex((Reader)null);
|
||||||
private Yytoken token = null;
|
private Yytoken token = null;
|
||||||
private int status = S_INIT;
|
private int status = S_INIT;
|
||||||
|
|
||||||
private int peekStatus(LinkedList statusStack){
|
private int peekStatus(LinkedList statusStack) {
|
||||||
if(statusStack.size()==0) {
|
if (statusStack.size() == 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
Integer status=(Integer)statusStack.getFirst();
|
Integer status = (Integer)statusStack.getFirst();
|
||||||
return status.intValue();
|
return status.intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the parser to the initial state without resetting the underlying reader.
|
* Reset the parser to the initial state without resetting the underlying reader.
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public void reset(){
|
public void reset() {
|
||||||
token = null;
|
token = null;
|
||||||
status = S_INIT;
|
status = S_INIT;
|
||||||
handlerStatusStack = null;
|
handlerStatusStack = null;
|
||||||
@ -76,7 +74,7 @@ public class JSONParser {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws ParseException
|
* @throws ParseException
|
||||||
*/
|
*/
|
||||||
public void reset(Reader in){
|
public void reset(Reader in) {
|
||||||
lexer.yyreset(in);
|
lexer.yyreset(in);
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
@ -84,20 +82,19 @@ public class JSONParser {
|
|||||||
/**
|
/**
|
||||||
* @return The position of the beginning of the current token.
|
* @return The position of the beginning of the current token.
|
||||||
*/
|
*/
|
||||||
public int getPosition(){
|
public int getPosition() {
|
||||||
return lexer.getPosition();
|
return lexer.getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object parse(String s) throws ParseException{
|
public Object parse(String s) throws ParseException {
|
||||||
return parse(s, (ContainerFactory)null);
|
return parse(s, (ContainerFactory)null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object parse(String s, ContainerFactory containerFactory) throws ParseException{
|
public Object parse(String s, ContainerFactory containerFactory) throws ParseException {
|
||||||
StringReader in=new StringReader(s);
|
StringReader in = new StringReader(s);
|
||||||
try{
|
try {
|
||||||
return parse(in, containerFactory);
|
return parse(in, containerFactory);
|
||||||
}
|
} catch (IOException ie) {
|
||||||
catch(IOException ie){
|
|
||||||
/*
|
/*
|
||||||
* Actually it will never happen.
|
* Actually it will never happen.
|
||||||
*/
|
*/
|
||||||
@ -105,7 +102,7 @@ public class JSONParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object parse(Reader in) throws IOException, ParseException{
|
public Object parse(Reader in) throws IOException, ParseException {
|
||||||
return parse(in, (ContainerFactory)null);
|
return parse(in, (ContainerFactory)null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,158 +111,148 @@ public class JSONParser {
|
|||||||
*
|
*
|
||||||
* @param in
|
* @param in
|
||||||
* @param containerFactory - Use this factory to createyour own JSON object and JSON array containers.
|
* @param containerFactory - Use this factory to createyour own JSON object and JSON array containers.
|
||||||
* @return Instance of the following:
|
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
|
||||||
* java.lang.String,
|
|
||||||
* java.lang.Number,
|
|
||||||
* java.lang.Boolean,
|
|
||||||
* null
|
|
||||||
*
|
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws ParseException
|
* @throws ParseException
|
||||||
*/
|
*/
|
||||||
public Object parse(Reader in, ContainerFactory containerFactory) throws IOException, ParseException{
|
public Object parse(Reader in, ContainerFactory containerFactory) throws IOException, ParseException {
|
||||||
reset(in);
|
reset(in);
|
||||||
LinkedList statusStack = new LinkedList();
|
LinkedList statusStack = new LinkedList();
|
||||||
LinkedList valueStack = new LinkedList();
|
LinkedList valueStack = new LinkedList();
|
||||||
|
|
||||||
try{
|
try {
|
||||||
do{
|
do {
|
||||||
nextToken();
|
nextToken();
|
||||||
switch(status){
|
switch (status) {
|
||||||
case S_INIT:
|
case S_INIT:
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
status=S_IN_FINISHED_VALUE;
|
status = S_IN_FINISHED_VALUE;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(token.value);
|
valueStack.addFirst(token.value);
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_BRACE:
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
status=S_IN_OBJECT;
|
status = S_IN_OBJECT;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(createObjectContainer(containerFactory));
|
valueStack.addFirst(createObjectContainer(containerFactory));
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_SQUARE:
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
status=S_IN_ARRAY;
|
status = S_IN_ARRAY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(createArrayContainer(containerFactory));
|
valueStack.addFirst(createArrayContainer(containerFactory));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
}//inner switch
|
}//inner switch
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_IN_FINISHED_VALUE:
|
case S_IN_FINISHED_VALUE:
|
||||||
if(token.type==Yytoken.TYPE_EOF) {
|
if (token.type == Yytoken.TYPE_EOF) {
|
||||||
return valueStack.removeFirst();
|
return valueStack.removeFirst();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
||||||
}
|
}
|
||||||
case S_IN_OBJECT:
|
case S_IN_OBJECT:
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_COMMA:
|
case Yytoken.TYPE_COMMA:
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
if(token.value instanceof String){
|
if (token.value instanceof String) {
|
||||||
String key=(String)token.value;
|
String key = (String)token.value;
|
||||||
valueStack.addFirst(key);
|
valueStack.addFirst(key);
|
||||||
status=S_PASSED_PAIR_KEY;
|
status = S_PASSED_PAIR_KEY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
}
|
} else {
|
||||||
else{
|
status = S_IN_ERROR;
|
||||||
status=S_IN_ERROR;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_RIGHT_BRACE:
|
case Yytoken.TYPE_RIGHT_BRACE:
|
||||||
if(valueStack.size()>1){
|
if (valueStack.size() > 1) {
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
valueStack.removeFirst();
|
valueStack.removeFirst();
|
||||||
status=peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
}
|
} else {
|
||||||
else{
|
status = S_IN_FINISHED_VALUE;
|
||||||
status=S_IN_FINISHED_VALUE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
break;
|
break;
|
||||||
}//inner switch
|
}//inner switch
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_PASSED_PAIR_KEY:
|
case S_PASSED_PAIR_KEY:
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_COLON:
|
case Yytoken.TYPE_COLON:
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
String key=(String)valueStack.removeFirst();
|
String key = (String)valueStack.removeFirst();
|
||||||
Map parent=(Map)valueStack.getFirst();
|
Map parent = (Map)valueStack.getFirst();
|
||||||
parent.put(key,token.value);
|
parent.put(key, token.value);
|
||||||
status=peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_SQUARE:
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
key=(String)valueStack.removeFirst();
|
key = (String)valueStack.removeFirst();
|
||||||
parent=(Map)valueStack.getFirst();
|
parent = (Map)valueStack.getFirst();
|
||||||
List newArray=createArrayContainer(containerFactory);
|
List newArray = createArrayContainer(containerFactory);
|
||||||
parent.put(key,newArray);
|
parent.put(key, newArray);
|
||||||
status=S_IN_ARRAY;
|
status = S_IN_ARRAY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(newArray);
|
valueStack.addFirst(newArray);
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_BRACE:
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
key=(String)valueStack.removeFirst();
|
key = (String)valueStack.removeFirst();
|
||||||
parent=(Map)valueStack.getFirst();
|
parent = (Map)valueStack.getFirst();
|
||||||
Map newObject=createObjectContainer(containerFactory);
|
Map newObject = createObjectContainer(containerFactory);
|
||||||
parent.put(key,newObject);
|
parent.put(key, newObject);
|
||||||
status=S_IN_OBJECT;
|
status = S_IN_OBJECT;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(newObject);
|
valueStack.addFirst(newObject);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_IN_ARRAY:
|
case S_IN_ARRAY:
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_COMMA:
|
case Yytoken.TYPE_COMMA:
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
List val=(List)valueStack.getFirst();
|
List val = (List)valueStack.getFirst();
|
||||||
val.add(token.value);
|
val.add(token.value);
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_RIGHT_SQUARE:
|
case Yytoken.TYPE_RIGHT_SQUARE:
|
||||||
if(valueStack.size()>1){
|
if (valueStack.size() > 1) {
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
valueStack.removeFirst();
|
valueStack.removeFirst();
|
||||||
status=peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
}
|
} else {
|
||||||
else{
|
status = S_IN_FINISHED_VALUE;
|
||||||
status=S_IN_FINISHED_VALUE;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_BRACE:
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
val=(List)valueStack.getFirst();
|
val = (List)valueStack.getFirst();
|
||||||
Map newObject=createObjectContainer(containerFactory);
|
Map newObject = createObjectContainer(containerFactory);
|
||||||
val.add(newObject);
|
val.add(newObject);
|
||||||
status=S_IN_OBJECT;
|
status = S_IN_OBJECT;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(newObject);
|
valueStack.addFirst(newObject);
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_SQUARE:
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
val=(List)valueStack.getFirst();
|
val = (List)valueStack.getFirst();
|
||||||
List newArray=createArrayContainer(containerFactory);
|
List newArray = createArrayContainer(containerFactory);
|
||||||
val.add(newArray);
|
val.add(newArray);
|
||||||
status=S_IN_ARRAY;
|
status = S_IN_ARRAY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
valueStack.addFirst(newArray);
|
valueStack.addFirst(newArray);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
}//inner switch
|
}//inner switch
|
||||||
break;
|
break;
|
||||||
case S_IN_ERROR:
|
case S_IN_ERROR:
|
||||||
@ -273,59 +260,57 @@ public class JSONParser {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}//switch
|
}//switch
|
||||||
if(status==S_IN_ERROR){
|
if (status == S_IN_ERROR) {
|
||||||
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
||||||
}
|
}
|
||||||
}while(token.type!=Yytoken.TYPE_EOF);
|
} while (token.type != Yytoken.TYPE_EOF);
|
||||||
}
|
} catch (IOException ie) {
|
||||||
catch(IOException ie){
|
|
||||||
throw ie;
|
throw ie;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void nextToken() throws ParseException, IOException{
|
private void nextToken() throws ParseException, IOException {
|
||||||
token = lexer.yylex();
|
token = lexer.yylex();
|
||||||
if(token == null) {
|
if (token == null) {
|
||||||
token = new Yytoken(Yytoken.TYPE_EOF, null);
|
token = new Yytoken(Yytoken.TYPE_EOF, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map createObjectContainer(ContainerFactory containerFactory){
|
private Map createObjectContainer(ContainerFactory containerFactory) {
|
||||||
if(containerFactory == null) {
|
if (containerFactory == null) {
|
||||||
return new JSONObject();
|
return new JSONObject();
|
||||||
}
|
}
|
||||||
Map m = containerFactory.createObjectContainer();
|
Map m = containerFactory.createObjectContainer();
|
||||||
|
|
||||||
if(m == null) {
|
if (m == null) {
|
||||||
return new JSONObject();
|
return new JSONObject();
|
||||||
}
|
}
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List createArrayContainer(ContainerFactory containerFactory){
|
private List createArrayContainer(ContainerFactory containerFactory) {
|
||||||
if(containerFactory == null) {
|
if (containerFactory == null) {
|
||||||
return new JSONArray();
|
return new JSONArray();
|
||||||
}
|
}
|
||||||
List l = containerFactory.creatArrayContainer();
|
List l = containerFactory.creatArrayContainer();
|
||||||
|
|
||||||
if(l == null) {
|
if (l == null) {
|
||||||
return new JSONArray();
|
return new JSONArray();
|
||||||
}
|
}
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parse(String s, ContentHandler contentHandler) throws ParseException{
|
public void parse(String s, ContentHandler contentHandler) throws ParseException {
|
||||||
parse(s, contentHandler, false);
|
parse(s, contentHandler, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parse(String s, ContentHandler contentHandler, boolean isResume) throws ParseException{
|
public void parse(String s, ContentHandler contentHandler, boolean isResume) throws ParseException {
|
||||||
StringReader in=new StringReader(s);
|
StringReader in = new StringReader(s);
|
||||||
try{
|
try {
|
||||||
parse(in, contentHandler, isResume);
|
parse(in, contentHandler, isResume);
|
||||||
}
|
} catch (IOException ie) {
|
||||||
catch(IOException ie){
|
|
||||||
/*
|
/*
|
||||||
* Actually it will never happen.
|
* Actually it will never happen.
|
||||||
*/
|
*/
|
||||||
@ -333,31 +318,28 @@ public class JSONParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parse(Reader in, ContentHandler contentHandler) throws IOException, ParseException{
|
public void parse(Reader in, ContentHandler contentHandler) throws IOException, ParseException {
|
||||||
parse(in, contentHandler, false);
|
parse(in, contentHandler, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stream processing of JSON text.
|
* Stream processing of JSON text.
|
||||||
*
|
*
|
||||||
* @see ContentHandler
|
|
||||||
*
|
|
||||||
* @param in
|
* @param in
|
||||||
* @param contentHandler
|
* @param contentHandler
|
||||||
* @param isResume - Indicates if it continues previous parsing operation.
|
* @param isResume - Indicates if it continues previous parsing operation. If set to true, resume parsing the
|
||||||
* If set to true, resume parsing the old stream, and parameter 'in' will be ignored.
|
* old stream, and parameter 'in' will be ignored. If this method is called for the first time
|
||||||
* If this method is called for the first time in this instance, isResume will be ignored.
|
* in this instance, isResume will be ignored.
|
||||||
*
|
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* @throws ParseException
|
* @throws ParseException
|
||||||
|
* @see ContentHandler
|
||||||
*/
|
*/
|
||||||
public void parse(Reader in, ContentHandler contentHandler, boolean isResume) throws IOException, ParseException{
|
public void parse(Reader in, ContentHandler contentHandler, boolean isResume) throws IOException, ParseException {
|
||||||
if(!isResume){
|
if (!isResume) {
|
||||||
reset(in);
|
reset(in);
|
||||||
handlerStatusStack = new LinkedList();
|
handlerStatusStack = new LinkedList();
|
||||||
}
|
} else {
|
||||||
else{
|
if (handlerStatusStack == null) {
|
||||||
if(handlerStatusStack == null){
|
|
||||||
isResume = false;
|
isResume = false;
|
||||||
reset(in);
|
reset(in);
|
||||||
handlerStatusStack = new LinkedList();
|
handlerStatusStack = new LinkedList();
|
||||||
@ -366,122 +348,119 @@ public class JSONParser {
|
|||||||
|
|
||||||
LinkedList statusStack = handlerStatusStack;
|
LinkedList statusStack = handlerStatusStack;
|
||||||
|
|
||||||
try{
|
try {
|
||||||
do{
|
do {
|
||||||
switch(status){
|
switch (status) {
|
||||||
case S_INIT:
|
case S_INIT:
|
||||||
contentHandler.startJSON();
|
contentHandler.startJSON();
|
||||||
nextToken();
|
nextToken();
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
status=S_IN_FINISHED_VALUE;
|
status = S_IN_FINISHED_VALUE;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.primitive(token.value)) {
|
if (!contentHandler.primitive(token.value)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_BRACE:
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
status=S_IN_OBJECT;
|
status = S_IN_OBJECT;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startObject()) {
|
if (!contentHandler.startObject()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_SQUARE:
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
status=S_IN_ARRAY;
|
status = S_IN_ARRAY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startArray()) {
|
if (!contentHandler.startArray()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
}//inner switch
|
}//inner switch
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_IN_FINISHED_VALUE:
|
case S_IN_FINISHED_VALUE:
|
||||||
nextToken();
|
nextToken();
|
||||||
if(token.type==Yytoken.TYPE_EOF){
|
if (token.type == Yytoken.TYPE_EOF) {
|
||||||
contentHandler.endJSON();
|
contentHandler.endJSON();
|
||||||
status = S_END;
|
status = S_END;
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else{
|
|
||||||
status = S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
case S_IN_OBJECT:
|
case S_IN_OBJECT:
|
||||||
nextToken();
|
nextToken();
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_COMMA:
|
case Yytoken.TYPE_COMMA:
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
if(token.value instanceof String){
|
if (token.value instanceof String) {
|
||||||
String key=(String)token.value;
|
String key = (String)token.value;
|
||||||
status=S_PASSED_PAIR_KEY;
|
status = S_PASSED_PAIR_KEY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startObjectEntry(key)) {
|
if (!contentHandler.startObjectEntry(key)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else{
|
status = S_IN_ERROR;
|
||||||
status=S_IN_ERROR;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_RIGHT_BRACE:
|
case Yytoken.TYPE_RIGHT_BRACE:
|
||||||
if(statusStack.size()>1){
|
if (statusStack.size() > 1) {
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
status=peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
|
} else {
|
||||||
|
status = S_IN_FINISHED_VALUE;
|
||||||
}
|
}
|
||||||
else{
|
if (!contentHandler.endObject()) {
|
||||||
status=S_IN_FINISHED_VALUE;
|
|
||||||
}
|
|
||||||
if(!contentHandler.endObject()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
break;
|
break;
|
||||||
}//inner switch
|
}//inner switch
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_PASSED_PAIR_KEY:
|
case S_PASSED_PAIR_KEY:
|
||||||
nextToken();
|
nextToken();
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_COLON:
|
case Yytoken.TYPE_COLON:
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
status=peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
if(!contentHandler.primitive(token.value)) {
|
if (!contentHandler.primitive(token.value)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(!contentHandler.endObjectEntry()) {
|
if (!contentHandler.endObjectEntry()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_SQUARE:
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
statusStack.addFirst(Integer.valueOf(S_IN_PAIR_VALUE));
|
statusStack.addFirst(Integer.valueOf(S_IN_PAIR_VALUE));
|
||||||
status=S_IN_ARRAY;
|
status = S_IN_ARRAY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startArray()) {
|
if (!contentHandler.startArray()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_BRACE:
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
statusStack.addFirst(Integer.valueOf(S_IN_PAIR_VALUE));
|
statusStack.addFirst(Integer.valueOf(S_IN_PAIR_VALUE));
|
||||||
status=S_IN_OBJECT;
|
status = S_IN_OBJECT;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startObject()) {
|
if (!contentHandler.startObject()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -492,49 +471,48 @@ public class JSONParser {
|
|||||||
*/
|
*/
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
status = peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
if(!contentHandler.endObjectEntry()) {
|
if (!contentHandler.endObjectEntry()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_IN_ARRAY:
|
case S_IN_ARRAY:
|
||||||
nextToken();
|
nextToken();
|
||||||
switch(token.type){
|
switch (token.type) {
|
||||||
case Yytoken.TYPE_COMMA:
|
case Yytoken.TYPE_COMMA:
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_VALUE:
|
case Yytoken.TYPE_VALUE:
|
||||||
if(!contentHandler.primitive(token.value)) {
|
if (!contentHandler.primitive(token.value)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_RIGHT_SQUARE:
|
case Yytoken.TYPE_RIGHT_SQUARE:
|
||||||
if(statusStack.size()>1){
|
if (statusStack.size() > 1) {
|
||||||
statusStack.removeFirst();
|
statusStack.removeFirst();
|
||||||
status=peekStatus(statusStack);
|
status = peekStatus(statusStack);
|
||||||
|
} else {
|
||||||
|
status = S_IN_FINISHED_VALUE;
|
||||||
}
|
}
|
||||||
else{
|
if (!contentHandler.endArray()) {
|
||||||
status=S_IN_FINISHED_VALUE;
|
|
||||||
}
|
|
||||||
if(!contentHandler.endArray()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_BRACE:
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
status=S_IN_OBJECT;
|
status = S_IN_OBJECT;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startObject()) {
|
if (!contentHandler.startObject()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Yytoken.TYPE_LEFT_SQUARE:
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
status=S_IN_ARRAY;
|
status = S_IN_ARRAY;
|
||||||
statusStack.addFirst(Integer.valueOf(status));
|
statusStack.addFirst(Integer.valueOf(status));
|
||||||
if(!contentHandler.startArray()) {
|
if (!contentHandler.startArray()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
status=S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
}//inner switch
|
}//inner switch
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -546,24 +524,20 @@ public class JSONParser {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}//switch
|
}//switch
|
||||||
if(status==S_IN_ERROR){
|
if (status == S_IN_ERROR) {
|
||||||
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
throw new ParseException(getPosition(), ParseException.ERROR_UNEXPECTED_TOKEN, token);
|
||||||
}
|
}
|
||||||
}while(token.type!=Yytoken.TYPE_EOF);
|
} while (token.type != Yytoken.TYPE_EOF);
|
||||||
}
|
} catch (IOException ie) {
|
||||||
catch(IOException ie){
|
|
||||||
status = S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
throw ie;
|
throw ie;
|
||||||
}
|
} catch (ParseException pe) {
|
||||||
catch(ParseException pe){
|
|
||||||
status = S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
throw pe;
|
throw pe;
|
||||||
}
|
} catch (RuntimeException re) {
|
||||||
catch(RuntimeException re){
|
|
||||||
status = S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
throw re;
|
throw re;
|
||||||
}
|
} catch (Error e) {
|
||||||
catch(Error e){
|
|
||||||
status = S_IN_ERROR;
|
status = S_IN_ERROR;
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
|
@ -18,8 +18,7 @@ package com.alibaba.nacos.client.logger.json.parser;
|
|||||||
/**
|
/**
|
||||||
* ParseException explains why and where the error occurs in source JSON text.
|
* ParseException explains why and where the error occurs in source JSON text.
|
||||||
*
|
*
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
public class ParseException extends Exception {
|
public class ParseException extends Exception {
|
||||||
private static final long serialVersionUID = -7880698968187728547L;
|
private static final long serialVersionUID = -7880698968187728547L;
|
||||||
@ -32,15 +31,15 @@ public class ParseException extends Exception {
|
|||||||
private Object unexpectedObject;
|
private Object unexpectedObject;
|
||||||
private int position;
|
private int position;
|
||||||
|
|
||||||
public ParseException(int errorType){
|
public ParseException(int errorType) {
|
||||||
this(-1, errorType, null);
|
this(-1, errorType, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ParseException(int errorType, Object unexpectedObject){
|
public ParseException(int errorType, Object unexpectedObject) {
|
||||||
this(-1, errorType, unexpectedObject);
|
this(-1, errorType, unexpectedObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ParseException(int position, int errorType, Object unexpectedObject){
|
public ParseException(int position, int errorType, Object unexpectedObject) {
|
||||||
this.position = position;
|
this.position = position;
|
||||||
this.errorType = errorType;
|
this.errorType = errorType;
|
||||||
this.unexpectedObject = unexpectedObject;
|
this.unexpectedObject = unexpectedObject;
|
||||||
@ -55,9 +54,8 @@ public class ParseException extends Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#getPosition()
|
|
||||||
*
|
|
||||||
* @return The character position (starting with 0) of the input where the error occurs.
|
* @return The character position (starting with 0) of the input where the error occurs.
|
||||||
|
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#getPosition()
|
||||||
*/
|
*/
|
||||||
public int getPosition() {
|
public int getPosition() {
|
||||||
return position;
|
return position;
|
||||||
@ -68,12 +66,10 @@ public class ParseException extends Exception {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @return One of the following base on the value of errorType: ERROR_UNEXPECTED_CHAR java.lang.Character
|
||||||
|
* ERROR_UNEXPECTED_TOKEN com.alibaba.nacos.client.logger.jsonparser.Yytoken ERROR_UNEXPECTED_EXCEPTION
|
||||||
|
* java.lang.Exception
|
||||||
* @see com.alibaba.nacos.client.logger.json.parser.Yytoken
|
* @see com.alibaba.nacos.client.logger.json.parser.Yytoken
|
||||||
*
|
|
||||||
* @return One of the following base on the value of errorType:
|
|
||||||
* ERROR_UNEXPECTED_CHAR java.lang.Character
|
|
||||||
* ERROR_UNEXPECTED_TOKEN com.alibaba.nacos.client.logger.jsonparser.Yytoken
|
|
||||||
* ERROR_UNEXPECTED_EXCEPTION java.lang.Exception
|
|
||||||
*/
|
*/
|
||||||
public Object getUnexpectedObject() {
|
public Object getUnexpectedObject() {
|
||||||
return unexpectedObject;
|
return unexpectedObject;
|
||||||
@ -86,12 +82,14 @@ public class ParseException extends Exception {
|
|||||||
public String getMessage() {
|
public String getMessage() {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
|
|
||||||
switch(errorType){
|
switch (errorType) {
|
||||||
case ERROR_UNEXPECTED_CHAR:
|
case ERROR_UNEXPECTED_CHAR:
|
||||||
sb.append("Unexpected character (").append(unexpectedObject).append(") at position ").append(position).append(".");
|
sb.append("Unexpected character (").append(unexpectedObject).append(") at position ").append(position)
|
||||||
|
.append(".");
|
||||||
break;
|
break;
|
||||||
case ERROR_UNEXPECTED_TOKEN:
|
case ERROR_UNEXPECTED_TOKEN:
|
||||||
sb.append("Unexpected token ").append(unexpectedObject).append(" at position ").append(position).append(".");
|
sb.append("Unexpected token ").append(unexpectedObject).append(" at position ").append(position).append(
|
||||||
|
".");
|
||||||
break;
|
break;
|
||||||
case ERROR_UNEXPECTED_EXCEPTION:
|
case ERROR_UNEXPECTED_EXCEPTION:
|
||||||
sb.append("Unexpected exception at position ").append(position).append(": ").append(unexpectedObject);
|
sb.append("Unexpected exception at position ").append(position).append(": ").append(unexpectedObject);
|
||||||
|
@ -23,28 +23,32 @@ import java.io.UnsupportedEncodingException;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Yylex
|
* Yylex
|
||||||
* @author Nacos
|
|
||||||
*
|
*
|
||||||
|
* @author Nacos
|
||||||
*/
|
*/
|
||||||
class Yylex {
|
class Yylex {
|
||||||
|
|
||||||
/** This character denotes the end of file */
|
/**
|
||||||
|
* This character denotes the end of file
|
||||||
|
*/
|
||||||
public static final int YYEOF = -1;
|
public static final int YYEOF = -1;
|
||||||
|
|
||||||
/** initial size of the lookahead buffer */
|
/**
|
||||||
|
* initial size of the lookahead buffer
|
||||||
|
*/
|
||||||
private static final int ZZ_BUFFERSIZE = 16384;
|
private static final int ZZ_BUFFERSIZE = 16384;
|
||||||
|
|
||||||
/** lexical states */
|
/**
|
||||||
|
* lexical states
|
||||||
|
*/
|
||||||
public static final int YYINITIAL = 0;
|
public static final int YYINITIAL = 0;
|
||||||
public static final int STRING_BEGIN = 2;
|
public static final int STRING_BEGIN = 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l ZZ_LEXSTATE[l+1] is the state in the DFA for the
|
||||||
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
|
* lexical state l at the beginning of a line l is of the form l = 2*k, k a non negative integer
|
||||||
* at the beginning of a line
|
|
||||||
* l is of the form l = 2*k, k a non negative integer
|
|
||||||
*/
|
*/
|
||||||
private static final int ZZ_LEXSTATE[] = { 0, 0, 1, 1 };
|
private static final int ZZ_LEXSTATE[] = {0, 0, 1, 1};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translates characters to character classes
|
* Translates characters to character classes
|
||||||
@ -82,7 +86,7 @@ class Yylex {
|
|||||||
while (i < l) {
|
while (i < l) {
|
||||||
int count = packed.charAt(i++);
|
int count = packed.charAt(i++);
|
||||||
int value = packed.charAt(i++);
|
int value = packed.charAt(i++);
|
||||||
do result[j++] = value; while (--count > 0);
|
do { result[j++] = value; } while (--count > 0);
|
||||||
}
|
}
|
||||||
return j;
|
return j;
|
||||||
}
|
}
|
||||||
@ -118,7 +122,7 @@ class Yylex {
|
|||||||
/**
|
/**
|
||||||
* The transition table of the DFA
|
* The transition table of the DFA
|
||||||
*/
|
*/
|
||||||
private static final int ZZ_TRANS[] = { 2, 2, 3, 4, 2, 2, 2, 5, 2, 6, 2, 2, 7, 8, 2, 9, 2, 2, 2, 2, 2, 10, 11, 12,
|
private static final int ZZ_TRANS[] = {2, 2, 3, 4, 2, 2, 2, 5, 2, 6, 2, 2, 7, 8, 2, 9, 2, 2, 2, 2, 2, 10, 11, 12,
|
||||||
13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 16, 16, 16, 16, 16, 16,
|
13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 16, 16, 16, 16, 16, 16,
|
||||||
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -1, -1, -1, -1, -1, -1, -1, -1,
|
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
@ -153,7 +157,7 @@ class Yylex {
|
|||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, 43, -1, 43, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, 43, -1, 43, -1, -1, -1, -1, -1,
|
||||||
43, 43, -1, -1, -1, -1, 43, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1,
|
43, 43, -1, -1, -1, -1, 43, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1,
|
||||||
44, -1, 44, -1, -1, -1, -1, -1, 44, 44, -1, -1, -1, -1, 44, 44, -1, -1, -1,
|
44, -1, 44, -1, -1, -1, -1, -1, 44, 44, -1, -1, -1, -1, 44, 44, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, };
|
-1, -1, -1, -1, -1,};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* error codes
|
* error codes
|
||||||
@ -165,8 +169,8 @@ class Yylex {
|
|||||||
/**
|
/**
|
||||||
* error messages for the codes above
|
* error messages for the codes above
|
||||||
*/
|
*/
|
||||||
private static final String[] ZZ_ERROR_MSG = { "Unkown internal scanner error", "Error: could not match input",
|
private static final String[] ZZ_ERROR_MSG = {"Unkown internal scanner error", "Error: could not match input",
|
||||||
"Error: pushback value was too large" };
|
"Error: pushback value was too large"};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||||
@ -190,45 +194,59 @@ class Yylex {
|
|||||||
while (i < l) {
|
while (i < l) {
|
||||||
int count = packed.charAt(i++);
|
int count = packed.charAt(i++);
|
||||||
int value = packed.charAt(i++);
|
int value = packed.charAt(i++);
|
||||||
do result[j++] = value; while (--count > 0);
|
do { result[j++] = value; } while (--count > 0);
|
||||||
}
|
}
|
||||||
return j;
|
return j;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** the input device */
|
/**
|
||||||
|
* the input device
|
||||||
|
*/
|
||||||
private java.io.Reader zzReader;
|
private java.io.Reader zzReader;
|
||||||
|
|
||||||
/** the current state of the DFA */
|
/**
|
||||||
|
* the current state of the DFA
|
||||||
|
*/
|
||||||
private int zzState;
|
private int zzState;
|
||||||
|
|
||||||
/** the current lexical state */
|
/**
|
||||||
|
* the current lexical state
|
||||||
|
*/
|
||||||
private int zzLexicalState = YYINITIAL;
|
private int zzLexicalState = YYINITIAL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* this buffer contains the current text to be matched and is
|
* this buffer contains the current text to be matched and is the source of the yytext() string
|
||||||
* the source of the yytext() string
|
|
||||||
*/
|
*/
|
||||||
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
|
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
|
||||||
|
|
||||||
/** the textposition at the last accepting state */
|
/**
|
||||||
|
* the textposition at the last accepting state
|
||||||
|
*/
|
||||||
private int zzMarkedPos;
|
private int zzMarkedPos;
|
||||||
|
|
||||||
/** the current text position in the buffer */
|
/**
|
||||||
|
* the current text position in the buffer
|
||||||
|
*/
|
||||||
private int zzCurrentPos;
|
private int zzCurrentPos;
|
||||||
|
|
||||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
/**
|
||||||
|
* startRead marks the beginning of the yytext() string in the buffer
|
||||||
|
*/
|
||||||
private int zzStartRead;
|
private int zzStartRead;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* endRead marks the last character in the buffer, that has been read
|
* endRead marks the last character in the buffer, that has been read from input
|
||||||
* from input
|
|
||||||
*/
|
*/
|
||||||
private int zzEndRead;
|
private int zzEndRead;
|
||||||
|
|
||||||
/** the number of characters up to the start of the matched text */
|
/**
|
||||||
|
* the number of characters up to the start of the matched text
|
||||||
|
*/
|
||||||
private int yychar;
|
private int yychar;
|
||||||
|
|
||||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
/**
|
||||||
|
* zzAtEOF == true <=> the scanner is at the EOF
|
||||||
|
*/
|
||||||
private boolean zzAtEOF;
|
private boolean zzAtEOF;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -241,8 +259,7 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new scanner
|
* Creates a new scanner There is also a java.io.InputStream version of this constructor.
|
||||||
* There is also a java.io.InputStream version of this constructor.
|
|
||||||
*
|
*
|
||||||
* @param in the java.io.Reader to read input from.
|
* @param in the java.io.Reader to read input from.
|
||||||
*/
|
*/
|
||||||
@ -251,8 +268,7 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new scanner.
|
* Creates a new scanner. There is also java.io.Reader version of this constructor.
|
||||||
* There is also java.io.Reader version of this constructor.
|
|
||||||
*
|
*
|
||||||
* @param in the java.io.Inputstream to read input from.
|
* @param in the java.io.Inputstream to read input from.
|
||||||
* @throws UnsupportedEncodingException
|
* @throws UnsupportedEncodingException
|
||||||
@ -274,7 +290,7 @@ class Yylex {
|
|||||||
while (i < NIGTY) {
|
while (i < NIGTY) {
|
||||||
int count = packed.charAt(i++);
|
int count = packed.charAt(i++);
|
||||||
char value = packed.charAt(i++);
|
char value = packed.charAt(i++);
|
||||||
do map[j++] = value; while (--count > 0);
|
do { map[j++] = value; } while (--count > 0);
|
||||||
}
|
}
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
@ -319,7 +335,7 @@ class Yylex {
|
|||||||
if (c == -1) {
|
if (c == -1) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
zzBuffer[zzEndRead++] = (char) c;
|
zzBuffer[zzEndRead++] = (char)c;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -341,11 +357,9 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resets the scanner to read from a new input stream.
|
* Resets the scanner to read from a new input stream. Does not close the old reader. All internal variables are
|
||||||
* Does not close the old reader.
|
* reset, the old input stream <b>cannot</b> be reused (internal buffer is discarded and lost). Lexical state is set
|
||||||
* All internal variables are reset, the old input stream
|
* to <tt>ZZ_INITIAL</tt>.
|
||||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
|
||||||
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
|
|
||||||
*
|
*
|
||||||
* @param reader the new input stream
|
* @param reader the new input stream
|
||||||
*/
|
*/
|
||||||
@ -381,12 +395,10 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the character at position <tt>pos</tt> from the
|
* Returns the character at position <tt>pos</tt> from the matched text. It is equivalent to yytext().charAt(pos),
|
||||||
* matched text.
|
* but faster
|
||||||
* It is equivalent to yytext().charAt(pos), but faster
|
|
||||||
*
|
*
|
||||||
* @param pos the position of the character to fetch.
|
* @param pos the position of the character to fetch. A value from 0 to yylength()-1.
|
||||||
* A value from 0 to yylength()-1.
|
|
||||||
* @return the character at position pos
|
* @return the character at position pos
|
||||||
*/
|
*/
|
||||||
public final char yycharat(int pos) {
|
public final char yycharat(int pos) {
|
||||||
@ -401,14 +413,10 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reports an error that occured while scanning.
|
* Reports an error that occured while scanning. In a wellformed scanner (no or only correct usage of
|
||||||
* In a wellformed scanner (no or only correct usage of
|
* yypushback(int) and a match-all fallback rule) this method will only be called with things that "Can't Possibly
|
||||||
* yypushback(int) and a match-all fallback rule) this method
|
* Happen". If this method is called, something is seriously wrong (e.g. a JFlex bug producing a faulty scanner
|
||||||
* will only be called with things that "Can't Possibly Happen".
|
* etc.). Usual syntax/scanner level error handling should be done in error fallback rules.
|
||||||
* If this method is called, something is seriously wrong
|
|
||||||
* (e.g. a JFlex bug producing a faulty scanner etc.).
|
|
||||||
* Usual syntax/scanner level error handling should be done
|
|
||||||
* in error fallback rules.
|
|
||||||
*
|
*
|
||||||
* @param errorCode the code of the errormessage to display
|
* @param errorCode the code of the errormessage to display
|
||||||
*/
|
*/
|
||||||
@ -424,11 +432,10 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pushes the specified amount of characters back into the input stream.
|
* Pushes the specified amount of characters back into the input stream. They will be read again by then next call
|
||||||
* They will be read again by then next call of the scanning method
|
* of the scanning method
|
||||||
*
|
*
|
||||||
* @param number the number of characters to be read again.
|
* @param number the number of characters to be read again. This number must not be greater than yylength()!
|
||||||
* This number must not be greater than yylength()!
|
|
||||||
*/
|
*/
|
||||||
public void yypushback(int number) {
|
public void yypushback(int number) {
|
||||||
if (number > yylength()) {
|
if (number > yylength()) {
|
||||||
@ -439,8 +446,8 @@ class Yylex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resumes scanning until the next regular expression is matched,
|
* Resumes scanning until the next regular expression is matched, the end of input is encountered or an I/O-Error
|
||||||
* the end of input is encountered or an I/O-Error occurs.
|
* occurs.
|
||||||
*
|
*
|
||||||
* @return the next token
|
* @return the next token
|
||||||
* @throws java.io.IOException if any I/O-Error occurs
|
* @throws java.io.IOException if any I/O-Error occurs
|
||||||
@ -478,8 +485,7 @@ class Yylex {
|
|||||||
|
|
||||||
if (zzCurrentPosL < zzEndReadL) {
|
if (zzCurrentPosL < zzEndReadL) {
|
||||||
zzInput = zzBufferL[zzCurrentPosL++];
|
zzInput = zzBufferL[zzCurrentPosL++];
|
||||||
}
|
} else if (zzAtEOF) {
|
||||||
else if (zzAtEOF) {
|
|
||||||
zzInput = YYEOF;
|
zzInput = YYEOF;
|
||||||
break zzForAction;
|
break zzForAction;
|
||||||
} else {
|
} else {
|
||||||
@ -572,7 +578,8 @@ class Yylex {
|
|||||||
case 33:
|
case 33:
|
||||||
break;
|
break;
|
||||||
case 1: {
|
case 1: {
|
||||||
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_CHAR, Character.valueOf(yycharat(0)));
|
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_CHAR,
|
||||||
|
Character.valueOf(yycharat(0)));
|
||||||
}
|
}
|
||||||
case 34:
|
case 34:
|
||||||
break;
|
break;
|
||||||
@ -614,7 +621,7 @@ class Yylex {
|
|||||||
case 24: {
|
case 24: {
|
||||||
try {
|
try {
|
||||||
int ch = Integer.parseInt(yytext().substring(2), 16);
|
int ch = Integer.parseInt(yytext().substring(2), 16);
|
||||||
sb.append((char) ch);
|
sb.append((char)ch);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_EXCEPTION, e);
|
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_EXCEPTION, e);
|
||||||
}
|
}
|
||||||
|
@ -20,35 +20,35 @@
|
|||||||
package com.alibaba.nacos.client.logger.json.parser;
|
package com.alibaba.nacos.client.logger.json.parser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||||
*/
|
*/
|
||||||
public class Yytoken {
|
public class Yytoken {
|
||||||
/**
|
/**
|
||||||
* JSON primitive value: string,number,boolean,null
|
* JSON primitive value: string,number,boolean,null
|
||||||
*/
|
*/
|
||||||
public static final int TYPE_VALUE=0;
|
public static final int TYPE_VALUE = 0;
|
||||||
public static final int TYPE_LEFT_BRACE=1;
|
public static final int TYPE_LEFT_BRACE = 1;
|
||||||
public static final int TYPE_RIGHT_BRACE=2;
|
public static final int TYPE_RIGHT_BRACE = 2;
|
||||||
public static final int TYPE_LEFT_SQUARE=3;
|
public static final int TYPE_LEFT_SQUARE = 3;
|
||||||
public static final int TYPE_RIGHT_SQUARE=4;
|
public static final int TYPE_RIGHT_SQUARE = 4;
|
||||||
public static final int TYPE_COMMA=5;
|
public static final int TYPE_COMMA = 5;
|
||||||
public static final int TYPE_COLON=6;
|
public static final int TYPE_COLON = 6;
|
||||||
/**
|
/**
|
||||||
* end of file
|
* end of file
|
||||||
*/
|
*/
|
||||||
public static final int TYPE_EOF=-1;
|
public static final int TYPE_EOF = -1;
|
||||||
|
|
||||||
public int type=0;
|
public int type = 0;
|
||||||
public Object value=null;
|
public Object value = null;
|
||||||
|
|
||||||
public Yytoken(int type,Object value){
|
public Yytoken(int type, Object value) {
|
||||||
this.type=type;
|
this.type = type;
|
||||||
this.value=value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String toString(){
|
public String toString() {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
switch(type){
|
switch (type) {
|
||||||
case TYPE_VALUE:
|
case TYPE_VALUE:
|
||||||
sb.append("VALUE(").append(value).append(")");
|
sb.append("VALUE(").append(value).append(")");
|
||||||
break;
|
break;
|
||||||
|
@ -1,146 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.alibaba.nacos.client.logger.log4j;
|
|
||||||
|
|
||||||
import org.apache.log4j.Level;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.client.logger.Logger;
|
|
||||||
import com.alibaba.nacos.client.logger.option.Log4jActivateOption;
|
|
||||||
import com.alibaba.nacos.client.logger.support.LoggerHelper;
|
|
||||||
import com.alibaba.nacos.client.logger.support.LoggerSupport;
|
|
||||||
import com.alibaba.nacos.client.logger.util.MessageUtil;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log4jLogger
|
|
||||||
* @author Nacos
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class Log4jLogger extends LoggerSupport implements Logger {
|
|
||||||
|
|
||||||
private org.apache.log4j.Logger delegate;
|
|
||||||
|
|
||||||
public Log4jLogger(org.apache.log4j.Logger delegate) {
|
|
||||||
super(delegate);
|
|
||||||
|
|
||||||
if (delegate == null) {
|
|
||||||
throw new IllegalArgumentException("delegate Logger is null");
|
|
||||||
}
|
|
||||||
this.delegate = delegate;
|
|
||||||
|
|
||||||
this.activateOption = new Log4jActivateOption(delegate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void debug(String context, String message) {
|
|
||||||
if (isDebugEnabled()) {
|
|
||||||
message = LoggerHelper.getResourceBundleString(getProductName(), message);
|
|
||||||
delegate.debug(MessageUtil.getMessage(context, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void debug(String context, String format, Object... args) {
|
|
||||||
if (isDebugEnabled()) {
|
|
||||||
format = LoggerHelper.getResourceBundleString(getProductName(), format);
|
|
||||||
delegate.debug(MessageUtil.getMessage(context, MessageUtil.formatMessage(format, args)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void info(String context, String message) {
|
|
||||||
if (isInfoEnabled()) {
|
|
||||||
message = LoggerHelper.getResourceBundleString(getProductName(), message);
|
|
||||||
delegate.info(MessageUtil.getMessage(context, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void info(String context, String format, Object... args) {
|
|
||||||
if (isInfoEnabled()) {
|
|
||||||
format = LoggerHelper.getResourceBundleString(getProductName(), format);
|
|
||||||
delegate.info(MessageUtil.getMessage(context, MessageUtil.formatMessage(format, args)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void warn(String message, Throwable t) {
|
|
||||||
if (isWarnEnabled()) {
|
|
||||||
message = LoggerHelper.getResourceBundleString(getProductName(), message);
|
|
||||||
delegate.warn(MessageUtil.getMessage(null, message), t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void warn(String context, String message) {
|
|
||||||
if (isWarnEnabled()) {
|
|
||||||
message = LoggerHelper.getResourceBundleString(getProductName(), message);
|
|
||||||
delegate.warn(MessageUtil.getMessage(context, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void warn(String context, String format, Object... args) {
|
|
||||||
if (isWarnEnabled()) {
|
|
||||||
format = LoggerHelper.getResourceBundleString(getProductName(), format);
|
|
||||||
delegate.warn(MessageUtil.getMessage(context, MessageUtil.formatMessage(format, args)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void error(String context, String errorCode, String message) {
|
|
||||||
if (isErrorEnabled()) {
|
|
||||||
message = LoggerHelper.getResourceBundleString(getProductName(), message);
|
|
||||||
delegate.error(MessageUtil.getMessage(context, errorCode, message));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void error(String context, String errorCode, String message, Throwable t) {
|
|
||||||
if (isErrorEnabled()) {
|
|
||||||
message = LoggerHelper.getResourceBundleString(getProductName(), message);
|
|
||||||
delegate.error(MessageUtil.getMessage(context, errorCode, message), t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void error(String context, String errorCode, String format, Object... args) {
|
|
||||||
if (isErrorEnabled()) {
|
|
||||||
format = LoggerHelper.getResourceBundleString(getProductName(), format);
|
|
||||||
delegate.error(MessageUtil.getMessage(context, errorCode, MessageUtil.formatMessage(format, args)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isDebugEnabled() {
|
|
||||||
return delegate.isDebugEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isInfoEnabled() {
|
|
||||||
return delegate.isInfoEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isWarnEnabled() {
|
|
||||||
return delegate.isEnabledFor(Level.WARN);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isErrorEnabled() {
|
|
||||||
return delegate.isEnabledFor(Level.ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package com.alibaba.nacos.client.logger.log4j;
|
|
||||||
|
|
||||||
import org.apache.log4j.LogManager;
|
|
||||||
|
|
||||||
import com.alibaba.nacos.client.logger.Logger;
|
|
||||||
import com.alibaba.nacos.client.logger.nop.NopLogger;
|
|
||||||
import com.alibaba.nacos.client.logger.support.ILoggerFactory;
|
|
||||||
import com.alibaba.nacos.client.logger.support.LogLog;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Log4jLogger Factory
|
|
||||||
* @author Nacos
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class Log4jLoggerFactory implements ILoggerFactory {
|
|
||||||
|
|
||||||
public Log4jLoggerFactory() throws ClassNotFoundException {
|
|
||||||
Class.forName("org.apache.log4j.Level");
|
|
||||||
}
|
|
||||||
|
|
||||||
public Logger getLogger(Class<?> clazz) {
|
|
||||||
try {
|
|
||||||
return new Log4jLogger(LogManager.getLogger(clazz));
|
|
||||||
} catch (Throwable t) {
|
|
||||||
LogLog.error("Failed to get Log4jLogger", t);
|
|
||||||
return new NopLogger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Logger getLogger(String name) {
|
|
||||||
try {
|
|
||||||
return new Log4jLogger(LogManager.getLogger(name));
|
|
||||||
} catch (Throwable t) {
|
|
||||||
LogLog.error("Failed to get Log4jLogger", t);
|
|
||||||
return new NopLogger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -21,11 +21,10 @@ import com.alibaba.nacos.client.logger.support.LoggerHelper;
|
|||||||
import com.alibaba.nacos.client.logger.support.LoggerSupport;
|
import com.alibaba.nacos.client.logger.support.LoggerSupport;
|
||||||
import com.alibaba.nacos.client.logger.util.MessageUtil;
|
import com.alibaba.nacos.client.logger.util.MessageUtil;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log4j2Logger
|
* Log4j2Logger
|
||||||
* @author Nacos
|
|
||||||
*
|
*
|
||||||
|
* @author Nacos
|
||||||
*/
|
*/
|
||||||
public class Log4j2Logger extends LoggerSupport implements Logger {
|
public class Log4j2Logger extends LoggerSupport implements Logger {
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user