You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tubemq.apache.org by yu...@apache.org on 2021/02/18 12:43:59 UTC

[incubator-tubemq] branch master updated: [TUBEMQ-562]Update project contents according to the 0.8.0-RC3 review (#429)

This is an automated email from the ASF dual-hosted git repository.

yuanbo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-tubemq.git


The following commit(s) were added to refs/heads/master by this push:
     new e16d8e5  [TUBEMQ-562]Update project contents according to the 0.8.0-RC3 review (#429)
e16d8e5 is described below

commit e16d8e50e1144cafa08abde1b594a69323a71a90
Author: gosonzhang <46...@qq.com>
AuthorDate: Thu Feb 18 20:43:49 2021 +0800

    [TUBEMQ-562]Update project contents according to the 0.8.0-RC3 review (#429)
    
    Co-authored-by: gosonzhang <go...@tencent.com>
---
 DISCLAIMER                                         |   6 -
 DISCLAIMER-WIP                                     |  18 +
 LICENSE                                            | 343 ++------
 NOTICE                                             |  13 +-
 pom.xml                                            |   3 +-
 tubemq-client/src/main/assembly/assembly.xml       |   2 +-
 .../apache/tubemq/corebase/utils/TStringUtils.java | 886 ++++-----------------
 tubemq-server/src/main/assembly/assembly.xml       |   2 +-
 8 files changed, 231 insertions(+), 1042 deletions(-)

diff --git a/DISCLAIMER b/DISCLAIMER
deleted file mode 100644
index 06b6195..0000000
--- a/DISCLAIMER
+++ /dev/null
@@ -1,6 +0,0 @@
-Apache TubeMQ is an effort undergoing incubation at The Apache Software Foundation (ASF),
-sponsored by the Apache Incubator. Incubation is required of all newly accepted projects
-until a further review indicates that the infrastructure, communications, and decision
-making process have stabilized in a manner consistent with other successful ASF projects.
-While incubation status is not necessarily a reflection of the completeness or stability
-of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
\ No newline at end of file
diff --git a/DISCLAIMER-WIP b/DISCLAIMER-WIP
new file mode 100644
index 0000000..6c72cf3
--- /dev/null
+++ b/DISCLAIMER-WIP
@@ -0,0 +1,18 @@
+Apache TubeMQ is an effort undergoing incubation at The Apache Software Foundation (ASF),
+sponsored by the Apache Incubator. Incubation is required of all newly accepted projects
+until a further review indicates that the infrastructure, communications, and decision
+making process have stabilized in a manner consistent with other successful ASF projects.
+While incubation status is not necessarily a reflection of the completeness or stability
+of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+
+Some of the incubating project's releases may not be fully compliant with ASF policy. For
+example, releases may have incomplete or un-reviewed licensing conditions. What follows is
+a list of known issues the project is currently aware of (note that this list, by definition,
+is likely to be incomplete):
+
+ * Releases may have incomplete licensing conditions
+
+If you are planning to incorporate this work into your product/project, please be aware that
+you will need to conduct a thorough licensing review to determine the overall implications of
+including this work. For the current status of this project through the Apache Incubator
+visit: https://incubator.apache.org/projects/tubemq.html
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 7ef57fd..c6bfcd6 100644
--- a/LICENSE
+++ b/LICENSE
@@ -204,18 +204,15 @@
 
 =======================================================================
 
+1 This projects includes modified/copied source files with the following licenses:
+
 =========
-1. Third party MIT license licenses
+1.1 Third party MIT license licenses
 =========
 
-1.1 The following modified/copied source files are provided under the MIT license.
-
-----
-
 1.1.1 resources/assets/lib/jquery.min.js
  Source  : jquery 1.11.3
  License : https://github.com/jquery/jquery/blob/1.11.3/MIT-LICENSE.txt
-
 | Copyright 2014 jQuery Foundation and other contributors
 | http://jquery.com/
 |
@@ -243,7 +240,6 @@
 1.1.2 resources/assets/lib/DataTables/*
  Source  : datatables  1.10.7
  License : https://github.com/DataTables/DataTables/blob/1.10.7/license.txt
-
 | Copyright (c) 2008-2013 SpryMedia Limited
 | http://datatables.net
 |
@@ -265,91 +261,72 @@
 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | THE SOFTWARE.
 
-------------------
-
-1.2 The following binary dependency packages are provided under the MIT license.
-
 ----
 
-1.2.1 org.slf4j:slf4j-api
-      org.slf4j:slf4j-log4j12
- Version : 1.6.2
- License : For details, see https://github.com/qos-ch/slf4j/blob/master/LICENSE.txt
-
-1.2.1 org.mockito:mockito-all:1.9.0
-      org.mockito:mockito-core:2.18.0
- License : For details, see https://github.com/mockito/mockito/blob/release/1.x/LICENSE
-                            https://github.com/mockito/mockito/blob/release/2.x/LICENSE
+1.1.3 resources/assets/public/css/style.css
+      resources/assets/public/css/ie.css
+ Source  : Compass
+ License :  https://github.com/Compass/compass/blob/stable/LICENSE.markdown
+ | Copyright (c) 2009-2014 Christopher M. Eppstein
+ |
+ | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+ |
+ | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. No attribution is required by products that make use of this software.
+ |
+ | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ |
+ | Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization.
+ |
+ | Contributors to this project agree to grant all rights to the copyright holder of the primary product. Attribution is maintained in the source control history of the product.
 
+----
 
 =========
-2. Third party BSD 3-Clause license
+1.2 Third party BSD 3-Clause license
 =========
 
-2.1 The following modified/copied source files are provided under the BSD 3-Clause license.
-
-----
-
-2.1.1 tubemq-client-twins/tubemq-client-cpp/src/any.h
+1.2.1 tubemq-client-twins/tubemq-client-cpp/src/any.h
       tubemq-client-twins/tubemq-client-cpp/src/buffer.h
  Source  : https://github.com/Qihoo360/evpp/blob/master/evpp/any.h version c5038a6
            https://github.com/Qihoo360/evpp/blob/master/evpp/buffer.h version b2535d7
  License : https://github.com/Qihoo360/evpp/blob/master/LICENSE
-
-| BSD 3-Clause License
-|
-| Copyright (c) 2017, Qihoo 360
-| All rights reserved.
-|
-| Redistribution and use in source and binary forms, with or without
-| modification, are permitted provided that the following conditions are met:
-|
-| * Redistributions of source code must retain the above copyright notice, this
-|   list of conditions and the following disclaimer.
-|
-| * Redistributions in binary form must reproduce the above copyright notice,
-|   this list of conditions and the following disclaimer in the documentation
-|   and/or other materials provided with the distribution.
-|
-| * Neither the name of the copyright holder nor the names of its
-|   contributors may be used to endorse or promote products derived from
-|   this software without specific prior written permission.
-|
-| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-| AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-| IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-------------------
-
-2.2 The following binary dependency packages are provided under the BSD 3-Clause license.
+ | BSD 3-Clause License
+ |
+ | Copyright (c) 2017, Qihoo 360
+ | All rights reserved.
+ |
+ | Redistribution and use in source and binary forms, with or without
+ | modification, are permitted provided that the following conditions are met:
+ |
+ | * Redistributions of source code must retain the above copyright notice, this
+ |   list of conditions and the following disclaimer.
+ |
+ | * Redistributions in binary form must reproduce the above copyright notice,
+ |   this list of conditions and the following disclaimer in the documentation
+ |   and/or other materials provided with the distribution.
+ |
+ | * Neither the name of the copyright holder nor the names of its
+ |   contributors may be used to endorse or promote products derived from
+ |   this software without specific prior written permission.
+ |
+ | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 ----
 
-2.2.1 com.google.protobuf:protobuf-java
- Version : 2.5.0
- License : For details, see https://github.com/protocolbuffers/protobuf/blob/v2.5.0/COPYING.txt
-
-2.2.2 com.googlecode.protobuf-java-format:protobuf-java-format
- Version : 1.4
- License : For details, see https://github.com/bivas/protobuf-java-format/blob/master/LICENSE.txt
-
-
 =========
-3. Third party Apache 2.0 Licenses
+1.3 Third party Apache 2.0 Licenses
 =========
 
-3.1 The following modified/copied source files are provided under the Apache 2.0 License.
-
-----
-
-3.1.1 tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/Bytes.java
+1.3.1 tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/Bytes.java
       tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HashedBytes.java
       tubemq-server/src/main/java/org/apache/tubemq/server/common/utils/HasThread.java
       tubemq-server/src/main/java/org/apache/tubemq/server/common/offsetstorage/zookeeper/RecoverableZooKeeper.java
@@ -363,231 +340,38 @@
  Source  : hbase 0.94.27 (Please note that the software have been modified.)
  License : https://github.com/apache/hbase/blob/rel/0.94.27/LICENSE.txt
 
-3.1.2 tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MapBackedSet.java
+1.3.2 tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/MapBackedSet.java
       tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/ConcurrentHashSet.java
  Source  : mina 2.0.12
  License : https://github.com/apache/mina/blob/2.0.12/LICENSE.txt
 
-3.1.3 bin/broker.sh
+1.3.3 bin/broker.sh
       bin/master.sh
  Source  : Metamorphosis  metamorphosis-all-1.4.4 (Please note that the software have been modified.)
  License : https://github.com/killme2008/Metamorphosis/blob/metamorphosis-all-1.4.4/COPYING.txt
 
-3.1.4 tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferInputStream.java
+1.3.4 tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferInputStream.java
       tubemq-core/src/main/java/org/apache/tubemq/corerpc/netty/ByteBufferOutputStream.java
  Source  : Apache Avro 1.7.6
  License : https://github.com/apache/avro/blob/release-1.7.6/LICENSE.txt
 
-3.1.5 tubemq-client-twins/tubemq-client-cpp/src/future.h
+1.3.5 tubemq-client-twins/tubemq-client-cpp/src/future.h
  Source  : Apache Pulsar
  License : https://github.com/apache/pulsar/blob/master/LICENSE
 
-------------------
-
-3.2 The following binary dependency packages are provided under the Apache 2.0 License.
+1.3.6 tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/TStringUtils.java
+ Source  : commons-lang (Please note that the software have been modified.)
+           https://github.com/apache/commons-lang/blob/LANG_2_X/src/
+                 main/java/org/apache/commons/lang/StringUtils.java
+ License : https://github.com/apache/commons-lang/blob/LANG_2_X/LICENSE.txt
 
 ----
 
-3.2.1 io.netty:netty
- Version : 3.8.0.Final
- License : For details, see https://github.com/netty/netty/blob/netty-3.8.0.Final/LICENSE.txt
-
-3.2.2 commons-cli:commons-cli
- Version : 1.4
- License : For details, see https://github.com/apache/commons-cli/blob/master/LICENSE.txt
-
-3.2.3 commons-codec:commons-codec
- Version : 1.10
- License : For details, see https://github.com/apache/commons-codec/blob/1.10/LICENSE.txt
-
-3.2.4 com.google.code.gson:gson
- Version : 2.8.5
- License : For details, see https://github.com/google/gson/blob/master/LICENSE
-
-3.2.5 commons-lang:commons-lang
- Version : 2.6
- License : For details, see https://github.com/apache/commons-lang/blob/master/LICENSE.txt
-
-3.2.6 org.apache.commons:commons-lang3
- Version :
- License : For details, see https://github.com/apache/commons-lang/blob/master/LICENSE.txt
-
-3.2.7 org.apache.httpcomponents:httpclient
- Version : 4.5.2
- License : For details, see https://github.com/apache/httpcomponents-client/blob/master/LICENSE.txt
-
-3.2.8 commons-io:commons-io
- Version : 2.1
- License : For details, see https://github.com/apache/commons-io/blob/master/LICENSE.txt
-
-3.2.9 org.apache.zookeeper:zookeeper
- Version : 3.4.3
- License : For details, see https://github.com/apache/zookeeper/blob/master/LICENSE.txt
-
-3.2.10 com.google.guava:guava
- Version : 13.0
- License : For details, see https://github.com/google/guava/blob/master/COPYING
-
-3.2.11 org.apache.velocity:velocity:1.7
-       org.apache.velocity:velocity-tools:2.0
- License : For details, see https://github.com/apache/velocity-master/blob/master/pom/pom.xml
-                            https://github.com/apache/velocity-tools/blob/2.0/LICENSE
-
-3.2.12 org.springframework:spring-core
-       org.springframework:spring-context
-       org.springframework:spring-jdbc
-       org.springframework:spring-orm
- Version : 4.1.6.RELEASE
- License : For details, see https://github.com/spring-projects/spring-framework/tree/v4.1.6.RELEASE#license
-
-3.2.13 org.mortbay.jetty:jetty
- Version : 6.1.26
- License : For details, see https://github.com/jetty-project/codehaus-jetty6
-
-3.2.14 org.ini4j:ini4j
- Version : 0.5.1
- License : For details, see https://github.com/facebookarchive/ini4j/blob/master/LICENSE.txt
-
-3.2.15 org.easymock:easymock
-       org.easymock:easymockclassextension
- Version : 2.5.2
- License : For details, see https://github.com/easymock/easymock/blob/master/header.txt
-
-3.2.16 org.eclipse.jetty:jetty-server
-       org.eclipse.jetty:jetty-servlet
- Version : 9.4.31.v20200723
- License : For details, see https://github.com/eclipse/jetty.project/blob/jetty-9.4.x/LICENSE
-
-3.2.17 org.powermock:powermock-module-junit4
-       org.powermock:powermock-api-mockito2
- Version : 2.0.4
- License : For details, see https://github.com/powermock/powermock/blob/release/2.x/LICENSE.txt
-
-3.2.18 org.apache.flink:flink-core
-       org.apache.flink:flink-table-common
-       org.apache.flink:flink-runtime_2.11
-       org.apache.flink:flink-streaming-java_2.11
-       org.apache.flink:flink-table-api-java-bridge_2.11
- Version : 1.9.2
- License : For details, see https://github.com/apache/flink/blob/release-1.9/LICENSE
-
-3.2.19 org.apache.flume:flume-ng-core
- Version : 1.9.0
- License : For details, see https://github.com/apache/flume/blob/flume-1.9/LICENSE
-
-3.2.20 org.awaitility:awaitility
- Version : 4.0.3
- License : For details, see https://github.com/awaitility/awaitility/blob/master/LICENSE
-
-3.2.21 org.apache.spark:spark-core_2.11
-       org.apache.spark:spark-sql_2.11
-       org.apache.spark:spark-streaming_2.11
- Version : 2.4.4
- License : For details, see https://github.com/apache/spark/blob/branch-2.4/LICENSE
-
-
 =========
-4. Third party Eclipse Public License 1.0 Licenses
+2 Third party category X Licenses
 =========
 
-4.1 The following binary dependency packages are provided under Eclipse Public License 1.0 Licenses.
-
-----
-
-4.1.1 junit:junit
- Version : 4.11
- License : For details, see https://github.com/junit-team/junit4/blob/main/LICENSE-junit.txt
-
-
-=========
-5. Third party CDDL + GPLv2 with classpath exception Licenses
-=========
-
-5.1 The following binary dependency packages are provided under CDDL + GPLv2 with classpath exception Licenses.
-
-----
-
-5.1.1 javax.servlet:javax.servlet-api
- Version : 4.0.1
- License : For details, see https://github.com/javaee/servlet-spec/blob/master/LICENSE
-
-
-=========
-6. Third party category X Licenses
-=========
-
-6.1 The following modified/copied source files are provided under category X Licenses.
-
-----
-
-6.1.1 tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/TStringUtils.java
- Source  : citrus r3.1.4 (Please note that the software have been modified.)
-           https://github.com/webx/citrus/blob/r3.1.4/common/util/src/main/java/com/alibaba/citrus/util/StringUtil.java
- License: The project does not contain the LICENSE file, but analyzed from
-          the project’s pom.xml content and the file header of the source code file,
-          the following components are provided under the Apache 2.0 License.
-
- pom.xml includes: see https://github.com/webx/citrus/blob/r3.1.4/pom.xml
- |    <licenses>
- |        <license>
- |            <name>The Apache Software License, Version 2.0</name>
- |            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
- |            <distribution>repo</distribution>
- |        </license>
- |    </licenses>
-
- source file includes:
- |
- | Copyright (c) 2002-2012 Alibaba Group Holding Limited.
- | All rights reserved.
- |
- | 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.
- |
-
-----
-
-6.1.2 resources/assets/public/css/style.css
-      resources/assets/public/css/ie.css
- Source  : Compass
- License : According to the content of the project’s README.markdown and LICENSE.markdown,
-           the following components are provided under the slightly modified MIT License.
-
- README.markdown includes:(https://github.com/Compass/compass/blob/stable/README.markdown)
- | License
- | Copyright (c) 2008-2014 Christopher M. Eppstein
- | All Rights Reserved.
- | Released under a slightly modified MIT License.
-
- LICENSE.markdown includes: (https://github.com/Compass/compass/blob/stable/LICENSE.markdown)
- | Copyright (c) 2009-2014 Christopher M. Eppstein
- |
- | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
- |
- | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. No attribution is required by products that make use of this software.
- |
- | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- |
- | Except as contained in this notice, the name(s) of the above copyright holders shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization.
- |
- | Contributors to this project agree to grant all rights to the copyright holder of the primary product. Attribution is maintained in the source control history of the product.
-
-------------------
-
-6.2 The following binary dependency packages are provided under category X Licenses.
-
-----
-
-6.2.1 berkeleydb-je
+2.1 berkeleydb-je
  Version : 7.3.7
  Source  : Oracle
  License :We found that different versions of Berkeley DB JE (Java Edition) use different authorization protocols.
@@ -684,7 +468,6 @@
  |  * THE POSSIBILITY OF SUCH DAMAGE.
  |  */
 
-----
 
 
 
diff --git a/NOTICE b/NOTICE
index bcefb45..85f6960 100644
--- a/NOTICE
+++ b/NOTICE
@@ -4,9 +4,9 @@ Copyright 2019-2021 The Apache Software Foundation.
 This product includes software developed at
 The Apache Software Foundation (https://www.apache.org/).
 
+=======================================================================
 
 Apache HBase includes the following in its NOTICE file:
-
 | Apache HBase
 | Copyright 2007-2020 The Apache Software Foundation
 | 
@@ -60,7 +60,6 @@ Apache HBase includes the following in its NOTICE file:
 
 
 Apache MINA includes the following in its NOTICE file:
-
 | Apache MINA
 | Copyright 2007-2016 The Apache Software Foundation.
 | 
@@ -69,7 +68,6 @@ Apache MINA includes the following in its NOTICE file:
 
 
 Apache Avro includes the following in its NOTICE file:
-
 | Apache Avro
 | Copyright 2010-2019 The Apache Software Foundation
 | 
@@ -146,8 +144,15 @@ Apache Avro includes the following in its NOTICE file:
 | | See the License for the specific language governing permissions and limitations under the License.
 
 
-Apache Pulsar includes the following in its NOTICE file:
+Apache Commons Lang includes the following in its NOTICE file:
+| Apache Commons Lang
+| Copyright 2001-2011 The Apache Software Foundation
+|
+| This product includes software developed by
+| The Apache Software Foundation (http://www.apache.org/).
+
 
+Apache Pulsar includes the following in its NOTICE file:
 | Apache Pulsar
 | Copyright 2017-2019 The Apache Software Foundation
 | 
diff --git a/pom.xml b/pom.xml
index bca1abf..fe34837 100644
--- a/pom.xml
+++ b/pom.xml
@@ -261,11 +261,10 @@
                         <!-- Front-end -->
                         <exclude>resources/assets/lib/**</exclude>
                         <exclude>resources/assets/public/**</exclude>
-                        <exclude>DISCLAIMER</exclude>
+                        <exclude>DISCLAIMER-WIP</exclude>
                         <!-- copy or modify files from other projects -->
                         <exclude>**/tubemq-client-twins/tubemq-client-cpp/src/any.h</exclude>
                         <exclude>**/tubemq-client-twins/tubemq-client-cpp/src/buffer.h</exclude>
-                        <exclude>**/tubemq-core/src/corebase/utils/TStringUtils.java</exclude>
                         <exclude>**/tubemq-client-twins/tubemq-client-cpp/third_party/**</exclude>
                     </excludes>
                 </configuration>
diff --git a/tubemq-client/src/main/assembly/assembly.xml b/tubemq-client/src/main/assembly/assembly.xml
index 52cad36..ee48ac7 100644
--- a/tubemq-client/src/main/assembly/assembly.xml
+++ b/tubemq-client/src/main/assembly/assembly.xml
@@ -34,7 +34,7 @@
                 <include>./conf/tools.log4j.properties</include>
                 <include>LICENSE</include>
                 <include>NOTICE</include>
-                <include>DISCLAIMER</include>
+                <include>DISCLAIMER-WIP</include>
             </includes>
             <excludes>
                 <exclude>**/src/**</exclude>
diff --git a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/TStringUtils.java b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/TStringUtils.java
index f99ba52..b5dc005 100644
--- a/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/TStringUtils.java
+++ b/tubemq-core/src/main/java/org/apache/tubemq/corebase/utils/TStringUtils.java
@@ -1,12 +1,12 @@
 /*
- * Copyright (c) 2002-2012 Alibaba Group Holding Limited.
- * All rights reserved.
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
  *
- * 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
+ *      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,
@@ -16,15 +16,13 @@
  */
 
 /*
- * Modified from citrus <a href="https://github.com/webx/citrus">citrus Project</a>
- *   file address: https://github.com/webx/citrus/blob/r3.1.4/common/util/src/
- *                          main/java/com/alibaba/citrus/util/StringUtil.java
+ * Modified from commons-lang <a href="https://github.com/apache/commons-lang"> Project</a>
+ *   file address: https://github.com/apache/commons-lang/blob/LANG_2_X/src/
+ *                         main/java/org/apache/commons/lang/StringUtils.java
  */
 
 package org.apache.tubemq.corebase.utils;
 
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import org.apache.commons.codec.binary.Base64;
@@ -39,10 +37,11 @@ public class TStringUtils {
 
     public static final String EMPTY = "";
 
-
+    // Empty checks
+    //-----------------------------------------------------------------------
     /**
      * <p>Checks if a String is empty ("") or null.</p>
-     * <p>
+     *
      * <pre>
      * TStringUtils.isEmpty(null)      = true
      * TStringUtils.isEmpty("")        = true
@@ -50,11 +49,12 @@ public class TStringUtils {
      * TStringUtils.isEmpty("bob")     = false
      * TStringUtils.isEmpty("  bob  ") = false
      * </pre>
-     * <p>
-     * <p>NOTE: This method changed in Lang version 2.0. It no longer trims the String. That
-     * functionality is available in isBlank().</p>
      *
-     * @param str the String to check, may be null
+     * <p>NOTE: This method changed in Lang version 2.0.
+     * It no longer trims the String.
+     * That functionality is available in isBlank().</p>
+     *
+     * @param str  the String to check, may be null
      * @return <code>true</code> if the String is empty or null
      */
     public static boolean isEmpty(String str) {
@@ -63,7 +63,7 @@ public class TStringUtils {
 
     /**
      * <p>Checks if a String is not empty ("") and not null.</p>
-     * <p>
+     *
      * <pre>
      * TStringUtils.isNotEmpty(null)      = false
      * TStringUtils.isNotEmpty("")        = false
@@ -72,7 +72,7 @@ public class TStringUtils {
      * TStringUtils.isNotEmpty("  bob  ") = true
      * </pre>
      *
-     * @param str the String to check, may be null
+     * @param str  the String to check, may be null
      * @return <code>true</code> if the String is not empty and not null
      */
     public static boolean isNotEmpty(String str) {
@@ -81,7 +81,7 @@ public class TStringUtils {
 
     /**
      * <p>Checks if a String is whitespace, empty ("") or null.</p>
-     * <p>
+     *
      * <pre>
      * TStringUtils.isBlank(null)      = true
      * TStringUtils.isBlank("")        = true
@@ -90,7 +90,7 @@ public class TStringUtils {
      * TStringUtils.isBlank("  bob  ") = false
      * </pre>
      *
-     * @param str the String to check, may be null
+     * @param str  the String to check, may be null
      * @return <code>true</code> if the String is null, empty or whitespace
      * @since 2.0
      */
@@ -100,7 +100,7 @@ public class TStringUtils {
             return true;
         }
         for (int i = 0; i < strLen; i++) {
-            if ((!Character.isWhitespace(str.charAt(i)))) {
+            if (!Character.isWhitespace(str.charAt(i))) {
                 return false;
             }
         }
@@ -109,7 +109,7 @@ public class TStringUtils {
 
     /**
      * <p>Checks if a String is not empty (""), not null and not whitespace only.</p>
-     * <p>
+     *
      * <pre>
      * TStringUtils.isNotBlank(null)      = false
      * TStringUtils.isNotBlank("")        = false
@@ -118,293 +118,55 @@ public class TStringUtils {
      * TStringUtils.isNotBlank("  bob  ") = true
      * </pre>
      *
-     * @param str the String to check, may be null
-     * @return <code>true</code> if the String is not empty and not null and not whitespace
+     * @param str  the String to check, may be null
+     * @return <code>true</code> if the String is
+     *  not empty and not null and not whitespace
      * @since 2.0
      */
     public static boolean isNotBlank(String str) {
         return !isBlank(str);
     }
 
-    public static String trim(String str) {
-        return str == null ? null : str.trim();
-    }
-
-    public static String trimToNull(String str) {
-        String ts = trim(str);
-        return isEmpty(ts) ? null : ts;
-    }
-
-    public static String trimToEmpty(String str) {
-        return str == null ? EMPTY : str.trim();
-    }
-
-    public static boolean equals(String str1, String str2) {
-        return str1 == null ? str2 == null : str1.equals(str2);
-    }
-
-    public static boolean equalsIgnoreCase(String str1, String str2) {
-        return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2);
-    }
-
-    // ==========================================================================
-    // Case conversion.
-    // ==========================================================================
-
-    /**
-     * Convert the first character of a string to uppercase
-     * (<code>Character.toTitleCase</code>) <p> if string is
-     * <code>null</code>return<code>null</code>。
-     * <p/>
-     * <pre>
-     * TStringUtils.capitalize(null)  = null
-     * TStringUtils.capitalize("")    = ""
-     * TStringUtils.capitalize("cat") = "Cat"
-     * TStringUtils.capitalize("cAt") = "CAt"
-     * </pre>
-     * <p/>
-     * </p>
-     *
-     * @param str The string to be converted
-     * @return Convert the first character of a string to upper case
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String capitalize(String str) {
-        int strLen;
-
-        if (str == null || (strLen = str.length()) == 0) {
-            return str;
-        }
-
-        return new StringBuilder(strLen)
-                .append(Character.toTitleCase(str.charAt(0)))
-                .append(str.substring(1))
-                .toString();
-    }
-
-    /**
-     * <p/>
-     * <pre>
-     * TStringUtils.uncapitalize(null)  = null
-     * TStringUtils.uncapitalize("")    = ""
-     * TStringUtils.uncapitalize("Cat") = "cat"
-     * TStringUtils.uncapitalize("CAT") = "CAT"
-     * </pre>
-     * <p/>
-     * </p>
-     *
-     * @param str The string to be converted
-     * @return Convert the first character of a string to lower case
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String uncapitalize(String str) {
-        int strLen;
-
-        if (str == null || (strLen = str.length()) == 0) {
-            return str;
-        }
-
-        if (strLen > 1
-                && Character.isUpperCase(str.charAt(1))
-                && Character.isUpperCase(str.charAt(0))) {
-            return str;
-        }
-
-        return new StringBuilder(strLen)
-                .append(Character.toLowerCase(str.charAt(0)))
-                .append(str.substring(1))
-                .toString();
-    }
-
     /**
-     * <p/>
-     * <pre>
-     * TStringUtils.swapCase(null)                 = null
-     * TStringUtils.swapCase("")                   = ""
-     * TStringUtils.swapCase("The dog has a BONE") = "tHE DOG HAS A bone"
-     * </pre>
-     * <p/>
-     * </p>
+     * <p>Removes control characters (char &lt;= 32) from both
+     * ends of this String, handling <code>null</code> by returning
+     * <code>null</code>.</p>
      *
-     * @param str The string to be converted
-     * @return Case inverted character string
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String swapCase(String str) {
-        int strLen;
-
-        if (str == null || (strLen = str.length()) == 0) {
-            return str;
-        }
-
-        StringBuilder buffer = new StringBuilder(strLen);
-
-        char ch = 0;
-
-        for (int i = 0; i < strLen; i++) {
-            ch = str.charAt(i);
-
-            if (Character.isUpperCase(ch)) {
-                ch = Character.toLowerCase(ch);
-            } else if (Character.isTitleCase(ch)) {
-                ch = Character.toLowerCase(ch);
-            } else if (Character.isLowerCase(ch)) {
-                ch = Character.toUpperCase(ch);
-            }
-
-            buffer.append(ch);
-        }
-
-        return buffer.toString();
-    }
-
-    /**
-     * <p/>
-     * <pre>
-     * TStringUtils.toUpperCase(null)  = null
-     * TStringUtils.toUpperCase("")    = ""
-     * TStringUtils.toUpperCase("aBc") = "ABC"
-     * </pre>
-     * <p/>
-     * </p>
+     * <p>The String is trimmed using {@link String#trim()}.
+     * Trim removes start and end characters &lt;= 32.</p>
      *
-     * @param str The string to be converted
-     * @return Convert the string to upper case
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String toUpperCase(String str) {
-        if (str == null) {
-            return null;
-        }
-
-        return str.toUpperCase();
-    }
-
-    /**
-     * <p/>
      * <pre>
-     * TStringUtils.toLowerCase(null)  = null
-     * TStringUtils.toLowerCase("")    = ""
-     * TStringUtils.toLowerCase("aBc") = "abc"
+     * TStringUtils.trim(null)          = null
+     * TStringUtils.trim("")            = ""
+     * TStringUtils.trim("     ")       = ""
+     * TStringUtils.trim("abc")         = "abc"
+     * TStringUtils.trim("    abc    ") = "abc"
      * </pre>
-     * <p/>
-     * </p>
      *
-     * @param str The string to be converted
-     * @return Convert the string to lower case
-     * if it is <code>null</code>,return<code>null</code>
+     * @param str  the String to be trimmed, may be null
+     * @return the trimmed string, <code>null</code> if null String input
      */
-    public static String toLowerCase(String str) {
-        if (str == null) {
-            return null;
-        }
-
-        return str.toLowerCase();
+    public static String trim(String str) {
+        return str == null ? null : str.trim();
     }
 
+    // Misc
+    //-----------------------------------------------------------------------
     /**
-     * <p/>
-     * <pre>
-     * TStringUtils.toCamelCase(null)  = null
-     * TStringUtils.toCamelCase("")    = ""
-     * TStringUtils.toCamelCase("aBc") = "aBc"
-     * TStringUtils.toCamelCase("aBc def") = "aBcDef"
-     * TStringUtils.toCamelCase("aBc def_ghi") = "aBcDefGhi"
-     * TStringUtils.toCamelCase("aBc def_ghi 123") = "aBcDefGhi123"
-     * </pre>
-     * <p/>
-     * </p> <p> This method preserves all separators except underscores and whitespace. </p>
+     * <p>Find the Levenshtein distance between two Strings.</p>
      *
-     * @param str The string to be converted
-     * @return Convert the string to Camel Case
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String toCamelCase(String str) {
-        return new MyWordTokenizer(1).parse(str);
-    }
-
-    /**
-     * <p/>
-     * <pre>
-     * TStringUtils.toPascalCase(null)  = null
-     * TStringUtils.toPascalCase("")    = ""
-     * TStringUtils.toPascalCase("aBc") = "ABc"
-     * TStringUtils.toPascalCase("aBc def") = "ABcDef"
-     * TStringUtils.toPascalCase("aBc def_ghi") = "ABcDefGhi"
-     * TStringUtils.toPascalCase("aBc def_ghi 123") = "aBcDefGhi123"
-     * </pre>
-     * <p/>
-     * </p> <p> This method preserves all separators except underscores and whitespace. </p>
+     * <p>This is the number of changes needed to change one String into
+     * another, where each change is a single character modification (deletion,
+     * insertion or substitution).</p>
      *
-     * @param str The string to be converted
-     * @return Convert the string to Pascal Case
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String toPascalCase(String str) {
-        return new MyWordTokenizer(3).parse(str);
-    }
-
-    /**
-     * <p/>
-     * <pre>
-     * TStringUtils.toUpperCaseWithUnderscores(null)  = null
-     * TStringUtils.toUpperCaseWithUnderscores("")    = ""
-     * TStringUtils.toUpperCaseWithUnderscores("aBc") = "A_BC"
-     * TStringUtils.toUpperCaseWithUnderscores("aBc def") = "A_BC_DEF"
-     * TStringUtils.toUpperCaseWithUnderscores("aBc def_ghi") = "A_BC_DEF_GHI"
-     * TStringUtils.toUpperCaseWithUnderscores("aBc def_ghi 123") = "A_BC_DEF_GHI_123"
-     * TStringUtils.toUpperCaseWithUnderscores("__a__Bc__") = "__A__BC__"
-     * </pre>
-     * <p/>
-     * </p> <p> This method preserves all separators except whitespace. </p>
+     * <p>The previous implementation of the Levenshtein distance algorithm
+     * was from <a href="http://www.merriampark.com/ld.htm">http://www.merriampark.com/ld.htm</a></p>
      *
-     * @param str The string to be converted
-     * @return Convert the string to Upper Case With Underscores
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String toUpperCaseWithUnderscores(String str) {
-        return new MyWordTokenizer(4).parse(str);
-    }
-
-    /**
-     * <p/>
-     * <pre>
-     * TStringUtils.toLowerCaseWithUnderscores(null)  = null
-     * TStringUtils.toLowerCaseWithUnderscores("")    = ""
-     * TStringUtils.toLowerCaseWithUnderscores("aBc") = "a_bc"
-     * TStringUtils.toLowerCaseWithUnderscores("aBc def") = "a_bc_def"
-     * TStringUtils.toLowerCaseWithUnderscores("aBc def_ghi") = "a_bc_def_ghi"
-     * TStringUtils.toLowerCaseWithUnderscores("aBc def_ghi 123") = "a_bc_def_ghi_123"
-     * TStringUtils.toLowerCaseWithUnderscores("__a__Bc__") = "__a__bc__"
-     * </pre>
-     * <p/>
-     * </p> <p> This method preserves all separators except whitespace. </p>
+     * <p>Chas Emerick has written an implementation in Java, which avoids an OutOfMemoryError
+     * which can occur when my Java implementation is used with very large strings.<br>
+     * This implementation of the Levenshtein distance algorithm
+     * is from <a href="http://www.merriampark.com/ldjava.htm">http://www.merriampark.com/ldjava.htm</a></p>
      *
-     * @param str The string to be converted
-     * @return Convert the string to lower Case With Underscores
-     * if it is <code>null</code>,return<code>null</code>
-     */
-    public static String toLowerCaseWithUnderscores(String str) {
-        return new MyWordTokenizer(2).parse(str);
-    }
-
-    // Misc
-    //-----------------------------------------------------------------------
-
-    /**
-     * <p>Find the Levenshtein distance between two Strings.</p>
-     * <p>
-     * <p>This is the number of changes needed to change one String into another, where each change
-     * is a single character modification (deletion, insertion or substitution).</p>
-     * <p>
-     * <p>The previous implementation of the Levenshtein distance algorithm was from <a
-     * href="http://www.merriampark.com/ld.htm">http://www.merriampark.com/ld.htm</a></p>
-     * <p>
-     * <p>Chas Emerick has written an implementation in Java, which avoids an OutOfMemoryError which
-     * can occur when my Java implementation is used with very large strings.<br> This
-     * implementation of the Levenshtein distance algorithm is from <a
-     * href="http://www.merriampark.com/ldjava.htm">http://www.merriampark.com/ldjava.htm</a></p>
-     * <p>
      * <pre>
      * TStringUtils.getLevenshteinDistance(null, *)             = IllegalArgumentException
      * TStringUtils.getLevenshteinDistance(*, null)             = IllegalArgumentException
@@ -419,8 +181,8 @@ public class TStringUtils {
      * TStringUtils.getLevenshteinDistance("hello", "hallo")    = 1
      * </pre>
      *
-     * @param s the first String, must not be null
-     * @param t the second String, must not be null
+     * @param s  the first String, must not be null
+     * @param t  the second String, must not be null
      * @return result distance
      * @throws IllegalArgumentException if either String input <code>null</code>
      */
@@ -441,7 +203,6 @@ public class TStringUtils {
            of the current cost count being calculated).  (Note that the arrays aren't really
            copied anymore, just switched...this is clearly much better than cloning an array
            or doing a System.arraycopy() each time  through the outer loop.)
-
            Effectively, the difference between the two implementations is this one does not
            cause an out of memory condition when calculating the LD over two very large strings.
          */
@@ -464,29 +225,30 @@ public class TStringUtils {
             m = t.length();
         }
 
-        int[] p = new int[n + 1]; //'previous' cost array, horizontally
-        int[] d = new int[n + 1]; // cost array, horizontally
-        int[] swap; // swap helper to assist in swapping p and d
+        int p[] = new int[n + 1]; //'previous' cost array, horizontally
+        int d[] = new int[n + 1]; // cost array, horizontally
+        int swap[]; //placeholder to assist in swapping p and d
 
         // indexes into strings s and t
         int i; // iterates through s
         int j; // iterates through t
 
+        char chkChar; // jth character of t
+
         int cost; // cost
 
         for (i = 0; i <= n; i++) {
             p[i] = i;
         }
 
-        char ch; // jth character of t
         for (j = 1; j <= m; j++) {
-            ch = t.charAt(j - 1);
+            chkChar = t.charAt(j - 1);
             d[0] = j;
 
             for (i = 1; i <= n; i++) {
-                cost = s.charAt(i - 1) == ch ? 0 : 1;
+                cost = s.charAt(i - 1) == chkChar ? 0 : 1;
                 // minimum of cell to the left+1, to the top+1, diagonally left and up +cost
-                d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost);
+                d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1),  p[i - 1] + cost);
             }
 
             // copy current distance counts to 'previous row' distance counts
@@ -500,25 +262,81 @@ public class TStringUtils {
         return p[n];
     }
 
-    public static String arrayToString(String[] strs) {
-        if (strs.length == 0) {
-            return "";
-        }
-        StringBuilder sbuf = new StringBuilder();
-        sbuf.append(strs[0]);
-        for (int idx = 1; idx < strs.length; idx++) {
-            sbuf.append(",");
-            sbuf.append(strs[idx]);
-        }
-        return sbuf.toString();
+    public static boolean isLetter(char ch) {
+        return (Character.isUpperCase(ch)
+                || Character.isLowerCase(ch));
     }
 
-    public static String stringifyException(Throwable e) {
-        StringWriter stm = new StringWriter();
-        PrintWriter wrt = new PrintWriter(stm);
-        e.printStackTrace(wrt);
-        wrt.close();
-        return stm.toString();
+    public static boolean isLetterOrDigit(char ch) {
+        return isLetter(ch) || Character.isDigit(ch);
+    }
+
+    /**
+     * <p/>
+     * <pre>
+     * TStringUtils.toCamelCase(null)  = null
+     * TStringUtils.toCamelCase("")    = ""
+     * TStringUtils.toCamelCase("aBc") = "aBc"
+     * TStringUtils.toCamelCase("aBc def") = "aBcDef"
+     * TStringUtils.toCamelCase("aBc def_ghi") = "aBcDefGhi"
+     * TStringUtils.toCamelCase("aBc def_ghi 123") = "aBcDefGhi123"
+     * </pre>
+     * <p/>
+     * </p> <p> This method preserves all separators except underscores and whitespace. </p>
+     *
+     * @param origStr The string to be converted
+     * @return Convert the string to Camel Case
+     * if it is <code>null</code>,return<code>null</code>
+     */
+    public static String toCamelCase(String origStr) {
+        if (isEmpty(origStr)) {
+            return origStr;
+        }
+        origStr = origStr.trim();
+        int length = origStr.length();
+
+        char curChar;
+        char preChar;
+        int curWritePos = 0;
+        boolean upperCaseNext = false;
+        char[] tgtStr = new char[length];
+        for (int index = 0; index < length; ) {
+            curChar = origStr.charAt(index);
+            index += Character.charCount(curChar);
+            // ignore white space chars
+            if (Character.isWhitespace(curChar)) {
+                continue;
+            }
+            // process char and '_' delimiter
+            if (isLetter(curChar)) {
+                if (upperCaseNext) {
+                    upperCaseNext = false;
+                    curChar = Character.toUpperCase(curChar);
+                } else {
+                    if (curWritePos == 0) {
+                        curChar = Character.toLowerCase(curChar);
+                    } else {
+                        preChar = tgtStr[curWritePos - 1];
+                        // judge pre-read char not Letter or digit
+                        if (!isLetterOrDigit(preChar)) {
+                            curChar = Character.toLowerCase(curChar);
+                        } else {
+                            if (Character.isUpperCase(preChar)) {
+                                curChar = Character.toLowerCase(curChar);
+                            }
+                        }
+                    }
+                }
+                tgtStr[curWritePos++] = curChar;
+            } else {
+                if (curChar == '_') {
+                    upperCaseNext = true;
+                } else {
+                    tgtStr[curWritePos++] = curChar;
+                }
+            }
+        }
+        return new String(tgtStr, 0, curWritePos);
     }
 
     public static String getAuthSignature(final String usrName,
@@ -528,7 +346,8 @@ public class TStringUtils {
         StringBuilder sbuf = new StringBuilder(512);
         byte[] baseStr =
                 base64.encode(HmacUtils.hmacSha1(usrPassWord,
-                        sbuf.append(usrName).append(timestamp).append(randomValue).toString()));
+                        sbuf.append(usrName).append(timestamp)
+                                .append(randomValue).toString()));
         sbuf.delete(0, sbuf.length());
         String signature = "";
         try {
@@ -585,433 +404,4 @@ public class TStringUtils {
         return null;
     }
 
-    /**
-     * Parse the <code>SENTENCE</code> formed by the following grammar.
-     * <p/>
-     * <pre>
-     *  SENTENCE = WORD (DELIMITER* WORD)*
-     *
-     *  WORD = UPPER_CASE_WORD | LOWER_CASE_WORD | TITLE_CASE_WORD | DIGIT_WORD
-     *
-     *  UPPER_CASE_WORD = UPPER_CASE_LETTER+
-     *  LOWER_CASE_WORD = LOWER_CASE_LETTER+
-     *  TITLE_CASE_WORD = UPPER_CASE_LETTER LOWER_CASE_LETTER+
-     *  DIGIT_WORD      = DIGIT+
-     *
-     *  UPPER_CASE_LETTER = Character.isUpperCase()
-     *  LOWER_CASE_LETTER = Character.isLowerCase()
-     *  DIGIT             = Character.isDigit()
-     *  NON_LETTER_DIGIT  = !Character.isUpperCase() && !Character.isLowerCase() &&
-     * !Character.isDigit()
-     *
-     *  DELIMITER = WHITESPACE | NON_LETTER_DIGIT
-     * </pre>
-     */
-
-    // A tokenizer that performs string processing on a string according to a specified type
-    private static class MyWordTokenizer extends WordTokenizer {
-        // Participle type, wordTokenType range of values [-2,1,2,,3,4]
-        // -2,1 : toCamelCase
-        //    2 : toLowerCaseWithUnderscores
-        //    3 : toPascalCase
-        //    4 : toUpperCaseWithUnderscores
-        int wordTokenType = TBaseConstants.META_VALUE_UNDEFINED;
-
-        public MyWordTokenizer(int wordTokenType) {
-            this.wordTokenType = wordTokenType;
-        }
-
-        @Override
-        protected void startSentence(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    buffer.append(Character.toUpperCase(ch));
-                    break;
-                }
-
-                case 3: {
-                    buffer.append(Character.toUpperCase(ch));
-                    break;
-                }
-
-                case 2: {
-                    buffer.append(Character.toLowerCase(ch));
-                    break;
-                }
-
-                case 1:
-                default: {
-                    buffer.append(Character.toLowerCase(ch));
-                    break;
-                }
-            }
-        }
-
-        @Override
-        protected void startWord(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    if (!isDelimiter(buffer.charAt(buffer.length() - 1))) {
-                        buffer.append(UNDERSCORE);
-                    }
-                    buffer.append(Character.toUpperCase(ch));
-                    break;
-                }
-
-                case 3: {
-                    buffer.append(Character.toUpperCase(ch));
-                    break;
-                }
-
-                case 2: {
-                    if (!isDelimiter(buffer.charAt(buffer.length() - 1))) {
-                        buffer.append(UNDERSCORE);
-                    }
-                    buffer.append(Character.toLowerCase(ch));
-                    break;
-                }
-
-                case 1:
-                default: {
-                    if (!isDelimiter(buffer.charAt(buffer.length() - 1))) {
-                        buffer.append(Character.toUpperCase(ch));
-                    } else {
-                        buffer.append(Character.toLowerCase(ch));
-                    }
-                    break;
-                }
-            }
-        }
-
-        @Override
-        protected void inWord(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    buffer.append(Character.toUpperCase(ch));
-                    break;
-                }
-
-                case 3: {
-                    buffer.append(Character.toLowerCase(ch));
-                    break;
-                }
-
-                case 2: {
-                    buffer.append(Character.toLowerCase(ch));
-                    break;
-                }
-
-                case 1:
-                default: {
-                    buffer.append(Character.toLowerCase(ch));
-                    break;
-                }
-            }
-        }
-
-        @Override
-        protected void startDigitSentence(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 3: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 2: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 1:
-                default: {
-                    buffer.append(ch);
-                    break;
-                }
-            }
-        }
-
-        @Override
-        protected void startDigitWord(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    if (!isDelimiter(buffer.charAt(buffer.length() - 1))) {
-                        buffer.append(UNDERSCORE);
-                    }
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 3: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 2: {
-                    if (!isDelimiter(buffer.charAt(buffer.length() - 1))) {
-                        buffer.append(UNDERSCORE);
-                    }
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 1:
-                default: {
-                    buffer.append(ch);
-                    break;
-                }
-            }
-        }
-
-        @Override
-        protected void inDigitWord(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 3: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 2: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 1:
-                default: {
-                    buffer.append(ch);
-                    break;
-                }
-            }
-        }
-
-        @Override
-        protected void inDelimiter(StringBuilder buffer, char ch) {
-            switch (wordTokenType) {
-                case 4: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 3: {
-                    if (ch != UNDERSCORE) {
-                        buffer.append(ch);
-                    }
-                    break;
-                }
-
-                case 2: {
-                    buffer.append(ch);
-                    break;
-                }
-
-                case 1:
-                default: {
-                    if (ch != UNDERSCORE) {
-                        buffer.append(ch);
-                    }
-                    break;
-                }
-            }
-        }
-    }
-
-
-    private abstract static class WordTokenizer {
-        protected static final char UNDERSCORE = '_';
-
-        /**
-         * Parse sentence。
-         */
-        public String parse(String str) {
-            if (isEmpty(str)) {
-                return str;
-            }
-
-            int length = str.length();
-            StringBuilder buffer = new StringBuilder(length);
-
-            for (int index = 0; index < length; index++) {
-                char ch = str.charAt(index);
-
-                // Ignore white space.
-                if (Character.isWhitespace(ch)) {
-                    continue;
-                }
-
-                // Start with capital letters: UpperCaseWord or TitleCaseWord.
-                if (Character.isUpperCase(ch)) {
-                    int wordIndex = index + 1;
-
-                    while (wordIndex < length) {
-                        char wordChar = str.charAt(wordIndex);
-
-                        if (Character.isUpperCase(wordChar)) {
-                            wordIndex++;
-                        } else if (Character.isLowerCase(wordChar)) {
-                            wordIndex--;
-                            break;
-                        } else {
-                            break;
-                        }
-                    }
-
-                    // 1. wordIndex == length, indicating that the last letter is uppercase
-                    //      and is handled by upperCaseWord.
-                    // 2. wordIndex == index, indicating that index is a titleCaseWord.
-                    // 3. wordIndex > index, indicating that index to wordIndex - 1 is all uppercase,
-                    //      treated with upperCaseWord.
-                    if (wordIndex == length || wordIndex > index) {
-                        index = parseUpperCaseWord(buffer, str, index, wordIndex);
-                    } else {
-                        index = parseTitleCaseWord(buffer, str, index);
-                    }
-
-                    continue;
-                }
-
-                // start with LowerCaseWord。
-                if (Character.isLowerCase(ch)) {
-                    index = parseLowerCaseWord(buffer, str, index);
-                    continue;
-                }
-
-                // start with DigitWord。
-                if (Character.isDigit(ch)) {
-                    index = parseDigitWord(buffer, str, index);
-                    continue;
-                }
-
-                // start with Delimiter。
-                inDelimiter(buffer, ch);
-            }
-
-            return buffer.toString();
-        }
-
-        private int parseUpperCaseWord(StringBuilder buffer, String str, int index, int length) {
-            char ch = str.charAt(index++);
-
-            // The first letter must exist and be capitalized.
-            if (buffer.length() == 0) {
-                startSentence(buffer, ch);
-            } else {
-                startWord(buffer, ch);
-            }
-
-            //Subsequent letters must be lowercase.
-            for (; index < length; index++) {
-                ch = str.charAt(index);
-                inWord(buffer, ch);
-            }
-
-            return index - 1;
-        }
-
-        private int parseLowerCaseWord(StringBuilder buffer, String str, int index) {
-            char ch = str.charAt(index++);
-
-            // The first letter must exist and be lower case.
-            if (buffer.length() == 0) {
-                startSentence(buffer, ch);
-            } else {
-                startWord(buffer, ch);
-            }
-
-            // Subsequent letters must be lowercase.
-            int length = str.length();
-
-            for (; index < length; index++) {
-                ch = str.charAt(index);
-
-                if (Character.isLowerCase(ch)) {
-                    inWord(buffer, ch);
-                } else {
-                    break;
-                }
-            }
-
-            return index - 1;
-        }
-
-        private int parseTitleCaseWord(StringBuilder buffer, String str, int index) {
-            char ch = str.charAt(index++);
-
-            // The first letter must exist and be capitalized.
-            if (buffer.length() == 0) {
-                startSentence(buffer, ch);
-            } else {
-                startWord(buffer, ch);
-            }
-
-            // Subsequent letters must be lowercase.
-            int length = str.length();
-
-            for (; index < length; index++) {
-                ch = str.charAt(index);
-
-                if (Character.isLowerCase(ch)) {
-                    inWord(buffer, ch);
-                } else {
-                    break;
-                }
-            }
-
-            return index - 1;
-        }
-
-        private int parseDigitWord(StringBuilder buffer, String str, int index) {
-            char ch = str.charAt(index++);
-
-            // The first character, must exist and be a number.
-            if (buffer.length() == 0) {
-                startDigitSentence(buffer, ch);
-            } else {
-                startDigitWord(buffer, ch);
-            }
-
-            // Subsequent characters must be numbers.
-            int length = str.length();
-
-            for (; index < length; index++) {
-                ch = str.charAt(index);
-
-                if (Character.isDigit(ch)) {
-                    inDigitWord(buffer, ch);
-                } else {
-                    break;
-                }
-            }
-
-            return index - 1;
-        }
-
-        protected boolean isDelimiter(char ch) {
-            return ((!Character.isUpperCase(ch))
-                    && (!Character.isLowerCase(ch))
-                    && (!Character.isDigit(ch)));
-        }
-
-        protected abstract void startSentence(StringBuilder buffer, char ch);
-
-        protected abstract void startWord(StringBuilder buffer, char ch);
-
-        protected abstract void inWord(StringBuilder buffer, char ch);
-
-        protected abstract void startDigitSentence(StringBuilder buffer, char ch);
-
-        protected abstract void startDigitWord(StringBuilder buffer, char ch);
-
-        protected abstract void inDigitWord(StringBuilder buffer, char ch);
-
-        protected abstract void inDelimiter(StringBuilder buffer, char ch);
-    }
 }
diff --git a/tubemq-server/src/main/assembly/assembly.xml b/tubemq-server/src/main/assembly/assembly.xml
index d640901..ceb3012 100644
--- a/tubemq-server/src/main/assembly/assembly.xml
+++ b/tubemq-server/src/main/assembly/assembly.xml
@@ -37,7 +37,7 @@
                 <include>./resources/**</include>
                 <include>LICENSE</include>
                 <include>NOTICE</include>
-                <include>DISCLAIMER</include>
+                <include>DISCLAIMER-WIP</include>
             </includes>
             <excludes>
                 <exclude>**/src/**</exclude>