Full Code of ponfee/commons-core for AI

master dfd2f363adc9 cached
670 files
3.3 MB
899.9k tokens
6451 symbols
1 requests
Download .txt
Showing preview only (3,708K chars total). Download the full file or copy to clipboard to get everything.
Repository: ponfee/commons-core
Branch: master
Commit: dfd2f363adc9
Files: 670
Total size: 3.3 MB

Directory structure:
gitextract_2bawa1vq/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── build-with-maven.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── LICENSE
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── cn/
    │   │       └── ponfee/
    │   │           └── commons/
    │   │               ├── base/
    │   │               │   ├── Initializable.java
    │   │               │   ├── NoArgMethodInvoker.java
    │   │               │   ├── Predicates.java
    │   │               │   ├── PrimitiveTypes.java
    │   │               │   ├── Releasable.java
    │   │               │   ├── Symbol.java
    │   │               │   ├── TimestampProvider.java
    │   │               │   └── tuple/
    │   │               │       ├── Tuple.java
    │   │               │       ├── Tuple0.java
    │   │               │       ├── Tuple1.java
    │   │               │       ├── Tuple2.java
    │   │               │       ├── Tuple3.java
    │   │               │       ├── Tuple4.java
    │   │               │       ├── Tuple5.java
    │   │               │       ├── Tuple6.java
    │   │               │       ├── Tuple7.java
    │   │               │       ├── Tuple8.java
    │   │               │       └── Tuple9.java
    │   │               ├── collect/
    │   │               │   ├── ArrayHashKey.java
    │   │               │   ├── ByteArrayComparator.java
    │   │               │   ├── ByteArrayTrait.java
    │   │               │   ├── ByteArrayWrapper.java
    │   │               │   ├── Collects.java
    │   │               │   ├── Comparators.java
    │   │               │   ├── DelegatedIntSpliterator.java
    │   │               │   ├── DoubleListViewer.java
    │   │               │   ├── FilterableIterator.java
    │   │               │   ├── ImmutableArrayList.java
    │   │               │   ├── ImmutableHashList.java
    │   │               │   ├── LRUCache.java
    │   │               │   ├── Maps.java
    │   │               │   ├── StreamForker.java
    │   │               │   └── ValueSortedMap.java
    │   │               ├── concurrent/
    │   │               │   ├── AsyncBatchProcessor.java
    │   │               │   ├── AsyncDelayedExecutor.java
    │   │               │   ├── DelayedData.java
    │   │               │   ├── MultithreadExecutors.java
    │   │               │   ├── NamedThreadFactory.java
    │   │               │   ├── SingleThreadShutdownHook.java
    │   │               │   ├── ThreadPoolExecutors.java
    │   │               │   ├── ThreadPoolMonitor.java
    │   │               │   ├── Threads.java
    │   │               │   └── TracedRunnable.java
    │   │               ├── constrain/
    │   │               │   ├── ConstrainParam.java
    │   │               │   ├── Constraint.java
    │   │               │   ├── Constraints.java
    │   │               │   ├── FailFastValidatorFactoryBean.java
    │   │               │   ├── FieldValidator.java
    │   │               │   ├── Jsr303Validator.java
    │   │               │   ├── MethodValidator.java
    │   │               │   └── ParamValidator.java
    │   │               ├── dag/
    │   │               │   ├── DAGEdge.java
    │   │               │   ├── DAGExpressionParser.java
    │   │               │   └── DAGNode.java
    │   │               ├── data/
    │   │               │   ├── DataSourceFactory.java
    │   │               │   ├── DataSourceNaming.java
    │   │               │   ├── DruidDataSourceFactory.java
    │   │               │   ├── MultipleDataSourceAdvisor.java
    │   │               │   ├── MultipleDataSourceAspect.java
    │   │               │   ├── NamedDataSource.java
    │   │               │   └── lookup/
    │   │               │       ├── DataSourceLookup.java
    │   │               │       ├── MultipleCachedDataSource.java
    │   │               │       ├── MultipleDataSourceContext.java
    │   │               │       ├── MultipleFixedDataSource.java
    │   │               │       └── MultipleScalableDataSource.java
    │   │               ├── date/
    │   │               │   ├── CustomLocalDateTimeDeserializer.java
    │   │               │   ├── DatePeriods.java
    │   │               │   ├── Dates.java
    │   │               │   ├── JavaUtilDateFormat.java
    │   │               │   └── LocalDateTimeFormat.java
    │   │               ├── exception/
    │   │               │   ├── BaseCheckedException.java
    │   │               │   ├── BaseUncheckedException.java
    │   │               │   ├── ServerException.java
    │   │               │   ├── Throwables.java
    │   │               │   ├── UnauthorizedException.java
    │   │               │   └── UnimplementedException.java
    │   │               ├── export/
    │   │               │   ├── AbstractCsvExporter.java
    │   │               │   ├── AbstractDataExporter.java
    │   │               │   ├── AbstractSplitExporter.java
    │   │               │   ├── CellStyleOptions.java
    │   │               │   ├── ConsoleExporter.java
    │   │               │   ├── CsvFileExporter.java
    │   │               │   ├── CsvStringExporter.java
    │   │               │   ├── CsvWriteExporter.java
    │   │               │   ├── DataExporter.java
    │   │               │   ├── ExcelExporter.java
    │   │               │   ├── HtmlExporter.java
    │   │               │   ├── SplitCsvFileExporter.java
    │   │               │   ├── SplitExcelExporter.java
    │   │               │   ├── Table.java
    │   │               │   ├── Thead.java
    │   │               │   └── Tmeta.java
    │   │               ├── extract/
    │   │               │   ├── CsvExtractor.java
    │   │               │   ├── DataExtractor.java
    │   │               │   ├── DataExtractorBuilder.java
    │   │               │   ├── ExcelExtractor.java
    │   │               │   ├── ExtractableDataSource.java
    │   │               │   ├── ValidateResult.java
    │   │               │   └── streaming/
    │   │               │       ├── StreamingExcelExtractor.java
    │   │               │       └── xls/
    │   │               │           ├── HSSFStreamingCell.java
    │   │               │           ├── HSSFStreamingReader.java
    │   │               │           ├── HSSFStreamingRow.java
    │   │               │           ├── HSSFStreamingSheet.java
    │   │               │           └── HSSFStreamingWorkbook.java
    │   │               ├── http/
    │   │               │   ├── ContentType.java
    │   │               │   ├── Http.java
    │   │               │   ├── HttpException.java
    │   │               │   ├── HttpParams.java
    │   │               │   ├── HttpRequest.java
    │   │               │   └── HttpStatus.java
    │   │               ├── io/
    │   │               │   ├── ByteOrderMarks.java
    │   │               │   ├── CharsetDetector.java
    │   │               │   ├── Closeables.java
    │   │               │   ├── ExtendedGZIPOutputStream.java
    │   │               │   ├── FileTransformer.java
    │   │               │   ├── Files.java
    │   │               │   ├── GzipProcessor.java
    │   │               │   ├── HumanReadables.java
    │   │               │   ├── PrereadInputStream.java
    │   │               │   ├── StringPrintWriter.java
    │   │               │   ├── WrappedBufferedReader.java
    │   │               │   ├── WrappedBufferedWriter.java
    │   │               │   └── charset/
    │   │               │       ├── BytesDetector.java
    │   │               │       ├── CodepageDetector.java
    │   │               │       ├── JchardetDetector.java
    │   │               │       └── TikaDetector.java
    │   │               ├── jce/
    │   │               │   ├── CryptoProvider.java
    │   │               │   ├── DigestAlgorithms.java
    │   │               │   ├── ECParameters.java
    │   │               │   ├── HmacAlgorithms.java
    │   │               │   ├── Providers.java
    │   │               │   ├── RSACipherPaddings.java
    │   │               │   ├── RSASignAlgorithms.java
    │   │               │   ├── cert/
    │   │               │   │   ├── CertPKCS1Verifier.java
    │   │               │   │   ├── CertPKCS7Verifier.java
    │   │               │   │   ├── CertSignedVerifier.java
    │   │               │   │   ├── ObjectIdentifiers.java
    │   │               │   │   ├── RepairX500Principal.java
    │   │               │   │   ├── X509CertGenerator.java
    │   │               │   │   ├── X509CertInfo.java
    │   │               │   │   └── X509CertUtils.java
    │   │               │   ├── digest/
    │   │               │   │   ├── DigestUtils.java
    │   │               │   │   └── HmacUtils.java
    │   │               │   ├── implementation/
    │   │               │   │   ├── Cryptor.java
    │   │               │   │   ├── Key.java
    │   │               │   │   ├── NoopCryptor.java
    │   │               │   │   ├── digest/
    │   │               │   │   │   ├── RipeMD160Digest.java
    │   │               │   │   │   └── SHA1Digest.java
    │   │               │   │   ├── ecc/
    │   │               │   │   │   ├── ECCryptor.java
    │   │               │   │   │   ├── ECKey.java
    │   │               │   │   │   ├── ECPoint.java
    │   │               │   │   │   ├── EllipticCurve.java
    │   │               │   │   │   └── package-info.java
    │   │               │   │   ├── package-info.java
    │   │               │   │   ├── rsa/
    │   │               │   │   │   ├── AbstractRSACryptor.java
    │   │               │   │   │   ├── RSAHashCryptor.java
    │   │               │   │   │   ├── RSAKey.java
    │   │               │   │   │   ├── RSANoPaddingCryptor.java
    │   │               │   │   │   ├── RSAPKCS1PaddingCryptor.java
    │   │               │   │   │   ├── RSASigner.java
    │   │               │   │   │   └── package-info.java
    │   │               │   │   └── symmetric/
    │   │               │   │       └── RC4.java
    │   │               │   ├── package-info.java
    │   │               │   ├── passwd/
    │   │               │   │   ├── BCrypt.java
    │   │               │   │   ├── Crypt.java
    │   │               │   │   ├── PBKDF2.java
    │   │               │   │   └── SCrypt.java
    │   │               │   ├── pkcs/
    │   │               │   │   ├── CryptoMessageSyntax.java
    │   │               │   │   ├── PKCS1Signature.java
    │   │               │   │   └── PKCS7Signature.java
    │   │               │   ├── security/
    │   │               │   │   ├── DHKeyExchanger.java
    │   │               │   │   ├── DSASigner.java
    │   │               │   │   ├── ECDHKeyExchanger.java
    │   │               │   │   ├── ECDSASigner.java
    │   │               │   │   ├── KeyStoreResolver.java
    │   │               │   │   ├── RSACryptor.java
    │   │               │   │   ├── RSAPrivateKeys.java
    │   │               │   │   └── RSAPublicKeys.java
    │   │               │   ├── sm/
    │   │               │   │   ├── SM2.java
    │   │               │   │   ├── SM2KeyExchanger.java
    │   │               │   │   ├── SM3Digest.java
    │   │               │   │   └── SM4.java
    │   │               │   └── symmetric/
    │   │               │       ├── Algorithm.java
    │   │               │       ├── Mode.java
    │   │               │       ├── PBECryptor.java
    │   │               │       ├── PBECryptorBuilder.java
    │   │               │       ├── Padding.java
    │   │               │       ├── SymmetricCryptor.java
    │   │               │       └── SymmetricCryptorBuilder.java
    │   │               ├── json/
    │   │               │   ├── FastjsonMoney.java
    │   │               │   ├── FastjsonPropertyFilter.java
    │   │               │   ├── FastjsonTypeReferences.java
    │   │               │   ├── JacksonCurrencyUnit.java
    │   │               │   ├── JacksonDate.java
    │   │               │   ├── JacksonMoney.java
    │   │               │   ├── JacksonTypeReferences.java
    │   │               │   └── Jsons.java
    │   │               ├── limit/
    │   │               │   ├── current/
    │   │               │   │   ├── CurrentLimiter.java
    │   │               │   │   └── GuavaCurrentLimiter.java
    │   │               │   └── request/
    │   │               │       ├── ConcurrentMapRequestLimiter.java
    │   │               │       ├── HttpSessionRequestLimiter.java
    │   │               │       ├── RequestLimitException.java
    │   │               │       └── RequestLimiter.java
    │   │               ├── log/
    │   │               │   ├── LogAnnotation.java
    │   │               │   ├── LogInfo.java
    │   │               │   └── LogRecorder.java
    │   │               ├── math/
    │   │               │   ├── FailureRatioActuary.java
    │   │               │   ├── Maths.java
    │   │               │   ├── Numbers.java
    │   │               │   └── WrappedBigDecimal.java
    │   │               ├── model/
    │   │               │   ├── AbstractDataConverter.java
    │   │               │   ├── BaseEntity.java
    │   │               │   ├── CodeMsg.java
    │   │               │   ├── Form.java
    │   │               │   ├── MapDataConverter.java
    │   │               │   ├── Null.java
    │   │               │   ├── Page.java
    │   │               │   ├── PageBoundsResolver.java
    │   │               │   ├── PageHandler.java
    │   │               │   ├── PageParameter.java
    │   │               │   ├── PaginationHtmlBuilder.java
    │   │               │   ├── RemovableTypedKeyValue.java
    │   │               │   ├── RemovableTypedMap.java
    │   │               │   ├── Result.java
    │   │               │   ├── ResultCode.java
    │   │               │   ├── SearchAfter.java
    │   │               │   ├── SortField.java
    │   │               │   ├── SortOrder.java
    │   │               │   ├── ToJsonString.java
    │   │               │   ├── TypedHashMap.java
    │   │               │   ├── TypedKeyValue.java
    │   │               │   ├── TypedLinkedHashMap.java
    │   │               │   ├── TypedLinkedMultiValueMap.java
    │   │               │   ├── TypedMap.java
    │   │               │   ├── TypedMapWrapper.java
    │   │               │   └── TypedParameter.java
    │   │               ├── mybatis/
    │   │               │   ├── MultipleSqlSessionTemplate.java
    │   │               │   ├── PackagesSqlSessionFactoryBean.java
    │   │               │   ├── SqlHelper.java
    │   │               │   └── SqlMapper.java
    │   │               ├── parser/
    │   │               │   ├── DateUDF.java
    │   │               │   └── ELParser.java
    │   │               ├── pdf/
    │   │               │   ├── PdfWaterMark.java
    │   │               │   └── sign/
    │   │               │       ├── PdfSignature.java
    │   │               │       ├── Signer.java
    │   │               │       └── Stamp.java
    │   │               ├── reflect/
    │   │               │   ├── BeanConverts.java
    │   │               │   ├── BeanCopiers.java
    │   │               │   ├── BeanMaps.java
    │   │               │   ├── ClassUtils.java
    │   │               │   ├── Fields.java
    │   │               │   └── GenericUtils.java
    │   │               ├── resource/
    │   │               │   ├── ClassPathResourceLoader.java
    │   │               │   ├── FileSystemResourceLoader.java
    │   │               │   ├── Resource.java
    │   │               │   ├── ResourceLoaderFacade.java
    │   │               │   ├── ResourceScanner.java
    │   │               │   └── WebappResourceLoader.java
    │   │               ├── schema/
    │   │               │   ├── DataColumn.java
    │   │               │   ├── DataStructure.java
    │   │               │   ├── DataStructures.java
    │   │               │   ├── DataTable.java
    │   │               │   ├── DataType.java
    │   │               │   ├── GridTable.java
    │   │               │   ├── NormalStructure.java
    │   │               │   ├── PlainStructure.java
    │   │               │   ├── TableStructure.java
    │   │               │   └── json/
    │   │               │       ├── JsonExtractUtils.java
    │   │               │       ├── JsonId.java
    │   │               │       └── JsonTree.java
    │   │               ├── serial/
    │   │               │   ├── ByteArraySerializer.java
    │   │               │   ├── ByteArrayTraitSerializer.java
    │   │               │   ├── FstSerializer.java
    │   │               │   ├── HessianSerializer.java
    │   │               │   ├── JdkSerializer.java
    │   │               │   ├── JsonSerializer.java
    │   │               │   ├── KryoSerializer.java
    │   │               │   ├── NullSerializer.java
    │   │               │   ├── ProtostuffSerializer.java
    │   │               │   ├── SerializationException.java
    │   │               │   ├── Serializer.java
    │   │               │   ├── StringSerializer.java
    │   │               │   ├── ToStringSerializer.java
    │   │               │   └── WrappedSerializer.java
    │   │               ├── spring/
    │   │               │   ├── BaseController.java
    │   │               │   ├── JdbcTemplateWrapper.java
    │   │               │   ├── LocalizedMethodArgumentResolver.java
    │   │               │   ├── LocalizedMethodArguments.java
    │   │               │   ├── MarkRpcController.java
    │   │               │   ├── PageMethodArgumentResolver.java
    │   │               │   ├── ProxyUtils.java
    │   │               │   ├── RpcController.java
    │   │               │   ├── SpringContextHolder.java
    │   │               │   ├── SpringUtils.java
    │   │               │   ├── TransactionUtils.java
    │   │               │   ├── TypedMapMethodArgumentResolver.java
    │   │               │   ├── YamlProperties.java
    │   │               │   └── YamlPropertySourceFactory.java
    │   │               ├── tree/
    │   │               │   ├── BaseNode.java
    │   │               │   ├── FlatNode.java
    │   │               │   ├── MapTreeTrait.java
    │   │               │   ├── NodeId.java
    │   │               │   ├── NodePath.java
    │   │               │   ├── PlainNode.java
    │   │               │   ├── SiblingNodesComparator.java
    │   │               │   ├── TreeNode.java
    │   │               │   ├── TreeNodeBuilder.java
    │   │               │   ├── TreeTrait.java
    │   │               │   └── print/
    │   │               │       ├── BinaryTreePrinter.java
    │   │               │       ├── BinaryTreePrinterBuilder.java
    │   │               │       └── MultiwayTreePrinter.java
    │   │               ├── util/
    │   │               │   ├── Asserts.java
    │   │               │   ├── Base58.java
    │   │               │   ├── Base64UrlSafe.java
    │   │               │   ├── Bytes.java
    │   │               │   ├── CRC16.java
    │   │               │   ├── Captchas.java
    │   │               │   ├── Colors.java
    │   │               │   ├── ConsistentHash.java
    │   │               │   ├── CurrencyEnum.java
    │   │               │   ├── Enums.java
    │   │               │   ├── ExtendMethodHandles.java
    │   │               │   ├── FailRetryTemplate.java
    │   │               │   ├── Holder.java
    │   │               │   ├── IdcardResolver.java
    │   │               │   ├── ImageUtils.java
    │   │               │   ├── LazyLoader.java
    │   │               │   ├── MavenProjects.java
    │   │               │   ├── MessageFormats.java
    │   │               │   ├── Money.java
    │   │               │   ├── Networks.java
    │   │               │   ├── ObjectUtils.java
    │   │               │   ├── PropertiesUtils.java
    │   │               │   ├── RegexUtils.java
    │   │               │   ├── SecureRandoms.java
    │   │               │   ├── Snowflake.java
    │   │               │   ├── SqlUtils.java
    │   │               │   ├── Strings.java
    │   │               │   ├── SynchronizedCaches.java
    │   │               │   ├── TimingWheel.java
    │   │               │   ├── URLCodes.java
    │   │               │   ├── UuidUtils.java
    │   │               │   ├── Wechats.java
    │   │               │   └── ZipUtils.java
    │   │               ├── web/
    │   │               │   ├── AbstractWebExceptionHandler.java
    │   │               │   ├── DevicePlatform.java
    │   │               │   ├── DeviceType.java
    │   │               │   ├── GlobalExceptionHandler.java
    │   │               │   ├── GlobalExceptionResolver.java
    │   │               │   ├── LiteDevice.java
    │   │               │   ├── LiteDeviceResolver.java
    │   │               │   ├── WebContext.java
    │   │               │   └── WebUtils.java
    │   │               ├── ws/
    │   │               │   ├── JAXWS.java
    │   │               │   └── adapter/
    │   │               │       ├── ListMapAdapter.java
    │   │               │       ├── ListMapNormalAdapter.java
    │   │               │       ├── MapAdapter.java
    │   │               │       ├── MapNormalAdapter.java
    │   │               │       ├── MarshalJsonAdapter.java
    │   │               │       ├── MarshalJsonResult.java
    │   │               │       ├── MarshalJsonXml.java
    │   │               │       ├── ResultDataJsonAdapter.java
    │   │               │       ├── ResultDataJsonPageAdapter.java
    │   │               │       ├── ResultListAdapter.java
    │   │               │       ├── ResultListMapAdapter.java
    │   │               │       ├── ResultListMapNormalAdapter.java
    │   │               │       ├── ResultListObjectAdapter.java
    │   │               │       ├── ResultListObjectArrayAdapter.java
    │   │               │       ├── ResultListStringAdapter.java
    │   │               │       ├── ResultMapAdapter.java
    │   │               │       ├── ResultMapNormalAdapter.java
    │   │               │       ├── ResultPageAdapter.java
    │   │               │       ├── ResultPageMapAdapter.java
    │   │               │       ├── ResultPageMapAdapter.java.bak
    │   │               │       ├── ResultPageMapNormalAdapter.java
    │   │               │       ├── ResultPageObjectAdapter.java
    │   │               │       ├── ResultPageObjectArrayAdapter.java
    │   │               │       ├── ResultSetAdapter.java
    │   │               │       ├── ResultSetStringAdapter.java
    │   │               │       ├── model/
    │   │               │       │   ├── ArrayItem.java
    │   │               │       │   ├── MapEntry.java
    │   │               │       │   ├── MapItem.java
    │   │               │       │   ├── MapItemArray.java
    │   │               │       │   ├── TransitPage.java
    │   │               │       │   └── package-info.java
    │   │               │       └── package-info.java
    │   │               └── xml/
    │   │                   ├── SimpleXmlHandler.java
    │   │                   ├── XmlException.java
    │   │                   ├── XmlMap.java
    │   │                   ├── XmlReader.java
    │   │                   └── XmlWriter.java
    │   └── resources/
    │       ├── log4j2.xml.template
    │       └── mybatis-conf.xml.template
    └── test/
        ├── java/
        │   ├── cn/
        │   │   └── ponfee/
        │   │       └── commons/
        │   │           ├── Options.java
        │   │           ├── SpringBaseTest.java
        │   │           ├── SpringBootTest.java
        │   │           ├── WebServiceCxfTest.java
        │   │           ├── WebServiceJaxTest.java
        │   │           ├── base/
        │   │           │   ├── MethodInvokerTest.java
        │   │           │   └── TupleTest.java
        │   │           ├── boolm/
        │   │           │   ├── GuavaBloomFilterTest.java
        │   │           │   ├── JdkBloomFilter.java
        │   │           │   ├── RedisBloomFilterTest.java
        │   │           │   └── VisitedFrontier.java
        │   │           ├── cache/
        │   │           │   ├── Cache.java
        │   │           │   ├── CacheBuilder.java
        │   │           │   ├── CacheValue.java
        │   │           │   ├── RemovalListener.java
        │   │           │   └── RemovalNotification.java
        │   │           ├── collects/
        │   │           │   ├── AbstractArrayList.java
        │   │           │   ├── ByteArrayList.java
        │   │           │   ├── ByteArrayListTest.java
        │   │           │   ├── DoubleListViewerTest.java
        │   │           │   ├── ImmutableArrayList1.java
        │   │           │   ├── ImmutableArrayListTest.java
        │   │           │   ├── IntArrayList.java
        │   │           │   ├── ListTest.java
        │   │           │   └── LongArrayList.java
        │   │           ├── concurrent/
        │   │           │   ├── ThreadPoolTest.java
        │   │           │   └── ThreadPoolTestUtils.java
        │   │           ├── dag/
        │   │           │   └── DAGExpressionParserTest.java
        │   │           ├── data/
        │   │           │   ├── ExtendedDruidPasswordCallback.java
        │   │           │   └── JSONExtractUtilsTest.java
        │   │           ├── date/
        │   │           │   ├── DateFormatTest.java
        │   │           │   ├── DatePeriodCalculatorTest.java
        │   │           │   ├── DatePeriodsTest.java
        │   │           │   ├── DatesTest.java
        │   │           │   ├── JavaUtilDateFormatTest.java
        │   │           │   └── LocalDateTimeFormatTest.java
        │   │           ├── event/
        │   │           │   └── EventBusTest.java
        │   │           ├── exception/
        │   │           │   └── ThrowablesTest.java
        │   │           ├── innerclass/
        │   │           │   ├── MyInterface.java
        │   │           │   └── TryUsingAnonymousClass.java
        │   │           ├── io/
        │   │           │   ├── BeforeReadInputStreamTest.java
        │   │           │   ├── CopyrightTest.java
        │   │           │   ├── FileTransformerTest.java
        │   │           │   ├── FileTypeDetector.java
        │   │           │   ├── FilesTest.java
        │   │           │   ├── WindowsBomTest.java
        │   │           │   ├── WrappedBufferedReaderTest.java
        │   │           │   └── file/
        │   │           │       ├── ASCII.txt
        │   │           │       ├── Big5.txt
        │   │           │       ├── EUC-KR.txt
        │   │           │       ├── GB18030.txt
        │   │           │       ├── GB2312.txt
        │   │           │       ├── GBK.txt
        │   │           │       ├── KOI8-R.txt
        │   │           │       ├── Shift_JIS.txt
        │   │           │       ├── UTF-8-BOM.txt
        │   │           │       └── UTF-8.txt
        │   │           ├── jce/
        │   │           │   ├── DesgitTest.java
        │   │           │   ├── PBECryptorTest.java
        │   │           │   ├── PasswdTest.java
        │   │           │   ├── SCryptTester.java
        │   │           │   └── security/
        │   │           │       ├── DHKeyExchangerTest.java
        │   │           │       ├── DSASignerTest.java
        │   │           │       ├── ECDHKeyExchangerTest.java
        │   │           │       ├── ECDSASignerTest.java
        │   │           │       └── RSAPrivateKeysTest.java
        │   │           ├── json/
        │   │           │   ├── BooleanPojoTest.java
        │   │           │   ├── FastJsonUtils.java
        │   │           │   ├── JacksonIgnore.java
        │   │           │   └── JsonsTest.java
        │   │           ├── loadbalance/
        │   │           │   ├── AbstractLoadBalance.java
        │   │           │   ├── HashedLoadBalance.java
        │   │           │   ├── LeastActiveLoadBalance.java
        │   │           │   ├── RandomLoadBalance.java
        │   │           │   ├── RoundRobinLoadBalance.java
        │   │           │   ├── WeightRandomLoadBalance.java
        │   │           │   ├── WeightRoundRobinLoadBalance.java
        │   │           │   └── package-info.java
        │   │           ├── log/
        │   │           │   ├── JclLogger.java
        │   │           │   ├── JulLogger.java
        │   │           │   ├── Log4jLogger.java
        │   │           │   └── Slf4jLogger.java
        │   │           ├── model/
        │   │           │   └── ParamsTest.java
        │   │           ├── mybatis/
        │   │           │   └── SQLMapperTest.java
        │   │           ├── reflect/
        │   │           │   ├── ClassA.java
        │   │           │   ├── FieldsTest.java
        │   │           │   ├── GenericExtendsTest.java
        │   │           │   ├── GenericTest.java
        │   │           │   └── GenericTest2.java
        │   │           ├── serial/
        │   │           │   ├── JacksonObjectMapperTest.java
        │   │           │   ├── PersonProtobuf.java
        │   │           │   ├── ProtobufClient.java
        │   │           │   ├── ProtobufServer.java
        │   │           │   ├── SerializerTester.java
        │   │           │   └── person.proto
        │   │           └── util/
        │   │               ├── BitSetTest.java
        │   │               ├── BloomFilterTest.java
        │   │               ├── ELParserTest.java
        │   │               ├── EscapeRegexTest.java
        │   │               ├── FibonacciTest.java
        │   │               ├── ForEachTest.java
        │   │               ├── IdcardResolverTest.java
        │   │               ├── MathsTest.java
        │   │               ├── MoneyTest.java
        │   │               ├── ObjectUtilsTest.java
        │   │               ├── ProxyTest.java
        │   │               ├── RegexUtilsTest.java
        │   │               ├── SqlUtilsTest.java
        │   │               ├── StreamForkerTest.java
        │   │               ├── StringsTest.java
        │   │               └── TestSerialize.java
        │   └── test/
        │       ├── Cat.java
        │       ├── CsvWrappedCharTest.java
        │       ├── CustomClassLoader.java
        │       ├── GuavaCacheRefreshTest.java
        │       ├── Test1.java
        │       ├── Test2.java
        │       ├── Test3.java
        │       ├── TestBean.java
        │       ├── TestSynthetic.java
        │       ├── ThrowEggsTest.java
        │       ├── concurrent/
        │       │   ├── AsnycBatchProcessorTest.java
        │       │   ├── ForkJoinPoolTest1.java
        │       │   ├── ForkJoinPoolTest2.java
        │       │   ├── InheritableThreadLocalTest.java
        │       │   ├── InheritableThreadLocalTest2.java
        │       │   ├── ReadWriteLock.java
        │       │   ├── TestThread.java
        │       │   ├── TheadPoolExecTester.java
        │       │   └── TtlTest.java
        │       ├── constraint/
        │       │   └── TestConstraint.java
        │       ├── disruptor/
        │       │   ├── InParkingDataEvent.java
        │       │   ├── Main.java
        │       │   ├── ParkingDataInDbHandler.java
        │       │   ├── ParkingDataSmsHandler.java
        │       │   ├── ParkingDataToKafkaHandler.java
        │       │   └── Sequence.java
        │       ├── elasticsearch/
        │       │   ├── CateEsDaoImpl.java
        │       │   ├── EsClientFactory.java
        │       │   ├── EsDbUtils.java
        │       │   └── EsQueryObj.java
        │       ├── export/
        │       │   ├── ConsoleExportTest.java
        │       │   ├── ExportTester.java
        │       │   └── ExportTester2.java
        │       ├── extract/
        │       │   ├── ExampleEventUserModel.java
        │       │   ├── ExcelExtractorTest.java
        │       │   ├── TestHSSFStreaming.java
        │       │   ├── XLSEventTest.java
        │       │   ├── XLSX2CSV.java
        │       │   ├── XLSXEventTest.java
        │       │   ├── advices_export.xls
        │       │   └── writeTest2.xls
        │       ├── http/
        │       │   ├── HttpClientUtils.java
        │       │   ├── HttpParamsTest.java
        │       │   ├── HttpPostTester.java
        │       │   ├── HttpTester.java
        │       │   ├── NewApiTester.java
        │       │   ├── OldApiTester.java
        │       │   ├── TestHttpUploadFile.java
        │       │   ├── TestJsoup.java
        │       │   ├── TestOpenApi.java
        │       │   ├── WSClientTester.java
        │       │   ├── jdk/
        │       │   │   ├── HTTPServerSample.java
        │       │   │   └── WSProvider.java
        │       │   └── ssl/
        │       │       ├── HttpsCert.java
        │       │       ├── HttpsClient.java
        │       │       ├── SSLClient.java
        │       │       └── SSLServer.java
        │       ├── jce/
        │       │   ├── Argon2Test.java
        │       │   ├── CryptoProviderTest.java
        │       │   ├── DigestTest.java
        │       │   ├── Paillier.java
        │       │   ├── cert/
        │       │   │   ├── CryptoMessageSyntaxTester.java
        │       │   │   ├── KeyStoreResolverTester.java
        │       │   │   ├── SM2CertTest.java
        │       │   │   ├── TestPem.java
        │       │   │   ├── X500NameTest.java
        │       │   │   └── X509CertUtilsTester.java
        │       │   ├── crypto/
        │       │   │   ├── EncryptTester.java
        │       │   │   └── RSACryptoTester.java
        │       │   ├── demo/
        │       │   │   ├── CertService.java
        │       │   │   ├── CreateCert.java
        │       │   │   └── GenX509Cert.java
        │       │   ├── ecc0/
        │       │   │   ├── CryptoInputStream.java
        │       │   │   ├── CryptoOutputStream.java
        │       │   │   ├── ECCryptor.java.bak
        │       │   │   ├── ECCryptorTest.java
        │       │   │   ├── EllipticCurveTest.java
        │       │   │   ├── Login.java
        │       │   │   ├── Main.java
        │       │   │   ├── Screen.java
        │       │   │   └── View.java
        │       │   ├── ecc2/
        │       │   │   ├── BaseConvert.java
        │       │   │   ├── CurveParameters.java
        │       │   │   ├── PrivateKey.java
        │       │   │   ├── PrivateKeyTest.java
        │       │   │   ├── PublicKey.java
        │       │   │   ├── PublicKeyTest.java
        │       │   │   ├── UnsupportedBaseException.java
        │       │   │   └── Utils.java
        │       │   ├── rsa/
        │       │   │   ├── RSAKeyTest.java
        │       │   │   ├── RSASignerTest.java
        │       │   │   └── RSAryptorTest.java
        │       │   ├── sha1/
        │       │   │   └── SHA1BrokenTest.java
        │       │   └── sm/
        │       │       ├── SM2KeyExchangeTest.java
        │       │       ├── SM2Test.java
        │       │       ├── SM3DigestTest.java
        │       │       └── SM4Test.java
        │       ├── log4j/
        │       │   └── TestLog4j.java
        │       ├── model/
        │       │   ├── PageInfo.java
        │       │   └── PagePlugin.java
        │       ├── pdf/
        │       │   ├── ItextUtil.java
        │       │   ├── PdfP7Sign.java
        │       │   └── TestPdfSign.java
        │       ├── qrcode/
        │       │   ├── Qrcode.java
        │       │   └── QrcodeTest.java
        │       ├── reflect/
        │       │   ├── ClassUtilsTest.java
        │       │   └── ProxyTest.java
        │       ├── swing/
        │       │   ├── SM2Crypto.java
        │       │   └── WebBrowser.java
        │       ├── tree/
        │       │   ├── NodePathSerialTest.java
        │       │   ├── NodePathTest.java
        │       │   ├── NodeTreeTest.java
        │       │   └── TreeNodePrinterTest.java
        │       └── utils/
        │           ├── AtomicStampedReferenceTest.java
        │           ├── Base58Test.java
        │           ├── Base64.java
        │           ├── BytesTest.java
        │           ├── FloatContent.java
        │           ├── GuavaCacheRefreshTest.java
        │           ├── GuavaCacheTest.java
        │           ├── Java8DateTimeTester.java
        │           ├── MapToObjTest.java
        │           ├── NumbersTest.java
        │           ├── ObjectUtilsTest.java
        │           ├── OptionalTest.java
        │           ├── ProjectFileUtilsTester.java
        │           ├── RepeatableAnn.java
        │           ├── SimpleXmlHandlerTest.java
        │           ├── TempTest.java
        │           ├── Test1.java
        │           ├── Test2.java
        │           ├── TestBeanCopy.java
        │           ├── TestCache.java
        │           ├── TestCost.java
        │           ├── TestInterrupt.java
        │           ├── TestLock.java
        │           ├── TestXmlReader.java
        │           └── Ztzip.java
        └── resources/
            ├── abc.xlsx
            ├── ca.pfx
            ├── cacert.pem
            ├── cas_test.pfx
            ├── copy-right.txt
            ├── csv.csv
            ├── log/
            │   ├── log4j.properties
            │   ├── log4j.properties.bak
            │   ├── log4j2.xml
            │   └── logback.xml
            ├── signer.xsd
            ├── signers.xml
            ├── sm2-1.cer
            ├── sm2-2.cer
            ├── sm2-crypto.cer
            ├── sm2-root.cer
            ├── subject.pfx
            └── test.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# http://editorconfig.org

root = true

[*]
indent_style = space
indent_size = 4
charset = utf-8
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true

[*.{json,yml,yaml,xml}]
indent_size = 2

[*.md]
trim_trailing_whitespace = false


================================================
FILE: .github/workflows/build-with-maven.yml
================================================
# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven

name: build-with-maven

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "master" ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 8
      uses: actions/setup-java@v3
      with:
        java-version: '8'
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven
      run: ./mvnw clean package -DskipTests -Dcheckstyle.skip=true -Dmaven.javadoc.skip=true -B -V -U --file pom.xml


================================================
FILE: .gitignore
================================================
# Eclipse
/**/.classpath
/**/.project
/**/.settings/
/**/.myeclipse/

# Intellij
/**/.idea/
/**/*.iml
/**/*.iws
/**/*.ipr

# NetBeans
nbproject/private/
nbbuild/
nbdist/
/**/.nb-gradle/

# Mac
/**/.DS_Store

# Maven
/**/target/

# Gradle
/**/.gradle/

# SBT: Simple Build Tool. Is a build tool for Scala, Java, and more.
dist/*
target/
lib_managed/
src_managed/
project/boot/
project/plugins/project/
.history
.cache
.lib/

# STS: Spring Tool Suit
/**/.apt_generated
/**/.factorypath
/**/.springBeans

# Webapp
/**/src/main/webapp/WEB-INF/classes/

# Others
/**/.svn/
/**/.externalToolBuilders/
/**/.recommenders/
/**/.metadata/
/**/node_modules/
out/
build/
bin/
logs/
dist/

# rebel.xml
/**/rebel.xml
/**/.cache-main
/**/.cache-tests
/**/dependency-reduced-pom.xml


================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
# 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
#
#   https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright (c) 2017-2023 Ponfee

   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.


================================================
FILE: README.md
================================================
[![Blog](https://img.shields.io/badge/blog-@Ponfee-informational.svg?logo=Pelican)](http://www.ponfee.cn)
[![License](https://img.shields.io/badge/license-Apache--2.0-green.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
[![JDK](https://img.shields.io/badge/jdk-8+-green.svg)](https://www.oracle.com/java/technologies/downloads/#java8)
[![Build status](https://github.com/ponfee/commons-core/workflows/build-with-maven/badge.svg)](https://github.com/ponfee/commons-core/actions)
[![Maven Central](https://img.shields.io/badge/maven--central-1.4-orange.svg?style=plastic&logo=apachemaven)](https://central.sonatype.com/artifact/cn.ponfee/commons-core/1.4)

# Commons Core

A commons java tool lib

## ⬇️ [Download From Maven Central](https://central.sonatype.com/artifact/cn.ponfee/commons-core/1.4)

```xml
<dependency>
  <groupId>cn.ponfee</groupId>
  <artifactId>commons-core</artifactId>
  <version>1.4</version>
</dependency>
```

## 🔄 Build From Source

```bash
./mvnw clean package -DskipTests -Dcheckstyle.skip=true -U
```

## 🛠️ Functions
| **function** |                                           **description**                                                |
| ------------ | -------------------------------------------------------------------------------------------------------- |
| base         | 基础类:Tuple数据类型、原始与包装类型等                                                                        |
| collect      | 集合工具类                                                                                                 |
| concurrent   | 并发相关的工具类:异步批处理、延时消费、线程池创建与监控等                                                         |
| constrain    | 方法参数、实体字段等数据校验                                                                                  |
| data         | 多数据源组件,动态增加数据源                                                                                  |
| date         | 时间工具类(支持各种时间格式的解析,时间周期处理)                                                                 |
| exception    | 异常工具类                                                                                                 |
| export       | 数据导出为Excel(支持复杂表头及切分多个文件)、HTML(支持复杂表头)、CSV(支持切分多个文件)、Console(类似SQL命令行查询结果)  |
| extract      | 数据文件导入:支持XLS/XLSX/CSV格式的文件,支持大文件                                                            |
| http         | HTTP工具类(轻量级,不依赖第三方库)                                                                            |
| io           | IO操作工具类(如文件UTF编码BOM头处理、文件编码探测、文件编码转换及内容替换、数字格式化为KB/MB/GB/TB/PB、Gzip等)         |
| jce          | 加解密工具(对称加解密、非对称加解密、签名/验签、数字信封、ECC算法、哈希算法、国密算法、根证创建与CA证书签发、密码处理等)    |
| model        | 数据模型相关公用类(带类型的Map操作、定义返回结果的结构体、分页实体等)                                               |
| reflect      | 反射工具类(泛型解析、实体与Map互转、实体字段拷贝、实体字段获取、方法调用、Unsafe工具等)                               |
| schema       | 表格数据结构定义,任意JSON格式数据转二维表等                                                                    |
| serial       | 序列化工具类(JDK、JSON、FST、Hessian、Kryo、Protostuff)                                                      |
| spring       | Spring相关工具类                                                                                           |
| tree         | 强大的树型数据结构组件,构建复杂表头的基础(多路树构造及解析、类似`tree -N`命令的多路树打印、二叉树打印等)                |
| util         | 常用工具类(Zip、时间轮、Snowflake id生成算法、Money/币种、一致性Hash算法、Base58编码、高效的字节处理等)              |


================================================
FILE: mvnw
================================================
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------

# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.1.1
#
# Required ENV vars:
# ------------------
#   JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
#     e.g. to debug Maven itself, use
#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------

if [ -z "$MAVEN_SKIP_RC" ] ; then

  if [ -f /usr/local/etc/mavenrc ] ; then
    . /usr/local/etc/mavenrc
  fi

  if [ -f /etc/mavenrc ] ; then
    . /etc/mavenrc
  fi

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

fi

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
  CYGWIN*) cygwin=true ;;
  MINGW*) mingw=true;;
  Darwin*) darwin=true
    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
    if [ -z "$JAVA_HOME" ]; then
      if [ -x "/usr/libexec/java_home" ]; then
        JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME
      else
        JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
      fi
    fi
    ;;
esac

if [ -z "$JAVA_HOME" ] ; then
  if [ -r /etc/gentoo-release ] ; then
    JAVA_HOME=`java-config --jre-home`
  fi
fi

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi

# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi

if [ -z "$JAVA_HOME" ]; then
  javaExecutable="`which javac`"
  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
    # readlink(1) is not available as standard on Solaris 10.
    readLink=`which readlink`
    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
      if $darwin ; then
        javaHome="`dirname \"$javaExecutable\"`"
        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
      else
        javaExecutable="`readlink -f \"$javaExecutable\"`"
      fi
      javaHome="`dirname \"$javaExecutable\"`"
      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
      JAVA_HOME="$javaHome"
      export JAVA_HOME
    fi
  fi
fi

if [ -z "$JAVACMD" ] ; then
  if [ -n "$JAVA_HOME"  ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
      # IBM's JDK on AIX uses strange locations for the executables
      JAVACMD="$JAVA_HOME/jre/sh/java"
    else
      JAVACMD="$JAVA_HOME/bin/java"
    fi
  else
    JAVACMD="`\\unset -f command; \\command -v java`"
  fi
fi

if [ ! -x "$JAVACMD" ] ; then
  echo "Error: JAVA_HOME is not defined correctly." >&2
  echo "  We cannot execute $JAVACMD" >&2
  exit 1
fi

if [ -z "$JAVA_HOME" ] ; then
  echo "Warning: JAVA_HOME environment variable is not set."
fi

# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
  if [ -z "$1" ]
  then
    echo "Path not specified to find_maven_basedir"
    return 1
  fi

  basedir="$1"
  wdir="$1"
  while [ "$wdir" != '/' ] ; do
    if [ -d "$wdir"/.mvn ] ; then
      basedir=$wdir
      break
    fi
    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
    if [ -d "${wdir}" ]; then
      wdir=`cd "$wdir/.."; pwd`
    fi
    # end of workaround
  done
  printf '%s' "$(cd "$basedir"; pwd)"
}

# concatenates all lines of a file
concat_lines() {
  if [ -f "$1" ]; then
    echo "$(tr -s '\n' ' ' < "$1")"
  fi
}

BASE_DIR=$(find_maven_basedir "$(dirname $0)")
if [ -z "$BASE_DIR" ]; then
  exit 1;
fi

MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
if [ "$MVNW_VERBOSE" = true ]; then
  echo $MAVEN_PROJECTBASEDIR
fi

##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
    if [ "$MVNW_VERBOSE" = true ]; then
      echo "Found .mvn/wrapper/maven-wrapper.jar"
    fi
else
    if [ "$MVNW_VERBOSE" = true ]; then
      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
    fi
    if [ -n "$MVNW_REPOURL" ]; then
      wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
    else
      wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
    fi
    while IFS="=" read key value; do
      case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;;
      esac
    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
    if [ "$MVNW_VERBOSE" = true ]; then
      echo "Downloading from: $wrapperUrl"
    fi
    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
    if $cygwin; then
      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
    fi

    if command -v wget > /dev/null; then
        QUIET="--quiet"
        if [ "$MVNW_VERBOSE" = true ]; then
          echo "Found wget ... using wget"
          QUIET=""
        fi
        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
            wget $QUIET "$wrapperUrl" -O "$wrapperJarPath"
        else
            wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath"
        fi
        [ $? -eq 0 ] || rm -f "$wrapperJarPath"
    elif command -v curl > /dev/null; then
        QUIET="--silent"
        if [ "$MVNW_VERBOSE" = true ]; then
          echo "Found curl ... using curl"
          QUIET=""
        fi
        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
            curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L
        else
            curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L
        fi
        [ $? -eq 0 ] || rm -f "$wrapperJarPath"
    else
        if [ "$MVNW_VERBOSE" = true ]; then
          echo "Falling back to using Java to download"
        fi
        javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class"
        # For Cygwin, switch paths to Windows format before running javac
        if $cygwin; then
          javaSource=`cygpath --path --windows "$javaSource"`
          javaClass=`cygpath --path --windows "$javaClass"`
        fi
        if [ -e "$javaSource" ]; then
            if [ ! -e "$javaClass" ]; then
                if [ "$MVNW_VERBOSE" = true ]; then
                  echo " - Compiling MavenWrapperDownloader.java ..."
                fi
                # Compiling the Java class
                ("$JAVA_HOME/bin/javac" "$javaSource")
            fi
            if [ -e "$javaClass" ]; then
                # Running the downloader
                if [ "$MVNW_VERBOSE" = true ]; then
                  echo " - Running MavenWrapperDownloader.java ..."
                fi
                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
            fi
        fi
    fi
fi
##########################################################################################
# End of extension
##########################################################################################

MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"

# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
  [ -n "$JAVA_HOME" ] &&
    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
  [ -n "$CLASSPATH" ] &&
    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi

# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS

WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain

exec "$JAVACMD" \
  $MAVEN_OPTS \
  $MAVEN_DEBUG_OPTS \
  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"


================================================
FILE: mvnw.cmd
================================================
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements.  See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership.  The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License.  You may obtain a copy of the License at
@REM
@REM    http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied.  See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------

@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.1.1
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM     e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------

@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%

@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")

@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre

@setlocal

set ERROR_CODE=0

@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal

@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome

echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error

:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init

echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error

@REM ==== END VALIDATION ====

:init

@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.

set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir

set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir

:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir

:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"

:endDetectBaseDir

IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig

@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%

:endReadAdditionalConfig

SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain

set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"

FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
    IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)

@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
    if "%MVNW_VERBOSE%" == "true" (
        echo Found %WRAPPER_JAR%
    )
) else (
    if not "%MVNW_REPOURL%" == "" (
        SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar"
    )
    if "%MVNW_VERBOSE%" == "true" (
        echo Couldn't find %WRAPPER_JAR%, downloading it ...
        echo Downloading from: %WRAPPER_URL%
    )

    powershell -Command "&{"^
		"$webclient = new-object System.Net.WebClient;"^
		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
		"}"^
		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
		"}"
    if "%MVNW_VERBOSE%" == "true" (
        echo Finished downloading %WRAPPER_JAR%
    )
)
@REM End of extension

@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*

%MAVEN_JAVA_EXE% ^
  %JVM_CONFIG_MAVEN_PROPS% ^
  %MAVEN_OPTS% ^
  %MAVEN_DEBUG_OPTS% ^
  -classpath %WRAPPER_JAR% ^
  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end

:error
set ERROR_CODE=1

:end
@endlocal & set ERROR_CODE=%ERROR_CODE%

if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost

@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause

if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%

cmd /C exit /B %ERROR_CODE%


================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.ponfee</groupId>
  <artifactId>commons-core</artifactId>
  <version>1.5-SNAPSHOT</version>

  <!-- Maven:
    > deploy: mvn -Drevision=_ versions:set -DnewVersion=1.4-SNAPSHOT && mvn clean deploy -Prelease -DskipTests -Dcheckstyle.skip=true -U

    > maven wrapper:https://maven.apache.org/wrapper/index.html
    > 解决maven-wrapper的版本问题:生成时需要删除掉“$MAVEN_HOME/conf/settings.xml”文件中配置的mirror
    > 1)Install(会生成.mvn文件夹、mvnw和mvnw.cmd脚本):mvn wrapper:wrapper -Dmaven=3.6.3
    > 2)Usage:
    >   2.1)Linux:./mvnw clean install -Dmaven.test.skip=true
    >   2.2)Windows:mvnw.cmd clean install -Dmaven.test.skip=true
    > 依赖处理:1、最短路径原则;2、最先声明原则;
    > 查看有效的pom:mvn help:effective-pom

    > javac: 不加“-g”则默认为“-g:source,lines”
    >   lines:字节码文件中对应源码的行号(Line number debugging information)
    >   vars:字节码文件中对应源码的局部变量的符号表(Local variable debugging information)
    >   source:将该类文件对应的源文件名称写进字节码中(Source file debugging information,针对非public修饰类场景)
    >   -g                     生成所有调试信息
    >   -g:none                不生成任何调试信息
    >   -g:{lines,vars,source} 只生成某些调试信息
    >   -source: version
    >   -target: version

    > Alibaba P3C手册:https://github.com/alibaba/p3c
    > sonar参考文章:https://www.jianshu.com/p/68a3ed571314
  -->

  <!-- Logging:
    slf4j-ext.jar         —>                                  扩展功能
    slf4j-nop.jar         —>    (slf4j    —>  null)           slf4j的空接口输出绑定,丢弃所有日志输出
    slf4j-simple.jar      —>    (slf4j    —>  slf4j-simple)   slf4j的自带的简单日志输出实现
    slf4j-android.jar     —>    (android  —>  slf4j)          将android环境下的日志,桥接到slf4j
    log4j-1.2-api.jar     —>    (log4j    —>  log4j2)         将log4j的日志转接到log4j2日志框架

    slf4j的具体实现:slf4j-simple、logback

    slf4j adapter to impl(LogImpl):http://www.slf4j.org/manual.html
      log4j  : slf4j-api -> org.slf4j:slf4j-log4j12, log4j:log4j
      log4j2 : slf4j-api -> org.apache.logging.log4j:(log4j-slf4j-impl, log4j-api, log4j-core)
      logback: slf4j-api -> ch.qos.logback:(logback-classic, logback-core)
      jcl    : slf4j-api -> org.slf4j:slf4j-jcl, commons-logging:commons-logging
      jul    : slf4j-api -> org.slf4j:slf4j-jdk14, java.util.logging

    log api bridge to slf4j:http://www.slf4j.org/legacy.html
      log4j            : log4j-over-slf4j(log4j api)  -> slf4j-api -> LogImpl
      log4j2           : log4j-to-slf4j  (log4j2 api) -> slf4j-api -> LogImpl
      logback          : logback就是slf4j的原生实现(即logback的api就是slf4j-api)
      commons-logging  : jcl-over-slf4j  (jcl api)    -> slf4j-api -> LogImpl
      java.util.logging: jul-to-slf4j    (jul api)    -> slf4j-api -> LogImpl(SLF4JBridgeHandler.removeHandlersForRootLogger();SLF4JBridgeHandler.install();)
      osgi             : osgi-over-slf4j (osgi api)   —> slf4j-api -> LogImpl(将osgi环境下的日志,桥接到slf4j)
   -->

  <name>Commons core</name>
  <description>A commons tool java lib</description>
  <url>https://github.com/ponfee/commons-core</url>
  <licenses>
    <license>
      <name>The Apache Software License, Version 2.0</name>
      <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
    </license>
  </licenses>
  <developers>
    <developer>
      <name>Ponfee</name>
      <email>ponfee.cn@gmail.com</email>
      <organization>ponfee.cn</organization>
      <organizationUrl>http://www.ponfee.cn/</organizationUrl>
    </developer>
  </developers>
  <scm>
    <connection>scm:git:https://github.com/ponfee/commons-core.git</connection>
    <developerConnection>scm:git:https://github.com/ponfee/commons-core.git</developerConnection>
    <url>https://github.com/ponfee/commons-core</url>
    <tag>HEAD</tag>
  </scm>
  <!-- 根据version中是否带有“-SNAPSHOT”来判断是分发到snapshots库还是releases库 -->
  <distributionManagement>
    <!-- 添加到maven的安装目录的settings.xml中
    <servers>
      <server>
        <id>ossrh</id>
        <username>username</username>
        <password>password</password>
      </server>
    </servers> -->
    <snapshotRepository>
      <id>ossrh</id>
      <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>ossrh</id>
      <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>

  <properties>
    <file.encoding>UTF-8</file.encoding>
    <project.build.sourceEncoding>${file.encoding}</project.build.sourceEncoding>
    <project.reporting.outputEncoding>${file.encoding}</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.compilerVersion>${java.version}</maven.compiler.compilerVersion>

    <spring-framework.version>5.3.24</spring-framework.version>
    <slf4j.version>1.7.36</slf4j.version>
    <log4j2.version>2.19.0</log4j2.version>
    <bouncycastle.version>1.72</bouncycastle.version>
    <jackson.version>2.14.1</jackson.version>
  </properties>

  <profiles>
    <!-- 1、查看处于激活状态的profile:mvn help:active-profiles
         2、查看计算机上的这些OS属性:mvn enforcer:display-info
         3、查看系统属性:mvn help:system | grep "os\."
      -->
    <profile>
      <id>unix</id>
      <activation>
        <os><family>unix</family></os>
      </activation>
      <properties>
        <system.separator>:</system.separator>
      </properties>
    </profile>
    <profile>
      <id>windows</id>
      <activation>
        <os><family>windows</family></os>
      </activation>
      <properties>
        <system.separator>;</system.separator>
      </properties>
    </profile>
    <profile>
      <!-- mvn clean package -Pdevelop -->
      <id>develop</id>
      <!--<activation>前面加了OS的profile后,此处的默认设置无效
        <activeByDefault>true</activeByDefault>
      </activation>-->
      <properties>
      </properties>
    </profile>
    <profile>
      <!-- mvn clean deploy -Prelease -->
      <id>release</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.4.1</version>
            <executions>
              <execution>
                <id>attach-javadocs</id>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <doclint>none</doclint>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>3.0.1</version>
            <executions>
              <execution>
                <id>sign-artifacts</id>
                <phase>verify</phase>
                <goals>
                  <goal>sign</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-bom</artifactId>
        <version>2.6.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
      <optional>true</optional>
      <scope>provided</scope>
    </dependency>

    <!-- ==============================logger============================== -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>

    <!-- adapter to slf4j-api -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!-- log4j2:当使用log4j2为日志实现时,需注释此依赖项 -->
    <!-- <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-to-slf4j</artifactId>
      <version>${log4j2.version}</version>
    </dependency> -->

    <!-- 具体的日志实现 -->
    <!-- logback为日志实现:logback.xml -->
    <!-- <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <scope>runtime</scope>
    </dependency> -->
    <!-- log4j为日志实现:log4j.properties -->
    <!-- <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency> -->
    <!-- log4j2为日志实现:log4j2.xml -->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>${log4j2.version}</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>${log4j2.version}</version>
      <scope>runtime</scope>
    </dependency>
    <!-- <context-param> web.xml自定义配置文件的位置
      <param-name>log4jConfiguration</param-name>
      <param-value>/WEB-INF/classes/log4j2.xml</param-value>
    </context-param> -->
    <!-- commons-logging桥接到Log4j2 -->
    <!-- <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-jcl</artifactId>
      <version>${log4j2.version}</version>
    </dependency> -->
    <!-- java.util.logging桥接到Log4j2 -->
    <!-- <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-jul</artifactId>
      <version>${log4j2.version}</version>
    </dependency> -->
    <!-- ====================logger==================== -->


    <!-- commons -->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.12.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-text</artifactId>
      <version>1.10.0</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.11.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-collections4</artifactId>
      <version>4.4</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-math3</artifactId>
      <version>3.6.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>2.11.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-csv</artifactId>
      <version>1.9.0</version>
    </dependency>
    <dependency>
      <groupId>org.dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>2.1.3</version>
    </dependency>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>31.1-jre</version>
    </dependency>
    <dependency>
      <groupId>joda-time</groupId>
      <artifactId>joda-time</artifactId>
      <version>2.10.13</version>
    </dependency>
    <dependency>
      <groupId>net.lingala.zip4j</groupId>
      <artifactId>zip4j</artifactId>
      <version>2.11.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-parsers-standard-package</artifactId>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-core</artifactId>
    </dependency>
    <dependency>
      <groupId>com.itextpdf</groupId>
      <artifactId>itextpdf</artifactId>
      <version>5.5.13.3</version>
    </dependency>
    <dependency>
      <groupId>javax.money</groupId>
      <artifactId>money-api</artifactId>
      <version>1.1</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.javamoney</groupId>
      <artifactId>moneta</artifactId>
      <version>1.4.2</version>
      <type>pom</type>
      <optional>true</optional>
    </dependency>

    <!-- jakarta(当前版本是“javax”的包名空间,再往上升级版本就是“jakarta”包名空间) -->
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>4.0.4</version>
      <optional>true</optional>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>jakarta.annotation</groupId>
      <artifactId>jakarta.annotation-api</artifactId>
      <version>1.3.5</version>
    </dependency>
    <dependency>
      <groupId>jakarta.validation</groupId>
      <artifactId>jakarta.validation-api</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.2.5.Final</version>
    </dependency>

    <!-- ====================spring==================== -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring-framework.version}</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring-framework.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring-framework.version}</version>
    </dependency>

    <!-- ====================excel poi==================== -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>5.2.3</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>com.monitorjbl</groupId>
      <artifactId>xlsx-streamer</artifactId>
      <version>2.2.0</version>
      <exclusions>
        <exclusion>
          <groupId>org.apache.poi</groupId>
          <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>

    <!-- ====================序列化==================== -->
    <dependency>
      <groupId>com.esotericsoftware</groupId>
      <artifactId>kryo</artifactId>
      <version>5.3.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.caucho</groupId>
      <artifactId>hessian</artifactId>
      <version>4.0.66</version>
    </dependency>
    <dependency>
      <groupId>de.ruedigermoeller</groupId>
      <artifactId>fst</artifactId>
      <version>2.57</version>
      <exclusions>
        <exclusion>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.objenesis</groupId>
          <artifactId>objenesis</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>io.protostuff</groupId>
      <artifactId>protostuff-runtime</artifactId>
      <version>1.8.0</version>
    </dependency>
    <dependency>
      <groupId>io.protostuff</groupId>
      <artifactId>protostuff-core</artifactId>
      <version>1.8.0</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.83</version>
    </dependency>

    <!-- ====================mybatis==================== -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.15</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.11</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.1.0</version>
    </dependency>
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.2</version>
    </dependency>

    <!-- ====================加解密==================== -->
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcmail-jdk18on</artifactId>
      <version>${bouncycastle.version}</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcpg-jdk18on</artifactId>
      <version>${bouncycastle.version}</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bctls-jdk18on</artifactId>
      <version>${bouncycastle.version}</version>
    </dependency>
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-ext-jdk18on</artifactId>
      <version>${bouncycastle.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>1.15</version>
    </dependency>

    <!-- ====================test==================== -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring-framework.version}</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.zeroturnaround</groupId>
      <artifactId>zt-zip</artifactId>
      <version>1.14</version>
      <scope>test</scope>
      <type>jar</type>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>*</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.13.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.lmax</groupId>
      <artifactId>disruptor</artifactId>
      <version>3.4.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.14</version>
      <scope>test</scope>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.testng</groupId>
      <artifactId>testng</artifactId>
      <version>6.14.3</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.google.protobuf</groupId>
      <artifactId>protobuf-java</artifactId>
      <version>3.11.4</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>transmittable-thread-local</artifactId>
      <version>2.11.4</version>
      <scope>test</scope>
    </dependency>
    <!-- 密码哈希处理 -->
    <dependency>
      <groupId>de.mkammerer</groupId>
      <artifactId>argon2-jvm</artifactId>
      <version>2.6</version>
      <scope>test</scope>
    </dependency>
    <!-- Java Object Layout -->
    <dependency>
      <groupId>org.openjdk.jol</groupId>
      <artifactId>jol-core</artifactId>
      <version>0.16</version>
      <scope>test</scope>
    </dependency>
    <!-- 二维码生成 -->
    <!-- <dependency>
      <groupId>com.github.kenglxn.QRGen</groupId>
      <artifactId>javase</artifactId>
      <version>2.6.0</version>
      <scope>test</scope>
    </dependency> -->

    <dependency>
      <groupId>com.beust</groupId>
      <artifactId>jcommander</artifactId>
      <version>1.82</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>info.picocli</groupId>
      <artifactId>picocli</artifactId>
      <version>4.7.0</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <!--
    1、“https://repo1.maven.org/maven2”与“https://repo.maven.apache.org/maven2”是同一个仓库(central,即mavenCentral)
    2、central是在“$MAVEN_HOME/lib/maven-model-builder.jar!/org/apache/maven/model/pom-4.0.0.xml”中配置的
    3、aliyun central+jcenter的聚合镜像仓(jcenter 2022-02-01开始停用不再支持下载):https://maven.aliyun.com/repository/public
    4、aliyun maven文档:https://developer.aliyun.com/mvn/guide
    5、mvn repository地址:https://mvnrepository.com/
    6、中央仓库搜索地址:https://central.sonatype.com/
  -->
  <!--
  <repositories>
    <repository>
      <id>central</id>
      <url>https://repo.maven.apache.org/maven2</url>
    </repository>
  </repositories>
  -->

  <build>
    <finalName>${project.artifactId}-${project.version}</finalName>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <!-- filtering用于替换资源文件(*.xml、*.properties)中的占位符(${...}) -->
        <!-- https://blog.csdn.net/luckyzhoustar/article/details/50411962 -->
        <filtering>false</filtering>
      </resource>
      <resource>
        <directory>src/main/java</directory>
        <filtering>false</filtering>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>src/test/resources</directory>
        <filtering>false</filtering>
      </testResource>
    </testResources>

    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>versions-maven-plugin</artifactId>
        <version>2.13.0</version>
        <configuration>
          <generateBackupPoms>false</generateBackupPoms>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <encoding>${file.encoding}</encoding>
        </configuration>
      </plugin>
      <plugin>
        <!-- http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.10.1</version>
        <configuration>
          <source>${maven.compiler.source}</source>
          <target>${maven.compiler.target}</target>
          <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
          <encoding>${file.encoding}</encoding>
          <showDeprecation>true</showDeprecation>
          <showWarnings>true</showWarnings>
          <!-- <fork>true</fork> 乱码 -->
          <!--<compilerArgument>-Xlint:unchecked,deprecation</compilerArgument>-->
          <!-- <compilerArgument>-verbose -parameters -bootclasspath ${java.home}\lib\rt.jar</compilerArgument> -->
          <compilerArgs>
            <arg>-bootclasspath</arg>
            <!-- windows用“;”号分隔;linux用“:”号分隔;${JAVA_HOME}/lib/tools.jar; -->
            <arg>${java.home}/lib/rt.jar${system.separator}${java.home}/lib/jce.jar${system.separator}${java.home}/lib/jsse.jar</arg>
            <arg>-parameters</arg>
            <arg>-Xlint:unchecked,deprecation</arg>
          </compilerArgs>
          <excludes>
            <exclude>node_modules/**</exclude>
          </excludes>
          <!--<debug>false</debug>
          <debuglevel>none</debuglevel>
          <skipMain>true</skipMain>-->
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <phase>verify</phase>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!--
        http://wvengen.github.io/proguard-maven-plugin
        https://github.com/wvengen/proguard-maven-plugin
        https://blog.csdn.net/xiao190128/article/details/81777912
       -->
      <!-- <plugin>
        <groupId>com.github.wvengen</groupId>
        <artifactId>proguard-maven-plugin</artifactId>
        <version>2.6.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>proguard</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <obfuscate>true</obfuscate>
          <addMavenDescriptor>false</addMavenDescriptor>
          <inFilter>!application.properties</inFilter>
          <injarNotExistsSkip>true</injarNotExistsSkip>

          <injar>classes</injar>
          <attach>false</attach>
          <outjar>${project.build.finalName}-proguard.jar</outjar>

          <!—— <injar>${project.build.finalName}.jar</injar>
          <attach>true</attach>
          <attachArtifactClassifier>proguard</attachArtifactClassifier>
          <attachArtifactType>jar</attachArtifactType> ——>

          <outputDirectory>${project.build.directory}</outputDirectory>
          <libs>
            <lib>${java.home}/lib/rt.jar</lib>
            <lib>${java.home}/lib/jce.jar</lib>
            <lib>${java.home}/lib/jsse.jar</lib>
          </libs>
          <options>
            <option>-target ${java.version}</option>
            <option>-ignorewarnings</option>
            <option>-dontshrink</option>
            <option>-dontoptimize</option>
            <option>-dontskipnonpubliclibraryclasses</option>
            <option>-dontskipnonpubliclibraryclassmembers</option>
            <option>-keeppackagenames</option>
            <option><![CDATA[-keep class * {*;}]]></option>
          </options>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>net.sf.proguard</groupId>
            <artifactId>proguard-base</artifactId>
            <version>6.2.2</version>
          </dependency>
        </dependencies>
      </plugin> -->


      <!-- http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html -->
      <!-- <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.1</version>
        <configuration>
          <appendAssemblyId>false</appendAssemblyId>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
          <archive>
            <manifest>
              <mainClass>cn.ponfee.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <finalName>${project.artifactId}</finalName>
              <skipAssembly>false</skipAssembly>
              <descriptors>
                <descriptor>src/main/assembly/assembly.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin> -->

      <!--
        https://blog.csdn.net/u011499747/article/details/83045928
        http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html
          maven-jar-plugin:
          maven-assembly-plugin: mvn assembly:assembly
          maven-shade-plugin: mvn clean package
       -->
      <!-- <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.1</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>cn.ponfee.Main</mainClass>
                </transformer>
              </transformers>
              <createSourcesJar>true</createSourcesJar>
              <artifactSet>
                <includes>
                  <include>${project.groupId}:*:*</include>
                </includes>
                <excludes>
                  <!—— log jar file provide by flink ——>
                  <exclude>org.slf4j:*</exclude>
                  <exclude>log4j:*</exclude>
                </excludes>
              </artifactSet>
              <filters>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                    <!—— log conf file provide by flink ——>
                    <exclude>log4j2.xml</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin> -->

      <!--  package jar -->
      <!-- <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.2</version>
        <configuration>
          <archive>
            <manifest>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
              <mainClass>cn.ponfee.Main</mainClass>
            </manifest>
          </archive>
        </configuration>
        <executions>
          <execution>
            <id>make-a-jar</id>
            <phase>compile</phase>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy</id>
            <phase>compile</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>
                ${project.build.directory}/lib
              </outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin> -->

      <!-- <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
        <configuration>
          <!—— warSourceExcludes是在编译完成后从warSourceDirectory目录复制文件时忽略,
               packagingExcludes是在从target/${artifactId}-${version}目录打包时忽略 ——>
          <!—— <warSourceDirectory>src/main/webapp | WebRoot | WebContent</warSourceDirectory>
          <warSourceExcludes>page/**,js/**,css/**,imgs/**</warSourceExcludes> ——>
          <warSourceIncludes>WEB-INF/lib/**,WEB-INF/web.xml,WEB-INF/mvc-config.xml,WEB-INF/jetty-web.xml</warSourceIncludes>

          <!—— packagingExcludes在warSourceExcludes后面执行:排除src/main/resources或从远程仓库pull下来的
          <packagingExcludes>WEB-INF/classes/logback.xml,WEB-INF/lib/commons-logging-*.jar,%regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]</packagingExcludes>
          <packagingIncludes></packagingIncludes> ——>
          <failOnMissingWebXml>true</failOnMissingWebXml>
        </configuration>
      </plugin> -->
    </plugins>

  </build>
</project>


================================================
FILE: src/main/java/cn/ponfee/commons/base/Initializable.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

/**
 * Initialize resources
 * 
 * @author Ponfee
 */
@FunctionalInterface
public interface Initializable {

    NoArgMethodInvoker INITIATOR = new NoArgMethodInvoker("open", "init", "initialize");

    void init();

    static void init(Object caller) {
        if (caller == null) {
            return;
        }

        if (caller instanceof Initializable) {
            ((Initializable) caller).init();
        } else {
            INITIATOR.invoke(caller);
        }
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/NoArgMethodInvoker.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

import cn.ponfee.commons.reflect.ClassUtils;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.Nonnull;
import java.util.Arrays;

/**
 * Specifies multiple non-arg method names, find the first and invoke it
 * 
 * @author Ponfee
 */
public final class NoArgMethodInvoker {

    private final String[] methodNames;

    /**
     * @param methodNames the no-arg method list
     */
    public NoArgMethodInvoker(@Nonnull String... methodNames) {
        if (methodNames == null || methodNames.length == 0) {
            throw new IllegalArgumentException("Must be specified least once no-arg method name.");
        }
        this.methodNames = methodNames;
    }

    public void invoke(Object caller) {
        if (caller == null) {
            return;
        }
        if (caller instanceof Class<?>) {
            throw new IllegalArgumentException("Invalid caller object " + caller);
        }

        Arrays.stream(methodNames)
              .filter(StringUtils::isNotBlank)
              .map(name -> ClassUtils.getMethod(caller, name))
              .findAny()
              .ifPresent(method -> ClassUtils.invoke(caller, method));
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/Predicates.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

import java.util.function.Predicate;

/**
 * Representing a boolean status
 *
 * <pre>
 *  异或(XOR , ⊕) = A ^ B
 *  同或(XNOR, ⊙) = 异或 ^ 1 = (A ^ B) ^ 1
 *  (0, 1)间的切换可以使用异或:1 ^ n,其中n ∈ (0, 1)
 * </pre>
 *
 * @author Ponfee
 */
public enum Predicates {

    Y(1, "是"), //

    N(0, "否"), //

    ;

    private final int value;
    private final char code;
    private final String desc;

    Predicates(int value, String desc) {
        this.value = value;
        this.code = name().charAt(0); // 'Y' or 'N'
        this.desc = desc;
    }

    public int value() {
        return value;
    }

    public char code() {
        return code;
    }

    public boolean state() {
        return this == Y;
    }

    public String desc() {
        return this.desc;
    }

    // ------------------------------------------------ equals methods
    public boolean equals(Integer value) {
        return equals(value == null ? N.value : value);
    }

    public boolean equals(int value) {
        if (value != Y.value && value != N.value) {
            throw new IllegalArgumentException("Invalid int value '" + value + "'");
        }
        return this.value == value;
    }

    public boolean equals(String code) {
        char c;
        if (code == null) {
            c = N.code;
        } else if (code.length() == 1) {
            c = code.charAt(0);
        } else {
            throw new IllegalArgumentException("Invalid string code '" + code + "'");
        }
        return equals(c);
    }

    public boolean equals(Character code) {
        return equals(code == null ? N.code : code);
    }

    public boolean equals(char code) {
        code = Character.toUpperCase(code);
        if (code != Y.code && code != N.code) {
            throw new IllegalArgumentException("Invalid char code '" + code + "'");
        }
        return this.code == code;
    }

    public boolean equals(Boolean state) {
        return equals(state == null ? N.state() : state);
    }

    public boolean equals(boolean state) {
        return state() == state;
    }

    public boolean equals(Predicates other) {
        return this == (other == null ? N : other);
    }

    // ------------------------------------------------ check whether the value is yes
    public static boolean yes(Integer value) {
        return Y.equals(value);
    }

    public static boolean yes(int value) {
        return Y.equals(value);
    }

    public static boolean yes(String code) {
        return Y.equals(code);
    }

    public static boolean yes(Character code) {
        return Y.equals(code);
    }

    public static boolean yes(char code) {
        return Y.equals(code);
    }

    public static boolean yes(Boolean state) {
        return Y.equals(state);
    }

    public static boolean yes(boolean state) {
        return Y.equals(state);
    }

    public static boolean yes(Predicates other) {
        return Y.equals(other);
    }

    // ------------------------------------------------ check whether the value is no
    public static boolean no(Integer value) {
        return N.equals(value);
    }

    public static boolean no(int value) {
        return N.equals(value);
    }

    public static boolean no(String code) {
        return N.equals(code);
    }

    public static boolean no(Character code) {
        return N.equals(code);
    }

    public static boolean no(char code) {
        return N.equals(code);
    }

    public static boolean no(Boolean state) {
        return N.equals(state);
    }

    public static boolean no(boolean state) {
        return N.equals(state);
    }

    public static boolean no(Predicates other) {
        return N.equals(other);
    }

    // ------------------------------------------------ of methods
    public static Predicates of(Integer value) {
        return Y.equals(value) ? Y : N;
    }

    public static Predicates of(int value) {
        return Y.equals(value) ? Y : N;
    }

    public static Predicates of(String code) {
        return Y.equals(code) ? Y : N;
    }

    public static Predicates of(Character code) {
        return Y.equals(code) ? Y : N;
    }

    public static Predicates of(char code) {
        return Y.equals(code) ? Y : N;
    }

    public static Predicates of(Boolean state) {
        return Y.equals(state) ? Y : N;
    }

    public static Predicates of(boolean state) {
        return Y.equals(state) ? Y : N;
    }

    public static <T> Predicate<T> not(Predicate<T> target) {
        return target.negate();
    }
}


================================================
FILE: src/main/java/cn/ponfee/commons/base/PrimitiveTypes.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

import cn.ponfee.commons.reflect.Fields;
import cn.ponfee.commons.util.Enums;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * <pre>
 * 基本数据类型及其包装类型工具类(不包含 {@link Void}),以及这些数据类型间的转换规则
 *
 * +----------+-------+------+-----+-------+------+------+---------+
 * |  double  | float | long | int | short | char | byte | boolean |
 * +----------+-------+------+-----+-------+------+------+---------+
 * </pre>
 *
 * @author Ponfee
 */
public enum PrimitiveTypes {

    DOUBLE (Double.class   , (byte) 0B1_0_0_0_0_0_0_0, (byte) 0B1_0_0_0_0_0_0_0   ),
    FLOAT  (Float.class    , (byte) 0B0_1_0_0_0_0_0_0, (byte) 0B1_1_0_0_0_0_0_0   ),
    LONG   (Long.class     , (byte) 0B0_0_1_0_0_0_0_0, (byte) 0B1_1_1_0_0_0_0_0   ),
    INT    (Integer.class  , (byte) 0B0_0_0_1_0_0_0_0, (byte) 0B1_1_1_1_0_0_0_0   ),
    SHORT  (Short.class    , (byte) 0B0_0_0_0_1_0_0_0, (byte) 0B1_1_1_1_1_0_0_0   ), // short与char不能互相转换
    CHAR   (Character.class, (byte) 0B0_0_0_0_0_1_0_0, (byte) 0B1_1_1_1_0_1_0_0   ), // short与char不能互相转换
    BYTE   (Byte.class     , (byte) 0B0_0_0_0_0_0_1_0, (byte) 0B1_1_1_1_1_0_1_0   ), // byte不能转为char
    BOOLEAN(Boolean.class  , (byte) 0B0_0_0_0_0_0_0_1, (byte) 0B0_0_0_0_0_0_0_1, 1), // boolean只能转boolean

    ;

    private final Class<?> wrapper;
    private final byte value;    // 类型值
    private final byte castable; // 支持转换到的目标类型
    private final Class<?> primitive;
    private final int size;

    private static final Map<Class<?>, PrimitiveTypes> PRIMITIVE_MAPPING = Enums.toMap(PrimitiveTypes.class, PrimitiveTypes::primitive);
    private static final Map<Class<?>, PrimitiveTypes> WRAPPER_MAPPING = Enums.toMap(PrimitiveTypes.class, PrimitiveTypes::wrapper);

    PrimitiveTypes(Class<?> wrapper, byte value, byte castable) {
        this(wrapper, value, castable, (int) Fields.get(wrapper, "SIZE"));
    }

    PrimitiveTypes(Class<?> wrapper, byte value, byte castable, int size) {
        this.wrapper = wrapper;
        this.value = value;
        this.castable = castable;
        this.primitive = (Class<?>) Fields.get(wrapper, "TYPE");
        this.size = size;
        Hide.PRIMITIVE_OR_WRAPPER_MAPPING.put(primitive, this);
        Hide.PRIMITIVE_OR_WRAPPER_MAPPING.put(wrapper, this);
    }

    public Class<?> primitive() {
        return primitive;
    }

    public Class<?> wrapper() {
        return wrapper;
    }

    public int size() {
        return size;
    }

    /**
     * 用于判断传入方法真实的参数类型(this)是否能转换到方法定义的参数类型(target)
     *
     * @param target 目标参数类型
     * @return {@code true}是,{@code false}否
     */
    public boolean isCastable(PrimitiveTypes target) {
        return (this.castable & target.value) == target.value;
    }

    public static PrimitiveTypes ofPrimitive(Class<?> primitive) {
        return PRIMITIVE_MAPPING.get(primitive);
    }

    public static PrimitiveTypes ofWrapper(Class<?> wrapper) {
        return WRAPPER_MAPPING.get(wrapper);
    }

    public static PrimitiveTypes ofPrimitiveOrWrapper(Class<?> primitive) {
        return Hide.PRIMITIVE_OR_WRAPPER_MAPPING.get(primitive);
    }

    public static Set<Class<?>> allPrimitiveTypes() {
        return PRIMITIVE_MAPPING.keySet();
    }

    public static Set<Class<?>> allWrapperTypes() {
        return WRAPPER_MAPPING.keySet();
    }

    public static boolean isWrapperType(Class<?> primitive) {
        return ofWrapper(primitive) != null;
    }

    public static <T> Class<T> wrap(Class<T> type) {
        PrimitiveTypes pt = ofPrimitiveOrWrapper(type);
        return pt == null ? type : (Class<T>) pt.wrapper;
    }

    public static <T> Class<T> unwrap(Class<T> type) {
        PrimitiveTypes pt = ofPrimitiveOrWrapper(type);
        return pt == null ? type : (Class<T>) pt.primitive;
    }

    private static class Hide {
        private static final Map<Class<?>, PrimitiveTypes> PRIMITIVE_OR_WRAPPER_MAPPING = new HashMap<>();
    }
}


================================================
FILE: src/main/java/cn/ponfee/commons/base/Releasable.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

import cn.ponfee.commons.exception.ServerException;

/**
 * Release resources
 * 
 * @author Ponfee
 */
@FunctionalInterface
public interface Releasable {

    NoArgMethodInvoker RELEASER = new NoArgMethodInvoker("close", "destroy", "release");

    /**
     * 释放资源
     */
    void release();

    static void release(Object caller) {
        if (caller == null) {
            return;
        }

        try {
            if (caller instanceof AutoCloseable) {
                ((AutoCloseable) caller).close();
            } else if (caller instanceof Releasable) {
                Releasable releasable = (Releasable) caller;
                if (!releasable.isReleased()) {
                    ((Releasable) caller).release();
                }
            } else {
                RELEASER.invoke(caller);
            }
        } catch (RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new ServerException(e);
        }
    }

    /**
     * 是否已经释放,true为已经释放,false未释放
     *
     * @return {@code true}已经释放
     */
    default boolean isReleased() {
        return false;
    }
}


================================================
FILE: src/main/java/cn/ponfee/commons/base/Symbol.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

/**
 * Symbol definitions.
 *
 * @author Ponfee
 */
public final class Symbol {

    public interface Str {
        /**
         * Zero symbol
         */
        String ZERO = "\u0000";

        /**
         * Colon symbol
         */
        String COLON = ":";

        /**
         * Comma symbol
         */
        String COMMA = ",";

        /**
         * Dot symbol
         */
        String DOT = ".";

        /**
         * Hyphen symbol
         */
        String HYPHEN = "-";

        /**
         * Slash symbol
         */
        String SLASH = "/";

        /**
         * Space symbol
         */
        String SPACE = " ";

        /**
         * Tab symbol
         */
        String TAB = "	";

        /**
         * Backslash symbol
         */
        String BACKSLASH = "\\";

        /**
         * CR symbol
         */
        String CR = "\r";

        /**
         * LF symbol
         */
        String LF = "\n";

        /**
         * Underscore symbol
         */
        String UNDERSCORE = "_";

        /**
         * Asterisk symbol
         */
        String ASTERISK = "*";

        /**
         * Semicolon symbol
         */
        String SEMICOLON = ";";

        /**
         * Ampersand symbol
         */
        String AMPERSAND = "&";

        /**
         * Open symbol
         */
        String OPEN = "(";

        /**
         * Close symbol
         */
        String CLOSE = ")";
    }

    public interface Char {
        /**
         * Zero char symbol, equals '\0'
         */
        char ZERO = '\u0000';

        /**
         * Colon symbol
         */
        char COLON = ':';

        /**
         * Comma symbol
         */
        char COMMA = ',';

        /**
         * Dot symbol
         */
        char DOT = '.';

        /**
         * Hyphen symbol
         */
        char HYPHEN = '-';

        /**
         * Slash symbol
         */
        char SLASH = '/';

        /**
         * Space symbol
         */
        char SPACE = ' ';

        /**
         * Tab symbol
         */
        char TAB = '	';

        /**
         * Backslash symbol
         */
        char BACKSLASH = '\\';

        /**
         * CR symbol
         */
        char CR = '\r';

        /**
         * LF symbol
         */
        char LF = '\n';

        /**
         * Underscore symbol
         */
        char UNDERSCORE = '_';

        /**
         * Asterisk symbol
         */
        char ASTERISK = '*';

        /**
         * Semicolon symbol
         */
        char SEMICOLON = ';';

        /**
         * Ampersand symbol
         */
        char AMPERSAND = '&';

        /**
         * Open symbol
         */
        char OPEN = '(';

        /**
         * Close symbol
         */
        char CLOSE = ')';
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/TimestampProvider.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base;

/**
 * 时间戳服务提供
 *
 * @author Ponfee
 */
@FunctionalInterface
public interface TimestampProvider {

    TimestampProvider EARLIEST = () -> Long.MIN_VALUE;
    TimestampProvider CURRENT  = System::currentTimeMillis;
    TimestampProvider LATEST   = () -> Long.MAX_VALUE;

    long get();

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

import cn.ponfee.commons.collect.Comparators;
import cn.ponfee.commons.collect.DelegatedIntSpliterator;
import cn.ponfee.commons.collect.ImmutableArrayList;
import cn.ponfee.commons.util.ObjectUtils;

import java.io.Serializable;
import java.util.*;
import java.util.function.Function;

/**
 * Abstract Tuple type.
 *
 * @author Ponfee
 */
public abstract class Tuple implements Comparable<Object>, Iterable<Object>, Serializable {
    private static final long serialVersionUID = -3292038317953347997L;

    /**
     * Get the object at the given index.
     *
     * @param index The index of the object to retrieve. Starts at 0.
     * @return The object or {@literal null} if out of bounds.
     */
    public abstract <T> T get(int index);

    /**
     * Set the value at the given index.
     *
     * @param value The object value.
     * @param index The index of the object to retrieve. Starts at 0.
     */
    public abstract <T> void set(T value, int index);

    /**
     * Returns a copy of this instance.
     *
     * @return a copy of this instance.
     */
    public abstract <T extends Tuple> T copy();

    /**
     * Returns int value of this tuple elements count.
     *
     * @return int value of this tuple elements count.
     */
    public abstract int length();

    /**
     * Turn this {@code Tuple} into a plain {@code Object[]}.
     * The array isn't tied to this Tuple but is a <strong>copy</strong>.
     *
     * @return A copy of the tuple as a new {@link Object Object[]}.
     */
    public final Object[] toArray() {
        int len = length();
        Object[] array = new Object[len];
        for (int i = 0; i < len; i++) {
            array[i] = get(i);
        }
        return array;
    }

    /**
     * Returns a string representation of the object.
     *
     * @return a string representation of the Tuple.
     */
    @Override
    public final String toString() {
        return join(", ", String::valueOf, "(", ")");
    }

    /**
     * Returns a hash code value for the object.
     *
     * @return a hash code value for this object.
     */
    @Override
    public final int hashCode() {
        int len = length();
        if (len < 1) {
            return 0;
        }

        int hash = Objects.hashCode(get(0));
        for (int i = 1; i < len; i++) {
            hash = 31 * hash + Objects.hashCode(get(i));
        }
        return hash;
    }

    /**
     * Indicates whether some other object is "equal to" this one.
     *
     * @param obj the reference object with which to compare.
     * @return {@code true} if this object equals the other.
     */
    @Override
    public final boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }

        Tuple other = (Tuple) obj;
        for (int i = 0, len = length(); i < len; i++) {
            if (!Objects.equals(this.get(i), other.get(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Returns tuple elements are equals array elements.
     *
     * @param elements the elements
     * @return {@code true} if elements equals.
     */
    public final boolean equals(Object... elements) {
        int len;
        if (elements == null || elements.length != (len = length())) {
            return false;
        }
        for (int i = 0; i < len; i++) {
            if (!Objects.equals(get(i), elements[i])) {
                return false;
            }
        }
        return true;
    }

    @Override
    public final int compareTo(Object o) {
        if (this == o) {
            return Comparators.EQ;
        }
        if (!(o instanceof Tuple)) {
            return ObjectUtils.compare(this, o);
        }

        Tuple other = (Tuple) o;
        for (int c, i = 0, n = this.length(); i < n; i++) {
            c = ObjectUtils.compare(this.get(i), other.get(i));
            if (c != Comparators.EQ) {
                return c;
            }
        }

        return Comparators.EQ;
    }

    /**
     * Turn this {@code Tuple} into a {@link List List&lt;Object&gt;}.
     * The list isn't tied to this Tuple but is a <strong>copy</strong> with limited
     * mutability ({@code add} and {@code remove} are not supported, but {@code set} is).
     *
     * @return A copy of the tuple as a new {@link List List&lt;Object&gt;}.
     */
    public List<Object> toList() {
        return ImmutableArrayList.of(toArray());
    }

    /**
     * Return an <strong>immutable</strong> {@link Iterator Iterator&lt;Object&gt;} around
     * the content of this {@code Tuple}.
     *
     * @return An unmodifiable {@link Iterator} over the elements in this Tuple.
     * @implNote As an {@link Iterator} is always tied to its {@link Iterable} source by
     * definition, the iterator cannot be mutable without the iterable also being mutable.
     */
    @Override
    public Iterator<Object> iterator() {
        // Also use: toList().iterator();
        return new TupleIterator<>();
    }

    @Override
    public Spliterator<Object> spliterator() {
        return new DelegatedIntSpliterator<>(0, length(), this::get);
    }

    /**
     * Returns string of joined the tuple elements.
     *
     * @param delimiter   the delimiter
     * @param valueMapper the valueMapper for each element to string function
     * @param prefix      the prefix
     * @param suffix      the suffix
     * @return string of joined the tuple elements
     */
    public final String join(CharSequence delimiter,
                             Function<Object, String> valueMapper,
                             CharSequence prefix,
                             CharSequence suffix) {
        StringBuilder builder = new StringBuilder(prefix);
        for (int i = 0, n = length() - 1; i <= n; i++) {
            builder.append(valueMapper.apply(get(i)));
            if (i < n) {
                builder.append(delimiter);
            }
        }
        return builder.append(suffix).toString();
    }

    /**
     * Tuple Iterator
     *
     * @param <T> element type
     */
    private class TupleIterator<T> implements Iterator<T> {
        private int position = 0;
        private final int size = length();

        @Override
        public boolean hasNext() {
            return position < size;
        }

        @Override
        public T next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            return get(position++);
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple0.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

import java.util.*;

/**
 * Tuple0 consisting of empty element.
 *
 * @author Ponfee
 */
public final class Tuple0 extends Tuple {
    private static final long serialVersionUID = -3627925720098458172L;
    private static final Tuple0 INSTANCE = new Tuple0();

    public Tuple0() {
    }

    public static Tuple0 of() {
        return INSTANCE;
    }

    @Override
    public <T> T get(int index) {
        throw new IndexOutOfBoundsException("Index: " + index);
    }

    @Override
    public <T> void set(T value, int index) {
        throw new IndexOutOfBoundsException("Index: " + index);
    }

    @Override
    public int length() {
        return 0;
    }

    @Override
    public Tuple0 copy() {
        return INSTANCE;
    }

    @Override
    public List<Object> toList() {
        return Collections.emptyList();
    }

    @Override
    public Iterator<Object> iterator() {
        return Collections.emptyIterator();
    }

    @Override
    public Spliterator<Object> spliterator() {
        return Spliterators.emptySpliterator();
    }

    private Object readResolve() {
        return INSTANCE;
    }
}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple1.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple1 consisting of one element.
 *
 * @author Ponfee
 */
public final class Tuple1<A> extends Tuple {
    private static final long serialVersionUID = -3627925720098458172L;

    public A a;

    public Tuple1(A a) {
        this.a = a;
    }

    public static <A> Tuple1<A> of(A a) {
        return new Tuple1<>(a);
    }

    @Override
    public <T> T get(int index) {
        if (index == 0) {
            return (T) a;
        } else {
            throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        if (index == 0) {
            a = (A) value;
        } else {
            throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 1;
    }

    @Override
    public Tuple1<A> copy() {
        return new Tuple1<>(a);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple2.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple2 consisting of two elements.
 *
 * @author Ponfee
 */
public final class Tuple2<A, B> extends Tuple {
    private static final long serialVersionUID = -3627925720098458172L;

    public A a;
    public B b;

    public Tuple2(A a, B b) {
        this.a = a;
        this.b = b;
    }

    public static <A, B> Tuple2<A, B> of(A a, B b) {
        return new Tuple2<>(a, b);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 2;
    }

    @Override
    public Tuple2<A, B> copy() {
        return new Tuple2<>(a, b);
    }

    /**
     * Returns a Tuple2 Object of this instance swapped values.
     *
     * @return a Tuple2 Object of this instance swapped values
     */
    public Tuple2<B, A> swap() {
        return new Tuple2<>(b, a);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple3.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple3 consisting of three elements.
 *
 * @author Ponfee
 */
public final class Tuple3<A, B, C> extends Tuple {
    private static final long serialVersionUID = -8101132015890693468L;

    public A a;
    public B b;
    public C c;

    public Tuple3(A a, B b, C c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    public static <A, B, C> Tuple3<A, B, C> of(A a, B b, C c) {
        return new Tuple3<>(a, b, c);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 3;
    }

    @Override
    public Tuple3<A, B, C> copy() {
        return new Tuple3<>(a, b, c);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple4.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple4 consisting of four elements.
 *
 * @author Ponfee
 */
public final class Tuple4<A, B, C, D> extends Tuple {
    private static final long serialVersionUID = -4282006520880127762L;

    public A a;
    public B b;
    public C c;
    public D d;

    public Tuple4(A a, B b, C c, D d) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }

    public static <A, B, C, D> Tuple4<A, B, C, D> of(A a, B b, C c, D d) {
        return new Tuple4<>(a, b, c, d);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            case  3: return (T) d;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            case  3: d = (D) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 4;
    }

    @Override
    public Tuple4<A, B, C, D> copy() {
        return new Tuple4<>(a, b, c, d);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple5.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple5 consisting of five elements.
 *
 * @author Ponfee
 */
public final class Tuple5<A, B, C, D, E> extends Tuple {
    private static final long serialVersionUID = -528096819207260665L;

    public A a;
    public B b;
    public C c;
    public D d;
    public E e;

    public Tuple5(A a, B b, C c, D d, E e) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
    }

    public static <A, B, C, D, E> Tuple5<A, B, C, D, E> of(A a, B b, C c, D d, E e) {
        return new Tuple5<>(a, b, c, d, e);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            case  3: return (T) d;
            case  4: return (T) e;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            case  3: d = (D) value; break;
            case  4: e = (E) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 5;
    }

    @Override
    public Tuple5<A, B, C, D, E> copy() {
        return new Tuple5<>(a, b, c, d, e);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple6.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple6 consisting of six elements.
 *
 * @author Ponfee
 */
public final class Tuple6<A, B, C, D, E, F> extends Tuple {
    private static final long serialVersionUID = 8697978867751048118L;

    public A a;
    public B b;
    public C c;
    public D d;
    public E e;
    public F f;

    public Tuple6(A a, B b, C c, D d, E e, F f) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
    }

    public static <A, B, C, D, E, F> Tuple6<A, B, C, D, E, F> of(A a, B b, C c, D d, E e, F f) {
        return new Tuple6<>(a, b, c, d, e, f);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            case  3: return (T) d;
            case  4: return (T) e;
            case  5: return (T) f;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            case  3: d = (D) value; break;
            case  4: e = (E) value; break;
            case  5: f = (F) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 6;
    }

    @Override
    public Tuple6<A, B, C, D, E, F> copy() {
        return new Tuple6<>(a, b, c, d, e, f);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple7.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple7 consisting of seven elements.
 *
 * @author Ponfee
 */
public final class Tuple7<A, B, C, D, E, F, G> extends Tuple {
    private static final long serialVersionUID = 4235194450172178770L;

    public A a;
    public B b;
    public C c;
    public D d;
    public E e;
    public F f;
    public G g;

    public Tuple7(A a, B b, C c, D d, E e, F f, G g) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
        this.g = g;
    }

    public static <A, B, C, D, E, F, G> Tuple7<A, B, C, D, E, F, G> of(A a, B b, C c, D d, E e, F f, G g) {
        return new Tuple7<>(a, b, c, d, e, f, g);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            case  3: return (T) d;
            case  4: return (T) e;
            case  5: return (T) f;
            case  6: return (T) g;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            case  3: d = (D) value; break;
            case  4: e = (E) value; break;
            case  5: f = (F) value; break;
            case  6: g = (G) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 7;
    }

    @Override
    public Tuple7<A, B, C, D, E, F, G> copy() {
        return new Tuple7<>(a, b, c, d, e, f, g);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple8.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple8 consisting of eight elements.
 *
 * @author Ponfee
 */
public final class Tuple8<A, B, C, D, E, F, G, H> extends Tuple {
    private static final long serialVersionUID = 3607273779775623549L;

    public A a;
    public B b;
    public C c;
    public D d;
    public E e;
    public F f;
    public G g;
    public H h;

    public Tuple8(A a, B b, C c, D d, E e, F f, G g, H h) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
        this.g = g;
        this.h = h;
    }

    public static <A, B, C, D, E, F, G, H> Tuple8<A, B, C, D, E, F, G, H> of(A a, B b, C c, D d, E e, F f, G g, H h) {
        return new Tuple8<>(a, b, c, d, e, f, g, h);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            case  3: return (T) d;
            case  4: return (T) e;
            case  5: return (T) f;
            case  6: return (T) g;
            case  7: return (T) h;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            case  3: d = (D) value; break;
            case  4: e = (E) value; break;
            case  5: f = (F) value; break;
            case  6: g = (G) value; break;
            case  7: h = (H) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 8;
    }

    @Override
    public Tuple8<A, B, C, D, E, F, G, H> copy() {
        return new Tuple8<>(a, b, c, d, e, f, g, h);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple9.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.base.tuple;

/**
 * Tuple9 consisting of nine elements.
 *
 * @author Ponfee
 */
public final class Tuple9<A, B, C, D, E, F, G, H, I> extends Tuple {
    private static final long serialVersionUID = 3462929449266307061L;

    public A a;
    public B b;
    public C c;
    public D d;
    public E e;
    public F f;
    public G g;
    public H h;
    public I i;

    public Tuple9(A a, B b, C c, D d, E e, F f, G g, H h, I i) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
        this.e = e;
        this.f = f;
        this.g = g;
        this.h = h;
        this.i = i;
    }

    public static <A, B, C, D, E, F, G, H, I> Tuple9<A, B, C, D, E, F, G, H, I> of(A a, B b, C c, D d, E e, F f, G g, H h, I i) {
        return new Tuple9<>(a, b, c, d, e, f, g, h, i);
    }

    @Override
    public <T> T get(int index) {
        switch (index) {
            case  0: return (T) a;
            case  1: return (T) b;
            case  2: return (T) c;
            case  3: return (T) d;
            case  4: return (T) e;
            case  5: return (T) f;
            case  6: return (T) g;
            case  7: return (T) h;
            case  8: return (T) i;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public <T> void set(T value, int index) {
        switch (index) {
            case  0: a = (A) value; break;
            case  1: b = (B) value; break;
            case  2: c = (C) value; break;
            case  3: d = (D) value; break;
            case  4: e = (E) value; break;
            case  5: f = (F) value; break;
            case  6: g = (G) value; break;
            case  7: h = (H) value; break;
            case  8: i = (I) value; break;
            default: throw new IndexOutOfBoundsException("Index: " + index);
        }
    }

    @Override
    public int length() {
        return 9;
    }

    @Override
    public Tuple9<A, B, C, D, E, F, G, H, I> copy() {
        return new Tuple9<>(a, b, c, d, e, f, g, h, i);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ArrayHashKey.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import org.apache.commons.lang3.builder.CompareToBuilder;

import java.util.Arrays;

/**
 * The class use in Object array as hash map key
 * <p>Use for HashMap key
 *
 * @author Ponfee
 */
public final class ArrayHashKey implements java.io.Serializable, Comparable<ArrayHashKey> {

    private static final long serialVersionUID = -8749483734287105153L;

    private final Object[] key;

    public ArrayHashKey(Object... key) {
        this.key = key;
    }

    public static ArrayHashKey of(Object... key) {
        return new ArrayHashKey(key);
    }

    @Override
    public boolean equals(Object other) {
        if (other == this) {
            return true;
        }
        return other instanceof ArrayHashKey && Arrays.equals(key, ((ArrayHashKey) other).key);
    }

    @Override
    public int hashCode() {
        return Arrays.hashCode(key);
    }

    @Override
    public int compareTo(ArrayHashKey o) {
        return new CompareToBuilder().append(key, o.key).toComparison();
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ByteArrayComparator.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

/**
 * The utility for compare two byte array
 * 
 * For compare
 * 
 * @author Ponfee
 */
public final class ByteArrayComparator {

    public static int compareTo(final byte[] left, final byte[] right) {
        return compareTo(left, 0, left.length, right, 0, right.length);
    }

    public static int compareTo(byte[] buffer1, int offset1, int length1,
                                byte[] buffer2, int offset2, int length2) {
        // Short circuit equal case
        if (buffer1 == buffer2 &&
            offset1 == offset2 &&
            length1 == length2) {
            return 0;
        }
        // Bring WritableComparator code local
        int end1 = offset1 + length1;
        int end2 = offset2 + length2;
        for (int i = offset1, j = offset2; i < end1 && j < end2; i++, j++) {
            int a = (buffer1[i] & 0xff);
            int b = (buffer2[j] & 0xff);
            if (a != b) {
                return a - b;
            }
        }
        return length1 - length2;
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ByteArrayTrait.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

/**
 * Represents the class has an byte[] array args constructor and a toByteArray method
 * 
 * For serialize
 * 
 * @author Ponfee
 */
public abstract class ByteArrayTrait {

    public ByteArrayTrait(byte[] array) {}

    /**
     * Returns byte array
     *
     * @return byte array
     */
    public abstract byte[] toByteArray();

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ByteArrayWrapper.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;

/**
 * The class use in byte array as hash map key
 * 
 * For HashMap key
 * 
 * @author Ponfee
 * @see org.springframework.data.redis.connection.util.ByteArrayWrapper
 */
public final class ByteArrayWrapper implements java.io.Serializable, Comparable<ByteArrayWrapper> {
    private static final long serialVersionUID = -8749483734287105153L;

    private final byte[] array;
    private final int hashCode;

    public ByteArrayWrapper(Byte... array) {
        this(ArrayUtils.toPrimitive(array));
    }

    public ByteArrayWrapper(byte... array) {
        this.array = array;
        this.hashCode = Arrays.hashCode(array);
    }

    public static ByteArrayWrapper of(byte... array) {
        return new ByteArrayWrapper(array);
    }

    @Override
    public boolean equals(Object other) {
        if (other == this) {
            return true;
        }
        if (other instanceof ByteArrayWrapper) {
            return Arrays.equals(array, ((ByteArrayWrapper) other).array);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return hashCode;
    }

    @Override
    public int compareTo(ByteArrayWrapper o) {
        return ByteArrayComparator.compareTo(array, o.array);
        //return Bytes.toBigInteger(array).compareTo(Bytes.toBigInteger(o.array));
    }

    /**
     * Returns the byte array
     * 
     * @return a byte array
     */
    public byte[] getArray() {
        return array;
    }

    @Override
    public String toString() {
        return "ByteArrayWrapper[" + (array == null ? "null" : array.length) + "]";
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/Collects.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import cn.ponfee.commons.base.Predicates;
import cn.ponfee.commons.math.Numbers;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.util.Assert;

import java.lang.reflect.Array;
import java.util.*;
import java.util.Map.Entry;
import java.util.function.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 集合工具类
 *
 * @author Ponfee
 */
public final class Collects {

    /**
     * 转数组
     * @param args
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T[] toArray(T... args) {
        return args;
    }

    /**
     * object to list
     * @param obj of elements
     * @return list with the same elements
     */
    public static List<Object> toList(Object obj) {
        if (obj == null) {
            return null;
        }
        if (obj.getClass().isArray()) {
            int length = Array.getLength(obj);
            List<Object> result = new ArrayList<>(length);
            for (int i = 0; i < length; i++) {
                result.add(Array.get(obj, i));
            }
            return result;
        }
        if (obj instanceof Collection) {
            return new ArrayList<>((Collection<?>) obj);
        }
        return Collections.singletonList(obj);

    }

    public static <E> LinkedList<E> newLinkedList(E element) {
        LinkedList<E> list = new LinkedList<>();
        list.add(element);
        return list;
    }

    /**
     * Gets the first element for values
     *
     * @param values the values
     * @param <T>    the values element type
     * @return first element of values
     */
    public static <T> T getFirst(Collection<T> values) {
        if (values == null || values.isEmpty()) {
            return null;
        }
        if (values instanceof Deque) {
            return ((Deque<T>) values).getFirst();
        }
        if (values instanceof List) {
            return ((List<T>) values).get(0);
        }
        return values.iterator().next();
    }

    /**
     * Gets the last element for values
     *
     * @param values the values
     * @param <T>    the values element type
     * @return last element of values
     */
    public static <T> T getLast(Collection<T> values) {
        if (values == null || values.isEmpty()) {
            return null;
        }
        if (values instanceof Deque) {
            return ((Deque<T>) values).getLast();
        }
        if (values instanceof List) {
            return ((List<T>) values).get(values.size() - 1);
        }
        return values.stream().reduce((a, b) -> b).orElse(null);
    }

    public static <T> T get(T[] array, int index) {
        if (array == null || index < 0 || index >= array.length) {
            return null;
        }
        return index < array.length ? array[index] : null;
    }

    public static <T> T get(List<T> list, int index) {
        if (list == null || index < 0 || index >= list.size()) {
            return null;
        }
        return list.get(index);
    }

    // -----------------------------the collection of intersect, union and different operations
    /**
     * two Collection intersect
     * intersect([1,2,3], [2,3,4]) = [2,3]
     *
     * @param coll1 the collection 1
     * @param coll2 the collection 2
     * @return a list of the two collection intersect result
     */
    public static <T> List<T> intersect(Collection<T> coll1, Collection<T> coll2) {
        return coll1.stream().filter(coll2::contains).collect(Collectors.toList());
    }

    /**
     * two array intersect
     *
     * @param array1
     * @param array2
     * @return
     */
    @SuppressWarnings({ "unchecked" })
    public static <T> T[] intersect(T[] array1, T[] array2) {
        List<T> list = Stream.of(array1)
                             .filter(t -> ArrayUtils.contains(array2, t))
                             .collect(Collectors.toList());

        Class<?> type = array1.getClass().getComponentType();
        return list.toArray((T[]) Array.newInstance(type, list.size()));
    }

    /**
     * two Collection union result
     *
     * @param coll1
     * @param coll2
     * @return
     */
    public static <T> List<T> union(Collection<T> coll1, Collection<T> coll2) {
        int max = coll1.size(), min = coll2.size();
        if (max < min) {
            int tmp = max;
            max = min;
            min = tmp;
        }
        List<T> res = new ArrayList<>(max + (min >> 1));
        res.addAll(coll1);
        coll2.stream().filter(Predicates.not(coll1::contains)).forEach(res::add);
        return res;
    }

    /**
     * list差集
     * different([1,2,3], [2,3,4]) = [1,4]
     *
     * @param list1
     * @param list2
     * @return
     */
    public static <T> List<T> different(List<T> list1, List<T> list2) {
        List<T> res = new ArrayList<>();
        list1.stream().filter(Predicates.not(list2::contains)).forEach(res::add);
        list2.stream().filter(Predicates.not(list1::contains)).forEach(res::add);
        return res;
    }

    /**
     * The two set different elements
     *
     * @param set1
     * @param set2
     * @return
     */
    public static <T> Set<T> different(Set<T> set1, Set<T> set2) {
        Set<T> res = new HashSet<>();
        set1.stream().filter(Predicates.not(set2::contains)).forEach(res::add);
        set2.stream().filter(Predicates.not(set1::contains)).forEach(res::add);
        return res;
    }

    /**
     * map差集
     *
     * @param map1
     * @param map2
     * @return
     */
    public static <K, V> Map<K, V> different(Map<K, V> map1, Map<K, V> map2) {
        Map<K, V> res = new HashMap<>(Math.max(map1.size(), map2.size()));
        map1.entrySet()
            .stream()
            .filter(e -> !map2.containsKey(e.getKey()))
            .forEach(e -> res.put(e.getKey(), e.getValue()));

        map2.entrySet()
            .stream()
            .filter(e -> !map1.containsKey(e.getKey()))
            .forEach(e -> res.put(e.getKey(), e.getValue()));
        return res;
    }

    public static <T> List<T> duplicate(Collection<T> list) {
        return duplicate(list, Function.identity());
    }

    /**
     * Returns the duplicates elements for list
     *
     * @param list the list
     * @return a set of duplicates elements for list
     */
    public static <T, R> List<R> duplicate(Collection<T> list, Function<T, R> mapper) {
        if (CollectionUtils.isEmpty(list)) {
            return Collections.emptyList();
        }

        return list.stream()
                   .map(mapper)
                   .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
                   .entrySet()
                   .stream()
                   .filter(e -> e.getValue() > 1)
                   .map(Entry::getKey)
                   .collect(Collectors.toList());
    }

    /**
     * Returns a new array for merged the generic array generator
     *
     * @see org.apache.commons.lang3.ArrayUtils#addAll(T[] array1, T... array2)
     * @param generator the generic array generator
     * @param arrays the multiple generic object array
     * @return a new array of merged
     */
    @SuppressWarnings({ "unchecked" })
    public static <T> T[] concat(IntFunction<T[]> generator, T[]... arrays) {
        // component type maybe not correct
        //Class<?> type = arrays[0].getClass().getComponentType();
        //return list.toArray((T[]) Array.newInstance(type, list.size()));

        // [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
        //return list.toArray((T[]) new Object[list.size()]);

        if (ArrayUtils.isEmpty(arrays)) {
            return null;
        }

        return Arrays.stream(arrays)
                     .filter(Objects::nonNull)
                     .flatMap(Arrays::stream)
                     .toArray(generator);
    }

    /**
     * Puts the element to list specified index
     *
     * @param list a list
     * @param index spec index
     * @param obj the element
     */
    public static <T> void set(List<T> list, int index, T obj) {
        for (int i = list.size(); i <= index; i++) {
            list.add(null);
        }
        list.set(index, obj);
    }

    /**
     * Expand the list size
     *
     * @param list     the list
     * @param size     the target size
     * @param supplier element provider
     * @param <T>      the element type
     */
    public static <T> void expand(List<T> list, int size, Supplier<T> supplier) {
        for (int i = list.size(); i <= size; i++) {
            list.add(supplier.get());
        }
    }

    /**
     * Returns consecutive sub array of an array,
     * each of the same size (the final list may be smaller).
     *
     * <pre>
     *  Collects.partition(new int[]{1,1,2,5,3}, 1)    ->  [1, 1, 2, 5, 3]
     *  Collects.partition(new int[]{1,1,2,5,3}, 3)    ->  [1, 1]; [2, 5]; [3]
     *  Collects.partition(new int[]{1,1,2,5,3}, 5)    ->  [1]; [1]; [2]; [5]; [3]
     *  Collects.partition(new int[]{1,1,2,5,3}, 6)    ->  [1]; [1]; [2]; [5]; [3]
     *  Collects.partition(new int[]{1,1,2,5,3}, 100)  ->  [1]; [1]; [2]; [5]; [3]
     * </pre>
     *
     * @param array the array
     * @param size  the size
     * @return a list of consecutive sub sets
     */
    public static List<int[]> partition(int[] array, int size) {
        Assert.isTrue(size > 0, "Size must be greater than 0.");
        if (array == null || array.length == 0) {
            return null;
        }
        size = Math.min(size, array.length);
        if (size == 1) {
            return Collections.singletonList(array);
        }

        List<int[]> result = new ArrayList<>(size);
        int pos = 0;
        for (int number : Numbers.slice(array.length, size)) {
            if (number == 0) {
                break;
            }
            result.add(Arrays.copyOfRange(array, pos, pos = pos + number));
        }
        return result;
    }

    /**
     * Compute cartesian product
     *
     * [1, 2, 3] x [4, 5, 6] = [[4, 5, 6], [8, 10, 12], [12, 15, 18]]
     *
     * @param x the list of type A
     * @param y the list of type B
     * @param fun convert A and B to T
     * @return a list of type T
     */
    public static <A, B, T> List<List<T>> cartesian(List<A> x, List<B> y, BiFunction<A, B, T> fun) {
        List<List<T>> product = new ArrayList<>(x.size());
        for (A a : x) {
            List<T> row = new ArrayList<>(y.size());
            for (B b : y) {
                row.add(fun.apply(a, b));
            }
            product.add(row);
        }
        return product;
    }

    /**
     * Rotate list array data
     *
     * [[a,b,c,d],[1,2,3,4]] -> [[a,1],[b,2],[c,3],[d,4]]
     *
     * @param list the list
     * @return a list array result
     */
    public static List<Object[]> rotate(List<Object[]> list) {
        if (list == null || list.isEmpty()) {
            return null;
        }

        int length = list.get(0).length, size = list.size();
        List<Object[]> result = new ArrayList<>(length);
        for (int i = 0; i < length; i++) {
            Object[] array = new Object[size];
            for (int j = 0; j < size; j++) {
                array[j] = list.get(j)[i];
            }
            result.add(array);
        }
        return result;
    }

    public static int[] sortAndGetIndexSwapMapping(int[] array) {
        int[] indexSwapMapping = IntStream.range(0, array.length).toArray();
        for (int n = array.length - 1, i = 0; i < n; i++) {
            int minimumIndex = i;
            for (int j = i + 1; j <= n; j++) {
                if (array[minimumIndex] > array[j]) {
                    minimumIndex = j;
                }
            }
            if (minimumIndex != i) {
                ArrayUtils.swap(array, i, minimumIndex);
                ArrayUtils.swap(indexSwapMapping, i, minimumIndex);
            }
        }
        return indexSwapMapping;
    }

    /**
     * Checks that the specified array reference is not null and not empty,
     * throws a customized {@link IllegalStateException} if it is.
     *
     * @param array the array
     * @param <T> the type of the array element
     * @return {@code array} if not null and not empty
     */
    public static <T> T[] requireNonEmpty(T[] array) {
        if (ArrayUtils.isEmpty(array)) {
            throw new IllegalStateException("The array cannot be empty.");
        }
        return array;
    }

    /**
     * Checks that the specified list reference is not null and not empty,
     * throws a customized {@link IllegalStateException} if it is.
     *
     * @param list the list
     * @param <T> the type of the list element
     * @return {@code list} if not null and not empty
     */
    public static <T> List<T> requireNonEmpty(List<T> list) {
        if (CollectionUtils.isEmpty(list)) {
            throw new IllegalStateException("The list cannot be empty.");
        }
        return list;
    }

    public static <E, R> List<R> convert(Collection<E> collection, Function<E, R> mapper) {
        return convert(collection, null, mapper);
    }

    public static <E, R> List<R> convert(Collection<E> collection, Predicate<? super E> predicate, Function<E, R> mapper) {
        if (collection == null) {
            return null;
        }
        if (collection.isEmpty()) {
            return Collections.emptyList();
        }

        List<R> result = new ArrayList<>(collection.size());
        Stream<E> stream = collection.stream();
        if (predicate != null) {
            stream = stream.filter(predicate);
        }
        stream.map(mapper).forEach(result::add);

        return result;
    }

    @SafeVarargs
    public static <T> List<T> concat(List<T> list, T... array) {
        if (list == null) {
            return array == null ? Collections.emptyList() : Arrays.asList(array);
        }
        if (array == null || array.length == 0) {
            return list;
        }
        List<T> result = new ArrayList<>(list.size() + array.length);
        result.addAll(list);
        Collections.addAll(result, array);
        return result;
    }

    public static <T> T[] newArray(Class<? extends T[]> arrayType, int length) {
        return arrayType.equals(Object[].class)
            ? (T[]) new Object[length]
            : (T[]) Array.newInstance(arrayType.getComponentType(), length);
    }

    public static <E> Stream<E> stream(Collection<E> collection) {
        return CollectionUtils.isEmpty(collection) ? Stream.empty() : collection.stream();
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/Comparators.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import java.util.Comparator;

/**
 * For collection order
 *
 * @author Ponfee
 */
public final class Comparators {

    public static final int EQ =  0;
    public static final int GT =  1;
    public static final int LT = -1;

    public static <T extends Comparable<? super T>> Comparator<T> asc() {
        return Comparator.naturalOrder();
    }

    public static <T extends Comparable<? super T>> Comparator<T> desc() {
        return Comparator.reverseOrder();
    }

    public static <T extends Comparable<? super T>> Comparator<T> order(boolean asc) {
        return asc ? asc() : desc();
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/DelegatedIntSpliterator.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import java.util.Comparator;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.IntConsumer;
import java.util.function.IntFunction;
import java.util.stream.IntStream;

/**
 * Delegated int spliterator
 *
 * @param <T> elelement type
 * @author Ponfee
 */
public class DelegatedIntSpliterator<T> implements Spliterator<T> {

    private static final int CHARACTERISTICS = Spliterator.ORDERED
                                             | Spliterator.SIZED
                                             | Spliterator.SUBSIZED
                                             | Spliterator.IMMUTABLE;

    private final Spliterator.OfInt delegate;
    private final IntFunction<? extends T> mapper;

    public DelegatedIntSpliterator(int startInclusive, int endExclusive, IntFunction<? extends T> mapper) {
        this.delegate = IntStream.range(startInclusive, endExclusive).spliterator();
        this.mapper = mapper;
    }

    public DelegatedIntSpliterator(Spliterator.OfInt delegate, IntFunction<? extends T> mapper) {
        this.delegate = delegate;
        this.mapper = mapper;
    }

    @Override
    public boolean tryAdvance(Consumer<? super T> action) {
        return delegate.tryAdvance((IntConsumer) i -> action.accept(mapper.apply(i)));
    }

    @Override
    public void forEachRemaining(Consumer<? super T> action) {
        delegate.forEachRemaining((IntConsumer) i -> action.accept(mapper.apply(i)));
    }

    @Override
    public Spliterator<T> trySplit() {
        Spliterator.OfInt split = delegate.trySplit();
        return (split == null) ? null : new DelegatedIntSpliterator<>(split, mapper);
    }

    @Override
    public long estimateSize() {
        return delegate.estimateSize();
    }

    @Override
    public int characteristics() {
        return CHARACTERISTICS;
    }

    @Override
    public Comparator<? super T> getComparator() {
        // inner elements unsupported sortable
        throw new IllegalStateException();
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/DoubleListViewer.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import org.springframework.util.Assert;

import java.util.*;

/**
 * Double(tow-dimensional) list viewer
 *
 * @param <E> the element type
 * @author Ponfee
 */
public class DoubleListViewer<E> implements List<E>, RandomAccess {

    private final Collection<List<E>> list;
    private final int size;

    public DoubleListViewer(Collection<List<E>> list) {
        Assert.notNull(list, "Origin list cannot be null.");
        this.list = list;
        this.size = list.stream().mapToInt(e -> e == null ? 0 : e.size()).sum();
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size() == 0;
    }

    @Override
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        for (Object e : c) {
            if (!contains(e)) {
                return false;
            }
        }
        return false;
    }

    @Override
    public Object[] toArray() {
        return list.stream().filter(Objects::nonNull).flatMap(List::stream).toArray();
    }

    @Override
    public <T> T[] toArray(T[] a) {
        return list.stream()
            .filter(Objects::nonNull)
            .flatMap(List::stream)
            .toArray(length -> (T[]) Collects.newArray(a.getClass(), length));
    }

    @Override
    public E get(int index) {
        Assert.isTrue(index >= 0, "Index must greater than zero.");
        if (index >= size()) {
            throw new IndexOutOfBoundsException("Index out of bounds: " + index);
        }
        int count = 0;
        for (List<E> sub : list) {
            if (sub == null || sub.isEmpty()) {
                continue;
            }
            if (index >= count + sub.size()) {
                count += sub.size();
                continue;
            }
            return sub.get(index - count);
        }

        // cannot happen
        throw new IllegalStateException();
    }

    @Override
    public int indexOf(Object o) {
        int index = 0;
        if (o == null) {
            for (List<E> sub : list) {
                if (sub == null || sub.isEmpty()) {
                    continue;
                }
                for (E e : sub) {
                    if (e == null) {
                        return index;
                    }
                    index++;
                }
            }
        } else {
            for (List<E> sub : list) {
                if (sub == null || sub.isEmpty()) {
                    continue;
                }
                for (E e : sub) {
                    if (o.equals(e)) {
                        return index;
                    }
                    index++;
                }
            }
        }
        return -1;
    }

    @Override
    public int lastIndexOf(Object o) {
        int index = size() - 1;
        if (o == null) {
            for (List<E> sub : list) {
                if (sub == null || sub.isEmpty()) {
                    continue;
                }
                for (int i = sub.size() - 1; i >= 0; i--) {
                    if (sub.get(i) == null) {
                        return index;
                    }
                    index--;
                }
            }
        } else {
            for (List<E> sub : list) {
                if (sub == null || sub.isEmpty()) {
                    continue;
                }
                for (int i = sub.size() - 1; i >= 0; i--) {
                    if (o.equals(sub.get(i))) {
                        return index;
                    }
                    index--;
                }
            }
        }
        return -1;
    }

    @Override
    public Iterator<E> iterator() {
        return new UnmodifiableIterator(0, size());
    }

    @Override
    public ListIterator<E> listIterator() {
        return new UnmodifiableListIterator(0, size());
    }

    @Override
    public ListIterator<E> listIterator(int index) {
        return new UnmodifiableListIterator(index, size());
    }

    @Override
    public List<E> subList(int fromIndex, int toIndex) {
        throw new UnsupportedOperationException();
    }

    @Override
    public String toString() {
        Iterator<E> it = iterator();
        if (!it.hasNext()) {
            return "[]";
        }

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (; ; ) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (!it.hasNext()) {
                return sb.append(']').toString();
            }
            sb.append(',').append(' ');
        }
    }

    @Override
    public int hashCode() {
        int hashCode = 1;
        for (E e : this) {
            hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
        }
        return hashCode;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof List)) {
            return false;
        }

        ListIterator<E> a = listIterator();
        ListIterator<?> b = ((List<?>) o).listIterator();
        while (a.hasNext() && b.hasNext()) {
            if (!(Objects.equals(a.next(), b.next()))) {
                return false;
            }
        }
        return !(a.hasNext() || b.hasNext());
    }

    // ----------------------------------------------------Unsupported operations

    @Override
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

    @Override
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean addAll(int index, Collection<? extends E> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean add(E e) {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean remove(Object o) {
        throw new UnsupportedOperationException();
    }

    // ----------------------------------------------------Static class

    private class UnmodifiableListIterator extends UnmodifiableIterator implements ListIterator<E> {
        UnmodifiableListIterator(int position, int end) {
            super(position, end);
        }

        @Override
        public boolean hasPrevious() {
            return !isEmpty() && position > 0;
        }

        @Override
        public E previous() {
            if (!hasPrevious()) {
                throw new NoSuchElementException();
            }
            return get(--position);
        }

        @Override
        public int nextIndex() {
            return position;
        }

        @Override
        public int previousIndex() {
            return position - 1;
        }

        @Override
        public void set(E e) {
            throw new UnsupportedOperationException();
        }

        @Override
        public void add(E e) {
            throw new UnsupportedOperationException();
        }
    }

    private class UnmodifiableIterator implements Iterator<E> {
        protected int position;
        protected final int end;

        UnmodifiableIterator(int position, int end) {
            this.position = position;
            this.end = end;
        }

        @Override
        public boolean hasNext() {
            return !isEmpty() && position < end;
        }

        @Override
        public E next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            return get(position++);
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/FilterableIterator.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import java.util.Iterator;
import java.util.Objects;
import java.util.function.Predicate;

/**
 * 遍历集合,选取符合条件的元素,用于增强for循环场景
 * <pre>{@code
 *  for (String s : FilterableIterator.of("", null, "a")) {
 *    System.out.println(s);
 *  }
 * }</pre>
 *
 * @param <T> Parameterized Type
 * @author Ponfee
 */
public class FilterableIterator<T> implements Iterable<T>, Iterator<T> {

    private final Predicate<T> predicate;
    private final Iterator<T> iterator;
    private T current;

    private FilterableIterator(Iterator<T> iterator) {
        this(Objects::nonNull, iterator);
    }

    private FilterableIterator(Predicate<T> predicate, Iterator<T> iterator) {
        this.predicate = predicate;
        this.iterator = iterator;
    }

    public static <T> FilterableIterator<T> of(Iterator<T> iterator) {
        return new FilterableIterator<>(iterator);
    }

    public static <T> FilterableIterator<T> of(Predicate<T> predicate, Iterator<T> iterator) {
        return new FilterableIterator<>(predicate, iterator);
    }

    public static <T> FilterableIterator<T> of(Iterable<T> iterable) {
        return new FilterableIterator<>(iterable.iterator());
    }

    public static <T> FilterableIterator<T> of(Predicate<T> predicate, Iterable<T> iterable) {
        return new FilterableIterator<>(predicate, iterable.iterator());
    }

    @SafeVarargs
    public static <T> FilterableIterator<T> of(T... array) {
        return new FilterableIterator<>(new ArrayIterator<>(array));
    }

    @SafeVarargs
    public static <T> FilterableIterator<T> of(Predicate<T> predicate, T... array) {
        return new FilterableIterator<>(predicate, new ArrayIterator<>(array));
    }

    @Override
    public Iterator<T> iterator() {
        return this;
    }

    @Override
    public boolean hasNext() {
        while (iterator.hasNext()) {
            if (predicate.test(current = iterator.next())) {
                return true;
            }
        }
        return false;
    }

    @Override
    public T next() {
        return current;
    }

    private static class ArrayIterator<T> implements Iterator<T> {
        private final T[] array;
        private int cursor = 0;

        @SafeVarargs
        private ArrayIterator(T... array) {
            this.array = array;
        }

        @Override
        public boolean hasNext() {
            return array != null && cursor != array.length;
        }

        @Override
        public T next() {
            return array[cursor++];
        }
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ImmutableArrayList.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import cn.ponfee.commons.model.ToJsonString;
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.ArrayUtils;

import java.lang.reflect.Array;
import java.util.*;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;

/**
 * Representing immutable List
 *
 * @param <E> the element type
 * @author Ponfee
 */
public class ImmutableArrayList<E> extends ToJsonString
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable {

    private static final long serialVersionUID = 7013120001220709229L;

    public static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];

    private final E[] elements;

    public ImmutableArrayList() {
        this.elements = (E[]) EMPTY_OBJECT_ARRAY;
    }

    public ImmutableArrayList(Object[] elements) {
        // 为了节省时间及空间,此处认为外部环境不会修改数组,故不做拷贝操作
        //this.elements = (T[]) Arrays.copyOf(elements, elements.length);
        this.elements = (E[]) Objects.requireNonNull(elements);
    }

    /**
     * Returns an empty list
     *
     * @return empty list
     */
    public static <T> ImmutableArrayList<T> of() {
        return new ImmutableArrayList<>();
    }

    @SafeVarargs
    public static <T> ImmutableArrayList<T> of(T... array) {
        return new ImmutableArrayList<>(array);
    }

    public static <T> ImmutableArrayList<T> of(T[] array, T last) {
        return of(ArrayUtils.addAll(Objects.requireNonNull(array), last));
    }

    public static <T> ImmutableArrayList<T> of(List<T> list) {
        return of((T[]) (list.isEmpty() ? EMPTY_OBJECT_ARRAY : list.toArray()));
    }

    public static <T> ImmutableArrayList<T> of(List<T> list, T last) {
        return of((T[]) list.toArray(), last);
    }

    // ------------------------------------------------------------------------- methods
    protected int offset() {
        return 0;
    }

    @Override
    public int size() {
        return elements.length;
    }

    @Override
    public final boolean isEmpty() {
        return size() == 0;
    }

    @Override
    public final Object[] toArray() {
        if (isEmpty()) {
            return elements.length == 0 ? elements : EMPTY_OBJECT_ARRAY;
        }
        return Arrays.copyOfRange(elements, offset(), offset() + size());
    }

    @Override
    public final <T> T[] toArray(T[] a) {
        if (isEmpty()) {
            if (a.length > 0) {
                a[0] = null;
            }
            return a;
        } else if (a.length < size()) {
            return (T[]) Arrays.copyOfRange(elements, offset(), offset() + size(), a.getClass());
        } else {
            System.arraycopy(elements, offset(), a, 0, size());
            if (a.length > size()) {
                a[size()] = null;
            }
            return a;
        }
    }

    @Override
    public final E get(int index) {
        if (index >= size()) {
            throw new IndexOutOfBoundsException("Index: " + index + ", size: " + size());
        }
        return elements[offset() + index];
    }

    @Override
    public final int indexOf(Object o) {
        if (o == null) {
            for (int i = 0, n = size(); i < n; i++) {
                if (elements[offset() + i] == null) {
                    return i;
                }
            }
        } else {
            for (int i = 0, n = size(); i < n; i++) {
                if (o.equals(elements[offset() + i])) {
                    return i;
                }
            }
        }
        return -1;
    }

    @Override
    public final int lastIndexOf(Object o) {
        if (o == null) {
            for (int i = size() - 1; i >= 0; i--) {
                if (elements[offset() + i] == null) {
                    return i;
                }
            }
        } else {
            for (int i = size() - 1; i >= 0; i--) {
                if (o.equals(elements[offset() + i])) {
                    return i;
                }
            }
        }
        return -1;
    }

    @Override
    public final boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    @Override
    public final boolean containsAll(Collection<?> c) {
        for (Object e : c) {
            if (!contains(e)) {
                return false;
            }
        }
        return true;
    }

    @Override
    public final Iterator<E> iterator() {
        return new UnmodifiableIterator(offset(), offset() + size());
    }

    @Override
    public final ListIterator<E> listIterator() {
        return new UnmodifiableListIterator(offset(), offset() + size());
    }

    @Override
    public final ListIterator<E> listIterator(int index) {
        return new UnmodifiableListIterator(offset() + index, offset() + size());
    }

    @Override
    public final ImmutableArrayList<E> subList(int fromIndex, int toIndex) {
        Preconditions.checkPositionIndexes(fromIndex, toIndex, size());
        int length = toIndex - fromIndex;
        if (length == size()) {
            return this;
        } else if (length == 0) {
            return of((E[]) EMPTY_OBJECT_ARRAY);
        } else {
            return new SubList(offset() + fromIndex, offset() + toIndex);
        }
    }

    @Override
    public final Spliterator<E> spliterator() {
        return new DelegatedIntSpliterator<>(offset(), offset() + size(), i -> elements[i]);
    }

    @Override
    public final int hashCode() {
        int hashCode = 1;
        for (E e : this) {
            hashCode = 31 * hashCode + (e == null ? 0 : e.hashCode());
        }
        return hashCode;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }
        if (!(o instanceof List)) {
            return false;
        }

        ListIterator<E> a = listIterator();
        ListIterator<?> b = ((List<?>) o).listIterator();
        while (a.hasNext() && b.hasNext()) {
            if (!Objects.equals(a.next(), b.next())) {
                return false;
            }
        }
        return !(a.hasNext() || b.hasNext());
    }

    @Override
    public Object clone() {
        return this;
    }

    public final E[] join(E last) {
        if (isEmpty()) {
            // t.getClass().getComponentType()
            return last == null ? (E[]) new Object[]{null} : Collects.toArray(last);
        }

        Class<? extends E[]> arrayType = (Class<? extends E[]>) elements.getClass();
        E[] array = arrayType.equals(Object[].class)
                  ? (E[]) new Object[size() + 1]
                  : (E[]) Array.newInstance(arrayType.getComponentType(), size() + 1);
        System.arraycopy(elements, offset(), array, 0, size());
        array[size()] = last;
        return array;
    }

    public final ImmutableArrayList<E> concat(E last) {
        return of(join(last));
    }

    // ---------------------------------------------------- unsupported operation
    @Override
    public final boolean add(E e) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final boolean remove(Object o) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final boolean addAll(Collection<? extends E> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final boolean addAll(int index, Collection<? extends E> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final boolean removeAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final boolean removeIf(Predicate<? super E> filter) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final boolean retainAll(Collection<?> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final void replaceAll(UnaryOperator<E> operator) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final void sort(Comparator<? super E> c) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final void clear() {
        throw new UnsupportedOperationException();
    }

    @Override
    public final E set(int index, E element) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final void add(int index, E element) {
        throw new UnsupportedOperationException();
    }

    @Override
    public final E remove(int index) {
        throw new UnsupportedOperationException();
    }

    private class UnmodifiableIterator implements Iterator<E> {
        protected int position;
        protected final int end;

        UnmodifiableIterator(int position, int end) {
            this.position = position;
            this.end = end;
        }

        @Override
        public boolean hasNext() {
            return !isEmpty() && position < end;
        }

        @Override
        public E next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            return elements[position++];
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

    private class UnmodifiableListIterator extends UnmodifiableIterator implements ListIterator<E> {

        UnmodifiableListIterator(int position, int end) {
            super(position, end);
        }

        @Override
        public boolean hasPrevious() {
            return !isEmpty() && position > 0;
        }

        @Override
        public E previous() {
            if (!hasPrevious()) {
                throw new NoSuchElementException();
            }
            return elements[--position];
        }

        @Override
        public int nextIndex() {
            return position;
        }

        @Override
        public int previousIndex() {
            return position - 1;
        }

        @Override
        public void set(E e) {
            throw new UnsupportedOperationException();
        }

        @Override
        public void add(E e) {
            throw new UnsupportedOperationException();
        }
    }

    private class SubList extends ImmutableArrayList<E> {
        private static final long serialVersionUID = 8017446305586649188L;

        final int offset;
        final int size;

        SubList(int from, int to) {
            super(elements);
            this.offset = from;
            this.size = to - from;
        }

        @Override
        protected int offset() {
            return offset;
        }

        @Override
        public int size() {
            return size;
        }
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ImmutableHashList.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import org.apache.commons.collections4.CollectionUtils;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * Immutable hash map & list structure
 *
 * @param <K> the key type
 * @param <V> the val type
 * @author Ponfee
 */
public class ImmutableHashList<K extends Comparable<K>, V> {
    private static final ImmutableHashList EMPTY = new ImmutableHashList<>();

    private final Function<V, K> mapper;
    private final Set<K> keys;
    private final List<V> values;

    private ImmutableHashList() {
        this.mapper = v -> null;
        this.keys = Collections.emptySet();
        this.values = Collections.emptyList();
    }

    private ImmutableHashList(List<V> values, Function<V, K> mapper) {
        // sort
        values.sort(Comparator.comparing(mapper));

        this.mapper = mapper;
        this.keys = values.stream().map(mapper).collect(Collectors.toSet());
        this.values = Collections.unmodifiableList(values);
    }

    public final List<V> values() {
        return values;
    }

    public final boolean contains(V value) {
        return keys.contains(mapper.apply(value));
    }

    public final boolean isEmpty() {
        return values.isEmpty();
    }

    public static <K extends Comparable<K>, V> ImmutableHashList<K, V> of(List<V> values, Function<V, K> mapper) {
        return CollectionUtils.isEmpty(values) ? EMPTY : new ImmutableHashList<>(values, mapper);
    }

    public static <K extends Comparable<K>, V> ImmutableHashList<K, V> empty() {
        return EMPTY;
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/LRUCache.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import java.util.LinkedHashMap;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * LRU cache based LinkedHashMap
 * 
 * @author Ponfee
 * 
 * @param <K> the key type
 * @param <V> the val type
 */
public class LRUCache<K, V> extends LinkedHashMap<K, V> {

    private static final long serialVersionUID = 3943991140850259837L;

    private final ReadWriteLock lock = new ReentrantReadWriteLock();

    private volatile int maxSize;

    public LRUCache() {
        this(1024); // default maximum size 1024
    }

    public LRUCache(int maxCapacity) {
        super(16, 0.75f, true); // default initial capacity 16
        this.maxSize = maxCapacity;
    }

    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        return this.size() > maxSize;
    }

    @Override
    public boolean containsKey(Object key) {
        lock.readLock().lock();
        try {
            return super.containsKey(key);
        } finally {
            lock.readLock().unlock();
        }
    }

    @Override
    public V get(Object key) {
        lock.readLock().lock();
        try {
            return super.get(key);
        } finally {
            lock.readLock().unlock();
        }
    }

    @Override
    public V put(K key, V value) {
        lock.writeLock().lock();
        try {
            return super.put(key, value);
        } finally {
            lock.writeLock().unlock();
        }
    }

    @Override
    public V remove(Object key) {
        lock.writeLock().lock();
        try {
            return super.remove(key);
        } finally {
            lock.writeLock().unlock();
        }
    }

    @Override
    public int size() {
        lock.readLock().lock();
        try {
            return super.size();
        } finally {
            lock.readLock().unlock();
        }
    }

    @Override
    public void clear() {
        lock.writeLock().lock();
        try {
            super.clear();
        } finally {
            lock.writeLock().unlock();
        }
    }

    public int getMaxSize() {
        return maxSize;
    }

    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/Maps.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import cn.ponfee.commons.model.Page;
import cn.ponfee.commons.model.Result;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Map Utilities
 * 
 * @author Ponfee
 */
public final class Maps {

    /**
     * Returns a map contains key specified key 
     * 
     * @param map the map
     * @param key the string of key
     * @return {@code true} means constains
     */
    public static boolean hasKey(Map<?, ?> map, String key) {
        return map != null && map.containsKey(key);
    }

    // ----------------------------------------------------------------map to array

    /**
     * map转数组
     *
     * @param map    the map
     * @param fields the string fields
     * @return array of fields mapped values
     */
    public static Object[] toArray(Map<String, Object> map, String... fields) {
        return Stream.of(fields).map(map::get).toArray();
    }

    /**
     * List<Map<String, Object>>转List<Object[]>
     * @param data
     * @param fields
     * @return
     */
    public static List<Object[]> toArray(List<Map<String, Object>> data, String... fields) {
        if (data == null) {
            return null;
        }
        return data.stream()
                   .map(map -> toArray(map, fields))
                   .collect(Collectors.toList());
    }

    /**
     * LinkedHashMap<String, Object>转Object[]
     * 
     * @param data
     * @return
     */
    public static Object[] toArray(LinkedHashMap<String, Object> data) {
        if (data == null) {
            return null;
        }
        return data.values().stream().toArray();
    }

    /**
     * List<LinkedHashMap<String, Object>> -> List<Object[]>
     * @param data
     * @return
     */
    public static List<Object[]> toArray(List<LinkedHashMap<String, Object>> data) {
        if (data == null) {
            return null;
        }

        return data.stream()
                   .map(Maps::toArray)
                   .collect(Collectors.toList());
    }

    /**
     * Result<Page<LinkedHashMap<String, Object>>>转Result<Page<Object[]>>
     * @param source
     * @return
     */
    public static Result<Page<Object[]>> toArray(Result<Page<LinkedHashMap<String, Object>>> source) {
        return source.from(source.getData().map(Maps::toArray));
    }

    /**
     * Result<Page<Map<String, Object>>>转Result<Page<Object[]>>
     * @param source
     * @param fields
     * @return
     */
    public static Result<Page<Object[]>> toArray(Result<Page<Map<String, Object>>> source, String... fields) {
        return source.from(source.getData().map(map -> toArray(map, fields)));
    }

    // ----------------------------------------------------------------to List, Map and Array
    /**
     * Converts array to map
     * 
     * @param kv the key value array
     * @return a map
     */
    public static Map<String, Object> toMap(Object... kv) {
        if (kv == null) {
            return null;
        }

        int length = kv.length;
        // length % 2
        if ((length & 0x01) != 0) {
            throw new IllegalArgumentException("args must be pair.");
        }

        Map<String, Object> map = new LinkedHashMap<>(length);
        for (int i = 0; i < length; i += 2) {
            map.put((String) kv[i], kv[i + 1]);
        }
        return map;
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/StreamForker.java
================================================
package cn.ponfee.commons.collect;

import cn.ponfee.commons.exception.ServerException;

import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
 * The class use in fork {@link Stream},
 * from book "Java 8 In Action"<p>
 * 
 * Usage:
 * <pre> {@code
 *   Stream<Integer> stream = Stream.of(1, 2, 3, 4, 4, 5, 5);
 *   StreamForker.Results results = new StreamForker<>(stream)
 *     .fork(1, s -> s.max(Integer::compareTo)) // 直接聚合
 *     .fork(2, s -> s.distinct().reduce(0, Integer::sum))
 *     .getResults();
 * } </pre>
 * 
 * @param <T>
 * @author Java 8 In Action
 */
public class StreamForker<T> {

    private final Stream<T> stream;
    private final Map<Object, Function<Stream<T>, ?>> forks = new HashMap<>();

    public StreamForker(Stream<T> stream) {
        this.stream = stream;
    }

    public StreamForker<T> fork(Object key, Function<Stream<T>, ?> f) {
        forks.put(key, f);
        return this;
    }

    public Results getResults() {
        ForkingStreamConsumer<T> consumer = build();
        try {
            stream.sequential().forEach(consumer);
        } finally {
            consumer.finish();
        }
        return consumer;
    }

    private ForkingStreamConsumer<T> build() {
        List<BlockingQueue<T>> queues = new ArrayList<>();

        Map<Object, Future<?>> actions = forks.entrySet().stream().reduce(
            new HashMap<>(),
            (map, e) -> {
                map.put(e.getKey(), getOperationResult(queues, e.getValue()));
                return map;
            },
            (m1, m2) -> {
                m1.putAll(m2);
                return m1;
            }
        );

        return new ForkingStreamConsumer<>(queues, actions);
    }

    private Future<?> getOperationResult(List<BlockingQueue<T>> queues, Function<Stream<T>, ?> f) {
        LinkedBlockingQueue<T> queue = new LinkedBlockingQueue<>();
        queues.add(queue);
        Stream<T> source = StreamSupport.stream(new BlockingQueueSpliterator<>(queue), false);
        return CompletableFuture.supplyAsync(() -> f.apply(source));
    }

    public interface Results {
        <R> R get(Object key);
    }

    @SuppressWarnings("unchecked")
    private static class ForkingStreamConsumer<T> implements Consumer<T>, Results {
        private static final Object END_OF_STREAM = new Object();

        private final List<BlockingQueue<T>> queues;
        private final Map<Object, Future<?>> actions;

        ForkingStreamConsumer(List<BlockingQueue<T>> queues, Map<Object, Future<?>> actions) {
            this.queues = queues;
            this.actions = actions;
        }

        @Override
        public void accept(T t) {
            queues.forEach(q -> q.add(t));
        }

        @Override
        public <R> R get(Object key) {
            try {
                return ((Future<R>) actions.get(key)).get();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        void finish() {
            accept((T) END_OF_STREAM);
        }
    }

    private static class BlockingQueueSpliterator<T> implements Spliterator<T> {
        private final BlockingQueue<T> q;

        BlockingQueueSpliterator(BlockingQueue<T> q) {
            this.q = q;
        }

        @Override
        public boolean tryAdvance(Consumer<? super T> action) {
            T t;
            while (true) { // if occur exception, then keep take
                try {
                    t = q.take();
                    break;
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    throw new ServerException(e);
                }
            }

            if (t != ForkingStreamConsumer.END_OF_STREAM) {
                action.accept(t);
                return true;
            }

            return false;
        }

        @Override
        public Spliterator<T> trySplit() {
            return null;
        }

        @Override
        public long estimateSize() {
            return 0;
        }

        @Override
        public int characteristics() {
            return 0;
        }
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/collect/ValueSortedMap.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.collect;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import java.util.function.BiFunction;
import java.util.function.Function;

/**
 * <pre>
 * Extends TreeMap sort by value: {@code
 *   ValueSortedMap valueSortedMap = ValueSortedMap.nullsFirst(a map);
 * }
 *
 * Also use like this: {@code
 *    Map<String, Integer> originMap = ImmutableMap.of("b", 2, "a", 1);
 *    TreeMap<String, Integer> sortedByValueMap = new TreeMap<>(Comparator.comparing(originMap::get));
 *    sortedByValueMap.putAll(originMap);
 * }
 * </pre>
 *
 * @author Ponfee
 */
public class ValueSortedMap<K, V> extends TreeMap<K, V> {

    private static final long serialVersionUID = -6242175050718596776L;

    private ValueSortedMap(Map<? extends K, ? extends V> map, 
                           Comparator<? super V> comparator) {
        super(new MapValueComparator<>(map, comparator));
        map.forEach(super::put);
    }

    public static <K, V extends Comparable<? super V>> ValueSortedMap<K, V> nullsFirst(
        Map<? extends K, ? extends V> map) {
        return nullsFirst(map, Comparators.asc());
    }

    public static <K, V> ValueSortedMap<K, V> nullsFirst(
        Map<? extends K, ? extends V> map, Comparator<? super V> comparator) {
        return new ValueSortedMap<>(map, Comparator.nullsFirst(comparator));
    }

    public static <K, V extends Comparable<? super V>> ValueSortedMap<K, V> nullsLast(
        Map<? extends K, ? extends V> map) {
        return nullsLast(map, Comparators.asc());
    }

    public static <K, V> ValueSortedMap<K, V> nullsLast(
        Map<? extends K,? extends V> map, Comparator<? super V> comparator) {
        return new ValueSortedMap<>(map, Comparator.nullsLast(comparator));
    }

    // ------------------------------------------------------------Comparator
    private static class MapValueComparator<K, V> implements Comparator<K> {
        private final Map<? extends K, ? extends V> data;
        private final Comparator<? super V> comparator;

        private MapValueComparator(Map<? extends K, ? extends V> data,
                                   Comparator<? super V> comparator) {
            this.data = data;
            this.comparator = comparator;
        }

        @Override
        public int compare(K k1, K k2) {
            int n = comparator.compare(data.get(k1), data.get(k2));
            return n != 0 ? n : k1.toString().compareTo(k2.toString());
        }
    }

    // ------------------------------------------------------------Deprecated Methods
    @Deprecated @Override
    public final V put(K k, V v) {
        throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V putIfAbsent(K key, V value) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final boolean replace(K key, V oldValue, V newValue) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V replace(K key, V value) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V computeIfPresent(
        K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V merge(
        K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final void putAll(Map<? extends K, ? extends V> map) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final V remove(Object o) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final boolean remove(Object key, Object value) {
      throw new UnsupportedOperationException();
    }

    @Deprecated @Override
    public final void clear() {
      throw new UnsupportedOperationException();
    }
}


================================================
FILE: src/main/java/cn/ponfee/commons/concurrent/AsyncBatchProcessor.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.concurrent;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * <pre>
 *  异步数据批处理
 *
 *  execute:直接抛出异常,在线程外部无法捕获异常,想要捕获该异常,可以实现UncaughtExceptionHandler接口
 *  submit :不会抛出异常,需要调用返回值Future对象的get方法
 *
 *  <a href="https://github.com/JCTools/JCTools">JCTools</a>
 *  <a href="https://github.com/LMAX-Exchange/disruptor">disruptor</a>
 * </pre>
 *
 * @param <T>
 * @author Ponfee
 * @see Thread#setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)
 */
public final class AsyncBatchProcessor<T> {

    private final static Logger LOG = LoggerFactory.getLogger(AsyncBatchProcessor.class);

    private final AsyncBatchThread<T> async;

    public AsyncBatchProcessor(BatchProcessor<T> processor) {
        this(processor, 100, 200, 2);
    }

    /**
     * @param processor        批处理器
     * @param periodTimeMillis 处理周期(毫秒)
     * @param batchSize        批量大小
     * @param maximumPoolSize  最大线程数
     */
    public AsyncBatchProcessor(BatchProcessor<T> processor,
                               int periodTimeMillis,
                               int batchSize,
                               int maximumPoolSize) {
        this.async = new AsyncBatchThread<>(
            processor, periodTimeMillis, batchSize, maximumPoolSize
        );
    }

    /**
     * Puts an element to queue
     *
     * @param element the element
     */
    public boolean put(T element) {
        return !async.stopped.get() && async.queue.offer(element);
    }

    /**
     * Batch put elements to queue.
     *
     * @param elements the elements
     */
    public boolean put(T[] elements) {
        if (async.stopped.get() || elements == null || elements.length == 0) {
            return false;
        }

        for (T element : elements) {
            if (!async.queue.offer(element)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Batch put elements to queue.
     *
     * @param elements the list of elements
     */
    public boolean put(List<T> elements) {
        if (async.stopped.get() || elements == null || elements.isEmpty()) {
            return false;
        }

        for (T element : elements) {
            if (!async.queue.offer(element)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Do stop
     *
     * @return {@code true} if stop success
     */
    public boolean stop() {
        return async.stopped.compareAndSet(false, true);
    }

    public void stopAndAwait() throws InterruptedException {
        stop();
        while (!Threads.isStopped(async)) {
            Thread.sleep(async.periodTimeMillis);
        }
    }

    /**
     * Async batch consume into this alone thread
     */
    private static class AsyncBatchThread<T> extends Thread {
        private static final int MINIMUM_PERIOD_TIME_MILLIS = 9;

        // 单消费者用LinkedBlockingQueue,多消费者用ConcurrentLinkedQueue
        private final LinkedBlockingQueue<T> queue = new LinkedBlockingQueue<>();
        private final AtomicBoolean        stopped = new AtomicBoolean(false);

        private final BatchProcessor<T> processor; // 处理器
        private final int periodTimeMillis;        // 消费周期(毫秒)
        private final int sleepTimeMillis;         // 休眠时间
        private final int batchSize;               // 批量大小
        private final int asyncExecuteThreshold;   // 启用异步执行器的阈值
        private final int maximumPoolSize;         // 最大线程数

        private long nextRefreshTimeMillis = 0L;   // 下一次刷新时间

        /**
         * @param processor        批处理器
         * @param periodTimeMillis 处理周期(毫秒)
         * @param batchSize        批量大小
         * @param maximumPoolSize  最大线程数
         */
        private AsyncBatchThread(BatchProcessor<T> processor,
                                 int periodTimeMillis,
                                 int batchSize,
                                 int maximumPoolSize) {
            Assert.isTrue(
                periodTimeMillis >= MINIMUM_PERIOD_TIME_MILLIS,
                () -> "Period time millis must greater than " + MINIMUM_PERIOD_TIME_MILLIS + ", but actual " + periodTimeMillis
            );
            Assert.isTrue(batchSize > 0, "Batch size cannot negative number.");
            Assert.isTrue(maximumPoolSize > 0, "Maximum pool size cannot negative number.");

            this.processor = processor;
            this.periodTimeMillis = periodTimeMillis;
            this.sleepTimeMillis = (periodTimeMillis >>> 1);
            this.batchSize = batchSize;
            this.asyncExecuteThreshold = batchSize + (batchSize >>> 1);
            this.maximumPoolSize = maximumPoolSize;

            super.setName("async-batch-processor-thread-" + Integer.toHexString(hashCode()));
            super.setDaemon(false);
            super.start();
        }

        /**
         * thread inner run, don't to direct call this method
         * it is a thread and the alone thread
         */
        @Override
        public void run() {
            // async thread pool executor
            ThreadPoolExecutor asyncExecutor = null;
            ArrayList<T> list = new ArrayList<>(batchSize);

            for (int left = batchSize; ; ) {
                if (isEnd()) {
                    if (asyncExecutor != null) {
                        // wait a moment if async execute
                        try {
                            Thread.sleep(periodTimeMillis);
                        } catch (InterruptedException e) {
                            LOG.error("Thread#sleep occur error.", e);
                            Thread.currentThread().interrupt();
                        }
                    }

                    // double check
                    if (isEnd()) {
                        if (asyncExecutor != null) {
                            // destroy the async executor
                            ThreadPoolExecutors.shutdown(asyncExecutor, 3);
                        }

                        // exit for loop if end
                        break;
                    }
                }

                // 尽量不要使用queue.size(),时间复杂度O(n)
                if (!queue.isEmpty() && left > 0) {
                    left -= queue.drainTo(list, left);
                }

                long currentTimeMillis = System.currentTimeMillis();
                if (left == 0 || (!list.isEmpty() && (stopped.get() || currentTimeMillis >= nextRefreshTimeMillis))) {
                    if (asyncExecutor == null && left == 0 && queue.size() > asyncExecuteThreshold) {
                        asyncExecutor = ThreadPoolExecutors.builder()
                            .corePoolSize(1)
                            .maximumPoolSize(maximumPoolSize)
                            .workQueue(new LinkedBlockingQueue<>(2))
                            .keepAliveTimeSeconds(300)
                            .threadFactory(NamedThreadFactory.builder().prefix("async-batch-processor-worker").build())
                            .rejectedHandler(ThreadPoolExecutors.CALLER_RUNS)
                            .build();
                        LOG.info("Asnyc batch processor created thread pool executor: {}", new ThreadPoolMonitor(asyncExecutor));
                    }

                    if (asyncExecutor != null) {
                        // async thread pool execute
                        // task抛异常后:
                        //   execute输出错误信息,线程结束,后续任务会创建新线程执行,会抛出异常
                        //   submit不输出错误信息,线程继续分配执行其它任务,不会抛出异常,除非你调用Future.get()
                        final List<T> data = list;
                        asyncExecutor.submit(() -> processor.process(data, isEnd()));
                        list = new ArrayList<>(left = batchSize);
                    } else {
                        // current thread execute
                        processor.process(list, isEnd());
                        // reuse the list object
                        list.clear();
                        left = batchSize;
                    }

                    nextRefreshTimeMillis = currentTimeMillis + periodTimeMillis;
                } else if (!stopped.get()) {
                    try {
                        // to sleep for prevent endless loop
                        Thread.sleep(sleepTimeMillis);
                    } catch (InterruptedException e) {
                        LOG.error("Thread#sleep occur error.", e);
                        stopped.compareAndSet(false, true);
                        Thread.currentThread().interrupt();
                        break;
                    }
                }
            }
        }

        private boolean isEnd() {
            return stopped.get() && queue.isEmpty();
        }
    }

    @FunctionalInterface
    public interface BatchProcessor<T> {
        void process(List<T> t, boolean stopped);
    }

}


================================================
FILE: src/main/java/cn/ponfee/commons/concurrent/AsyncDelayedExecutor.java
================================================
/* __________              _____                                                *\
** \______   \____   _____/ ____\____   ____    Copyright (c) 2017-2023 Ponfee  **
**  |     ___/  _ \ /    \   __\/ __ \_/ __ \   http://www.ponfee.cn            **
**  |    |  (  <_> )   |  \  | \  ___/\  ___/   Apache License Version 2.0      **
**  |____|   \____/|___|  /__|  \___  >\___  >  http://www.apache.org/licenses/ **
**                      \/          \/     \/                                   **
\*                                                                              */

package cn.ponfee.commons.concurrent;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.DelayQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

/**
 * Async delayed executor
 *
 * @param <E> the element type
 * @author Ponfee
 */
public final class AsyncDelayedExecutor<E> extends Thread {

    private final static Logger LOG = LoggerFactory.getLogger(AsyncDelayedExecutor.class);

    private final Consumer<E> processor;            // 数据处理器
    private final ThreadPoolExecutor asyncExecutor; // 异步执行器

    private final DelayQueue<DelayedData<E>> queue = new DelayQueue<>();
    private final AtomicBoolean stopped = new AtomicBoolean(false);

    public AsyncDelayedExecutor(Consumer<E> processor) {
        this(1,
Download .txt
gitextract_2bawa1vq/

├── .editorconfig
├── .github/
│   └── workflows/
│       └── build-with-maven.yml
├── .gitignore
├── .mvn/
│   └── wrapper/
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── LICENSE
├── README.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── cn/
    │   │       └── ponfee/
    │   │           └── commons/
    │   │               ├── base/
    │   │               │   ├── Initializable.java
    │   │               │   ├── NoArgMethodInvoker.java
    │   │               │   ├── Predicates.java
    │   │               │   ├── PrimitiveTypes.java
    │   │               │   ├── Releasable.java
    │   │               │   ├── Symbol.java
    │   │               │   ├── TimestampProvider.java
    │   │               │   └── tuple/
    │   │               │       ├── Tuple.java
    │   │               │       ├── Tuple0.java
    │   │               │       ├── Tuple1.java
    │   │               │       ├── Tuple2.java
    │   │               │       ├── Tuple3.java
    │   │               │       ├── Tuple4.java
    │   │               │       ├── Tuple5.java
    │   │               │       ├── Tuple6.java
    │   │               │       ├── Tuple7.java
    │   │               │       ├── Tuple8.java
    │   │               │       └── Tuple9.java
    │   │               ├── collect/
    │   │               │   ├── ArrayHashKey.java
    │   │               │   ├── ByteArrayComparator.java
    │   │               │   ├── ByteArrayTrait.java
    │   │               │   ├── ByteArrayWrapper.java
    │   │               │   ├── Collects.java
    │   │               │   ├── Comparators.java
    │   │               │   ├── DelegatedIntSpliterator.java
    │   │               │   ├── DoubleListViewer.java
    │   │               │   ├── FilterableIterator.java
    │   │               │   ├── ImmutableArrayList.java
    │   │               │   ├── ImmutableHashList.java
    │   │               │   ├── LRUCache.java
    │   │               │   ├── Maps.java
    │   │               │   ├── StreamForker.java
    │   │               │   └── ValueSortedMap.java
    │   │               ├── concurrent/
    │   │               │   ├── AsyncBatchProcessor.java
    │   │               │   ├── AsyncDelayedExecutor.java
    │   │               │   ├── DelayedData.java
    │   │               │   ├── MultithreadExecutors.java
    │   │               │   ├── NamedThreadFactory.java
    │   │               │   ├── SingleThreadShutdownHook.java
    │   │               │   ├── ThreadPoolExecutors.java
    │   │               │   ├── ThreadPoolMonitor.java
    │   │               │   ├── Threads.java
    │   │               │   └── TracedRunnable.java
    │   │               ├── constrain/
    │   │               │   ├── ConstrainParam.java
    │   │               │   ├── Constraint.java
    │   │               │   ├── Constraints.java
    │   │               │   ├── FailFastValidatorFactoryBean.java
    │   │               │   ├── FieldValidator.java
    │   │               │   ├── Jsr303Validator.java
    │   │               │   ├── MethodValidator.java
    │   │               │   └── ParamValidator.java
    │   │               ├── dag/
    │   │               │   ├── DAGEdge.java
    │   │               │   ├── DAGExpressionParser.java
    │   │               │   └── DAGNode.java
    │   │               ├── data/
    │   │               │   ├── DataSourceFactory.java
    │   │               │   ├── DataSourceNaming.java
    │   │               │   ├── DruidDataSourceFactory.java
    │   │               │   ├── MultipleDataSourceAdvisor.java
    │   │               │   ├── MultipleDataSourceAspect.java
    │   │               │   ├── NamedDataSource.java
    │   │               │   └── lookup/
    │   │               │       ├── DataSourceLookup.java
    │   │               │       ├── MultipleCachedDataSource.java
    │   │               │       ├── MultipleDataSourceContext.java
    │   │               │       ├── MultipleFixedDataSource.java
    │   │               │       └── MultipleScalableDataSource.java
    │   │               ├── date/
    │   │               │   ├── CustomLocalDateTimeDeserializer.java
    │   │               │   ├── DatePeriods.java
    │   │               │   ├── Dates.java
    │   │               │   ├── JavaUtilDateFormat.java
    │   │               │   └── LocalDateTimeFormat.java
    │   │               ├── exception/
    │   │               │   ├── BaseCheckedException.java
    │   │               │   ├── BaseUncheckedException.java
    │   │               │   ├── ServerException.java
    │   │               │   ├── Throwables.java
    │   │               │   ├── UnauthorizedException.java
    │   │               │   └── UnimplementedException.java
    │   │               ├── export/
    │   │               │   ├── AbstractCsvExporter.java
    │   │               │   ├── AbstractDataExporter.java
    │   │               │   ├── AbstractSplitExporter.java
    │   │               │   ├── CellStyleOptions.java
    │   │               │   ├── ConsoleExporter.java
    │   │               │   ├── CsvFileExporter.java
    │   │               │   ├── CsvStringExporter.java
    │   │               │   ├── CsvWriteExporter.java
    │   │               │   ├── DataExporter.java
    │   │               │   ├── ExcelExporter.java
    │   │               │   ├── HtmlExporter.java
    │   │               │   ├── SplitCsvFileExporter.java
    │   │               │   ├── SplitExcelExporter.java
    │   │               │   ├── Table.java
    │   │               │   ├── Thead.java
    │   │               │   └── Tmeta.java
    │   │               ├── extract/
    │   │               │   ├── CsvExtractor.java
    │   │               │   ├── DataExtractor.java
    │   │               │   ├── DataExtractorBuilder.java
    │   │               │   ├── ExcelExtractor.java
    │   │               │   ├── ExtractableDataSource.java
    │   │               │   ├── ValidateResult.java
    │   │               │   └── streaming/
    │   │               │       ├── StreamingExcelExtractor.java
    │   │               │       └── xls/
    │   │               │           ├── HSSFStreamingCell.java
    │   │               │           ├── HSSFStreamingReader.java
    │   │               │           ├── HSSFStreamingRow.java
    │   │               │           ├── HSSFStreamingSheet.java
    │   │               │           └── HSSFStreamingWorkbook.java
    │   │               ├── http/
    │   │               │   ├── ContentType.java
    │   │               │   ├── Http.java
    │   │               │   ├── HttpException.java
    │   │               │   ├── HttpParams.java
    │   │               │   ├── HttpRequest.java
    │   │               │   └── HttpStatus.java
    │   │               ├── io/
    │   │               │   ├── ByteOrderMarks.java
    │   │               │   ├── CharsetDetector.java
    │   │               │   ├── Closeables.java
    │   │               │   ├── ExtendedGZIPOutputStream.java
    │   │               │   ├── FileTransformer.java
    │   │               │   ├── Files.java
    │   │               │   ├── GzipProcessor.java
    │   │               │   ├── HumanReadables.java
    │   │               │   ├── PrereadInputStream.java
    │   │               │   ├── StringPrintWriter.java
    │   │               │   ├── WrappedBufferedReader.java
    │   │               │   ├── WrappedBufferedWriter.java
    │   │               │   └── charset/
    │   │               │       ├── BytesDetector.java
    │   │               │       ├── CodepageDetector.java
    │   │               │       ├── JchardetDetector.java
    │   │               │       └── TikaDetector.java
    │   │               ├── jce/
    │   │               │   ├── CryptoProvider.java
    │   │               │   ├── DigestAlgorithms.java
    │   │               │   ├── ECParameters.java
    │   │               │   ├── HmacAlgorithms.java
    │   │               │   ├── Providers.java
    │   │               │   ├── RSACipherPaddings.java
    │   │               │   ├── RSASignAlgorithms.java
    │   │               │   ├── cert/
    │   │               │   │   ├── CertPKCS1Verifier.java
    │   │               │   │   ├── CertPKCS7Verifier.java
    │   │               │   │   ├── CertSignedVerifier.java
    │   │               │   │   ├── ObjectIdentifiers.java
    │   │               │   │   ├── RepairX500Principal.java
    │   │               │   │   ├── X509CertGenerator.java
    │   │               │   │   ├── X509CertInfo.java
    │   │               │   │   └── X509CertUtils.java
    │   │               │   ├── digest/
    │   │               │   │   ├── DigestUtils.java
    │   │               │   │   └── HmacUtils.java
    │   │               │   ├── implementation/
    │   │               │   │   ├── Cryptor.java
    │   │               │   │   ├── Key.java
    │   │               │   │   ├── NoopCryptor.java
    │   │               │   │   ├── digest/
    │   │               │   │   │   ├── RipeMD160Digest.java
    │   │               │   │   │   └── SHA1Digest.java
    │   │               │   │   ├── ecc/
    │   │               │   │   │   ├── ECCryptor.java
    │   │               │   │   │   ├── ECKey.java
    │   │               │   │   │   ├── ECPoint.java
    │   │               │   │   │   ├── EllipticCurve.java
    │   │               │   │   │   └── package-info.java
    │   │               │   │   ├── package-info.java
    │   │               │   │   ├── rsa/
    │   │               │   │   │   ├── AbstractRSACryptor.java
    │   │               │   │   │   ├── RSAHashCryptor.java
    │   │               │   │   │   ├── RSAKey.java
    │   │               │   │   │   ├── RSANoPaddingCryptor.java
    │   │               │   │   │   ├── RSAPKCS1PaddingCryptor.java
    │   │               │   │   │   ├── RSASigner.java
    │   │               │   │   │   └── package-info.java
    │   │               │   │   └── symmetric/
    │   │               │   │       └── RC4.java
    │   │               │   ├── package-info.java
    │   │               │   ├── passwd/
    │   │               │   │   ├── BCrypt.java
    │   │               │   │   ├── Crypt.java
    │   │               │   │   ├── PBKDF2.java
    │   │               │   │   └── SCrypt.java
    │   │               │   ├── pkcs/
    │   │               │   │   ├── CryptoMessageSyntax.java
    │   │               │   │   ├── PKCS1Signature.java
    │   │               │   │   └── PKCS7Signature.java
    │   │               │   ├── security/
    │   │               │   │   ├── DHKeyExchanger.java
    │   │               │   │   ├── DSASigner.java
    │   │               │   │   ├── ECDHKeyExchanger.java
    │   │               │   │   ├── ECDSASigner.java
    │   │               │   │   ├── KeyStoreResolver.java
    │   │               │   │   ├── RSACryptor.java
    │   │               │   │   ├── RSAPrivateKeys.java
    │   │               │   │   └── RSAPublicKeys.java
    │   │               │   ├── sm/
    │   │               │   │   ├── SM2.java
    │   │               │   │   ├── SM2KeyExchanger.java
    │   │               │   │   ├── SM3Digest.java
    │   │               │   │   └── SM4.java
    │   │               │   └── symmetric/
    │   │               │       ├── Algorithm.java
    │   │               │       ├── Mode.java
    │   │               │       ├── PBECryptor.java
    │   │               │       ├── PBECryptorBuilder.java
    │   │               │       ├── Padding.java
    │   │               │       ├── SymmetricCryptor.java
    │   │               │       └── SymmetricCryptorBuilder.java
    │   │               ├── json/
    │   │               │   ├── FastjsonMoney.java
    │   │               │   ├── FastjsonPropertyFilter.java
    │   │               │   ├── FastjsonTypeReferences.java
    │   │               │   ├── JacksonCurrencyUnit.java
    │   │               │   ├── JacksonDate.java
    │   │               │   ├── JacksonMoney.java
    │   │               │   ├── JacksonTypeReferences.java
    │   │               │   └── Jsons.java
    │   │               ├── limit/
    │   │               │   ├── current/
    │   │               │   │   ├── CurrentLimiter.java
    │   │               │   │   └── GuavaCurrentLimiter.java
    │   │               │   └── request/
    │   │               │       ├── ConcurrentMapRequestLimiter.java
    │   │               │       ├── HttpSessionRequestLimiter.java
    │   │               │       ├── RequestLimitException.java
    │   │               │       └── RequestLimiter.java
    │   │               ├── log/
    │   │               │   ├── LogAnnotation.java
    │   │               │   ├── LogInfo.java
    │   │               │   └── LogRecorder.java
    │   │               ├── math/
    │   │               │   ├── FailureRatioActuary.java
    │   │               │   ├── Maths.java
    │   │               │   ├── Numbers.java
    │   │               │   └── WrappedBigDecimal.java
    │   │               ├── model/
    │   │               │   ├── AbstractDataConverter.java
    │   │               │   ├── BaseEntity.java
    │   │               │   ├── CodeMsg.java
    │   │               │   ├── Form.java
    │   │               │   ├── MapDataConverter.java
    │   │               │   ├── Null.java
    │   │               │   ├── Page.java
    │   │               │   ├── PageBoundsResolver.java
    │   │               │   ├── PageHandler.java
    │   │               │   ├── PageParameter.java
    │   │               │   ├── PaginationHtmlBuilder.java
    │   │               │   ├── RemovableTypedKeyValue.java
    │   │               │   ├── RemovableTypedMap.java
    │   │               │   ├── Result.java
    │   │               │   ├── ResultCode.java
    │   │               │   ├── SearchAfter.java
    │   │               │   ├── SortField.java
    │   │               │   ├── SortOrder.java
    │   │               │   ├── ToJsonString.java
    │   │               │   ├── TypedHashMap.java
    │   │               │   ├── TypedKeyValue.java
    │   │               │   ├── TypedLinkedHashMap.java
    │   │               │   ├── TypedLinkedMultiValueMap.java
    │   │               │   ├── TypedMap.java
    │   │               │   ├── TypedMapWrapper.java
    │   │               │   └── TypedParameter.java
    │   │               ├── mybatis/
    │   │               │   ├── MultipleSqlSessionTemplate.java
    │   │               │   ├── PackagesSqlSessionFactoryBean.java
    │   │               │   ├── SqlHelper.java
    │   │               │   └── SqlMapper.java
    │   │               ├── parser/
    │   │               │   ├── DateUDF.java
    │   │               │   └── ELParser.java
    │   │               ├── pdf/
    │   │               │   ├── PdfWaterMark.java
    │   │               │   └── sign/
    │   │               │       ├── PdfSignature.java
    │   │               │       ├── Signer.java
    │   │               │       └── Stamp.java
    │   │               ├── reflect/
    │   │               │   ├── BeanConverts.java
    │   │               │   ├── BeanCopiers.java
    │   │               │   ├── BeanMaps.java
    │   │               │   ├── ClassUtils.java
    │   │               │   ├── Fields.java
    │   │               │   └── GenericUtils.java
    │   │               ├── resource/
    │   │               │   ├── ClassPathResourceLoader.java
    │   │               │   ├── FileSystemResourceLoader.java
    │   │               │   ├── Resource.java
    │   │               │   ├── ResourceLoaderFacade.java
    │   │               │   ├── ResourceScanner.java
    │   │               │   └── WebappResourceLoader.java
    │   │               ├── schema/
    │   │               │   ├── DataColumn.java
    │   │               │   ├── DataStructure.java
    │   │               │   ├── DataStructures.java
    │   │               │   ├── DataTable.java
    │   │               │   ├── DataType.java
    │   │               │   ├── GridTable.java
    │   │               │   ├── NormalStructure.java
    │   │               │   ├── PlainStructure.java
    │   │               │   ├── TableStructure.java
    │   │               │   └── json/
    │   │               │       ├── JsonExtractUtils.java
    │   │               │       ├── JsonId.java
    │   │               │       └── JsonTree.java
    │   │               ├── serial/
    │   │               │   ├── ByteArraySerializer.java
    │   │               │   ├── ByteArrayTraitSerializer.java
    │   │               │   ├── FstSerializer.java
    │   │               │   ├── HessianSerializer.java
    │   │               │   ├── JdkSerializer.java
    │   │               │   ├── JsonSerializer.java
    │   │               │   ├── KryoSerializer.java
    │   │               │   ├── NullSerializer.java
    │   │               │   ├── ProtostuffSerializer.java
    │   │               │   ├── SerializationException.java
    │   │               │   ├── Serializer.java
    │   │               │   ├── StringSerializer.java
    │   │               │   ├── ToStringSerializer.java
    │   │               │   └── WrappedSerializer.java
    │   │               ├── spring/
    │   │               │   ├── BaseController.java
    │   │               │   ├── JdbcTemplateWrapper.java
    │   │               │   ├── LocalizedMethodArgumentResolver.java
    │   │               │   ├── LocalizedMethodArguments.java
    │   │               │   ├── MarkRpcController.java
    │   │               │   ├── PageMethodArgumentResolver.java
    │   │               │   ├── ProxyUtils.java
    │   │               │   ├── RpcController.java
    │   │               │   ├── SpringContextHolder.java
    │   │               │   ├── SpringUtils.java
    │   │               │   ├── TransactionUtils.java
    │   │               │   ├── TypedMapMethodArgumentResolver.java
    │   │               │   ├── YamlProperties.java
    │   │               │   └── YamlPropertySourceFactory.java
    │   │               ├── tree/
    │   │               │   ├── BaseNode.java
    │   │               │   ├── FlatNode.java
    │   │               │   ├── MapTreeTrait.java
    │   │               │   ├── NodeId.java
    │   │               │   ├── NodePath.java
    │   │               │   ├── PlainNode.java
    │   │               │   ├── SiblingNodesComparator.java
    │   │               │   ├── TreeNode.java
    │   │               │   ├── TreeNodeBuilder.java
    │   │               │   ├── TreeTrait.java
    │   │               │   └── print/
    │   │               │       ├── BinaryTreePrinter.java
    │   │               │       ├── BinaryTreePrinterBuilder.java
    │   │               │       └── MultiwayTreePrinter.java
    │   │               ├── util/
    │   │               │   ├── Asserts.java
    │   │               │   ├── Base58.java
    │   │               │   ├── Base64UrlSafe.java
    │   │               │   ├── Bytes.java
    │   │               │   ├── CRC16.java
    │   │               │   ├── Captchas.java
    │   │               │   ├── Colors.java
    │   │               │   ├── ConsistentHash.java
    │   │               │   ├── CurrencyEnum.java
    │   │               │   ├── Enums.java
    │   │               │   ├── ExtendMethodHandles.java
    │   │               │   ├── FailRetryTemplate.java
    │   │               │   ├── Holder.java
    │   │               │   ├── IdcardResolver.java
    │   │               │   ├── ImageUtils.java
    │   │               │   ├── LazyLoader.java
    │   │               │   ├── MavenProjects.java
    │   │               │   ├── MessageFormats.java
    │   │               │   ├── Money.java
    │   │               │   ├── Networks.java
    │   │               │   ├── ObjectUtils.java
    │   │               │   ├── PropertiesUtils.java
    │   │               │   ├── RegexUtils.java
    │   │               │   ├── SecureRandoms.java
    │   │               │   ├── Snowflake.java
    │   │               │   ├── SqlUtils.java
    │   │               │   ├── Strings.java
    │   │               │   ├── SynchronizedCaches.java
    │   │               │   ├── TimingWheel.java
    │   │               │   ├── URLCodes.java
    │   │               │   ├── UuidUtils.java
    │   │               │   ├── Wechats.java
    │   │               │   └── ZipUtils.java
    │   │               ├── web/
    │   │               │   ├── AbstractWebExceptionHandler.java
    │   │               │   ├── DevicePlatform.java
    │   │               │   ├── DeviceType.java
    │   │               │   ├── GlobalExceptionHandler.java
    │   │               │   ├── GlobalExceptionResolver.java
    │   │               │   ├── LiteDevice.java
    │   │               │   ├── LiteDeviceResolver.java
    │   │               │   ├── WebContext.java
    │   │               │   └── WebUtils.java
    │   │               ├── ws/
    │   │               │   ├── JAXWS.java
    │   │               │   └── adapter/
    │   │               │       ├── ListMapAdapter.java
    │   │               │       ├── ListMapNormalAdapter.java
    │   │               │       ├── MapAdapter.java
    │   │               │       ├── MapNormalAdapter.java
    │   │               │       ├── MarshalJsonAdapter.java
    │   │               │       ├── MarshalJsonResult.java
    │   │               │       ├── MarshalJsonXml.java
    │   │               │       ├── ResultDataJsonAdapter.java
    │   │               │       ├── ResultDataJsonPageAdapter.java
    │   │               │       ├── ResultListAdapter.java
    │   │               │       ├── ResultListMapAdapter.java
    │   │               │       ├── ResultListMapNormalAdapter.java
    │   │               │       ├── ResultListObjectAdapter.java
    │   │               │       ├── ResultListObjectArrayAdapter.java
    │   │               │       ├── ResultListStringAdapter.java
    │   │               │       ├── ResultMapAdapter.java
    │   │               │       ├── ResultMapNormalAdapter.java
    │   │               │       ├── ResultPageAdapter.java
    │   │               │       ├── ResultPageMapAdapter.java
    │   │               │       ├── ResultPageMapAdapter.java.bak
    │   │               │       ├── ResultPageMapNormalAdapter.java
    │   │               │       ├── ResultPageObjectAdapter.java
    │   │               │       ├── ResultPageObjectArrayAdapter.java
    │   │               │       ├── ResultSetAdapter.java
    │   │               │       ├── ResultSetStringAdapter.java
    │   │               │       ├── model/
    │   │               │       │   ├── ArrayItem.java
    │   │               │       │   ├── MapEntry.java
    │   │               │       │   ├── MapItem.java
    │   │               │       │   ├── MapItemArray.java
    │   │               │       │   ├── TransitPage.java
    │   │               │       │   └── package-info.java
    │   │               │       └── package-info.java
    │   │               └── xml/
    │   │                   ├── SimpleXmlHandler.java
    │   │                   ├── XmlException.java
    │   │                   ├── XmlMap.java
    │   │                   ├── XmlReader.java
    │   │                   └── XmlWriter.java
    │   └── resources/
    │       ├── log4j2.xml.template
    │       └── mybatis-conf.xml.template
    └── test/
        ├── java/
        │   ├── cn/
        │   │   └── ponfee/
        │   │       └── commons/
        │   │           ├── Options.java
        │   │           ├── SpringBaseTest.java
        │   │           ├── SpringBootTest.java
        │   │           ├── WebServiceCxfTest.java
        │   │           ├── WebServiceJaxTest.java
        │   │           ├── base/
        │   │           │   ├── MethodInvokerTest.java
        │   │           │   └── TupleTest.java
        │   │           ├── boolm/
        │   │           │   ├── GuavaBloomFilterTest.java
        │   │           │   ├── JdkBloomFilter.java
        │   │           │   ├── RedisBloomFilterTest.java
        │   │           │   └── VisitedFrontier.java
        │   │           ├── cache/
        │   │           │   ├── Cache.java
        │   │           │   ├── CacheBuilder.java
        │   │           │   ├── CacheValue.java
        │   │           │   ├── RemovalListener.java
        │   │           │   └── RemovalNotification.java
        │   │           ├── collects/
        │   │           │   ├── AbstractArrayList.java
        │   │           │   ├── ByteArrayList.java
        │   │           │   ├── ByteArrayListTest.java
        │   │           │   ├── DoubleListViewerTest.java
        │   │           │   ├── ImmutableArrayList1.java
        │   │           │   ├── ImmutableArrayListTest.java
        │   │           │   ├── IntArrayList.java
        │   │           │   ├── ListTest.java
        │   │           │   └── LongArrayList.java
        │   │           ├── concurrent/
        │   │           │   ├── ThreadPoolTest.java
        │   │           │   └── ThreadPoolTestUtils.java
        │   │           ├── dag/
        │   │           │   └── DAGExpressionParserTest.java
        │   │           ├── data/
        │   │           │   ├── ExtendedDruidPasswordCallback.java
        │   │           │   └── JSONExtractUtilsTest.java
        │   │           ├── date/
        │   │           │   ├── DateFormatTest.java
        │   │           │   ├── DatePeriodCalculatorTest.java
        │   │           │   ├── DatePeriodsTest.java
        │   │           │   ├── DatesTest.java
        │   │           │   ├── JavaUtilDateFormatTest.java
        │   │           │   └── LocalDateTimeFormatTest.java
        │   │           ├── event/
        │   │           │   └── EventBusTest.java
        │   │           ├── exception/
        │   │           │   └── ThrowablesTest.java
        │   │           ├── innerclass/
        │   │           │   ├── MyInterface.java
        │   │           │   └── TryUsingAnonymousClass.java
        │   │           ├── io/
        │   │           │   ├── BeforeReadInputStreamTest.java
        │   │           │   ├── CopyrightTest.java
        │   │           │   ├── FileTransformerTest.java
        │   │           │   ├── FileTypeDetector.java
        │   │           │   ├── FilesTest.java
        │   │           │   ├── WindowsBomTest.java
        │   │           │   ├── WrappedBufferedReaderTest.java
        │   │           │   └── file/
        │   │           │       ├── ASCII.txt
        │   │           │       ├── Big5.txt
        │   │           │       ├── EUC-KR.txt
        │   │           │       ├── GB18030.txt
        │   │           │       ├── GB2312.txt
        │   │           │       ├── GBK.txt
        │   │           │       ├── KOI8-R.txt
        │   │           │       ├── Shift_JIS.txt
        │   │           │       ├── UTF-8-BOM.txt
        │   │           │       └── UTF-8.txt
        │   │           ├── jce/
        │   │           │   ├── DesgitTest.java
        │   │           │   ├── PBECryptorTest.java
        │   │           │   ├── PasswdTest.java
        │   │           │   ├── SCryptTester.java
        │   │           │   └── security/
        │   │           │       ├── DHKeyExchangerTest.java
        │   │           │       ├── DSASignerTest.java
        │   │           │       ├── ECDHKeyExchangerTest.java
        │   │           │       ├── ECDSASignerTest.java
        │   │           │       └── RSAPrivateKeysTest.java
        │   │           ├── json/
        │   │           │   ├── BooleanPojoTest.java
        │   │           │   ├── FastJsonUtils.java
        │   │           │   ├── JacksonIgnore.java
        │   │           │   └── JsonsTest.java
        │   │           ├── loadbalance/
        │   │           │   ├── AbstractLoadBalance.java
        │   │           │   ├── HashedLoadBalance.java
        │   │           │   ├── LeastActiveLoadBalance.java
        │   │           │   ├── RandomLoadBalance.java
        │   │           │   ├── RoundRobinLoadBalance.java
        │   │           │   ├── WeightRandomLoadBalance.java
        │   │           │   ├── WeightRoundRobinLoadBalance.java
        │   │           │   └── package-info.java
        │   │           ├── log/
        │   │           │   ├── JclLogger.java
        │   │           │   ├── JulLogger.java
        │   │           │   ├── Log4jLogger.java
        │   │           │   └── Slf4jLogger.java
        │   │           ├── model/
        │   │           │   └── ParamsTest.java
        │   │           ├── mybatis/
        │   │           │   └── SQLMapperTest.java
        │   │           ├── reflect/
        │   │           │   ├── ClassA.java
        │   │           │   ├── FieldsTest.java
        │   │           │   ├── GenericExtendsTest.java
        │   │           │   ├── GenericTest.java
        │   │           │   └── GenericTest2.java
        │   │           ├── serial/
        │   │           │   ├── JacksonObjectMapperTest.java
        │   │           │   ├── PersonProtobuf.java
        │   │           │   ├── ProtobufClient.java
        │   │           │   ├── ProtobufServer.java
        │   │           │   ├── SerializerTester.java
        │   │           │   └── person.proto
        │   │           └── util/
        │   │               ├── BitSetTest.java
        │   │               ├── BloomFilterTest.java
        │   │               ├── ELParserTest.java
        │   │               ├── EscapeRegexTest.java
        │   │               ├── FibonacciTest.java
        │   │               ├── ForEachTest.java
        │   │               ├── IdcardResolverTest.java
        │   │               ├── MathsTest.java
        │   │               ├── MoneyTest.java
        │   │               ├── ObjectUtilsTest.java
        │   │               ├── ProxyTest.java
        │   │               ├── RegexUtilsTest.java
        │   │               ├── SqlUtilsTest.java
        │   │               ├── StreamForkerTest.java
        │   │               ├── StringsTest.java
        │   │               └── TestSerialize.java
        │   └── test/
        │       ├── Cat.java
        │       ├── CsvWrappedCharTest.java
        │       ├── CustomClassLoader.java
        │       ├── GuavaCacheRefreshTest.java
        │       ├── Test1.java
        │       ├── Test2.java
        │       ├── Test3.java
        │       ├── TestBean.java
        │       ├── TestSynthetic.java
        │       ├── ThrowEggsTest.java
        │       ├── concurrent/
        │       │   ├── AsnycBatchProcessorTest.java
        │       │   ├── ForkJoinPoolTest1.java
        │       │   ├── ForkJoinPoolTest2.java
        │       │   ├── InheritableThreadLocalTest.java
        │       │   ├── InheritableThreadLocalTest2.java
        │       │   ├── ReadWriteLock.java
        │       │   ├── TestThread.java
        │       │   ├── TheadPoolExecTester.java
        │       │   └── TtlTest.java
        │       ├── constraint/
        │       │   └── TestConstraint.java
        │       ├── disruptor/
        │       │   ├── InParkingDataEvent.java
        │       │   ├── Main.java
        │       │   ├── ParkingDataInDbHandler.java
        │       │   ├── ParkingDataSmsHandler.java
        │       │   ├── ParkingDataToKafkaHandler.java
        │       │   └── Sequence.java
        │       ├── elasticsearch/
        │       │   ├── CateEsDaoImpl.java
        │       │   ├── EsClientFactory.java
        │       │   ├── EsDbUtils.java
        │       │   └── EsQueryObj.java
        │       ├── export/
        │       │   ├── ConsoleExportTest.java
        │       │   ├── ExportTester.java
        │       │   └── ExportTester2.java
        │       ├── extract/
        │       │   ├── ExampleEventUserModel.java
        │       │   ├── ExcelExtractorTest.java
        │       │   ├── TestHSSFStreaming.java
        │       │   ├── XLSEventTest.java
        │       │   ├── XLSX2CSV.java
        │       │   ├── XLSXEventTest.java
        │       │   ├── advices_export.xls
        │       │   └── writeTest2.xls
        │       ├── http/
        │       │   ├── HttpClientUtils.java
        │       │   ├── HttpParamsTest.java
        │       │   ├── HttpPostTester.java
        │       │   ├── HttpTester.java
        │       │   ├── NewApiTester.java
        │       │   ├── OldApiTester.java
        │       │   ├── TestHttpUploadFile.java
        │       │   ├── TestJsoup.java
        │       │   ├── TestOpenApi.java
        │       │   ├── WSClientTester.java
        │       │   ├── jdk/
        │       │   │   ├── HTTPServerSample.java
        │       │   │   └── WSProvider.java
        │       │   └── ssl/
        │       │       ├── HttpsCert.java
        │       │       ├── HttpsClient.java
        │       │       ├── SSLClient.java
        │       │       └── SSLServer.java
        │       ├── jce/
        │       │   ├── Argon2Test.java
        │       │   ├── CryptoProviderTest.java
        │       │   ├── DigestTest.java
        │       │   ├── Paillier.java
        │       │   ├── cert/
        │       │   │   ├── CryptoMessageSyntaxTester.java
        │       │   │   ├── KeyStoreResolverTester.java
        │       │   │   ├── SM2CertTest.java
        │       │   │   ├── TestPem.java
        │       │   │   ├── X500NameTest.java
        │       │   │   └── X509CertUtilsTester.java
        │       │   ├── crypto/
        │       │   │   ├── EncryptTester.java
        │       │   │   └── RSACryptoTester.java
        │       │   ├── demo/
        │       │   │   ├── CertService.java
        │       │   │   ├── CreateCert.java
        │       │   │   └── GenX509Cert.java
        │       │   ├── ecc0/
        │       │   │   ├── CryptoInputStream.java
        │       │   │   ├── CryptoOutputStream.java
        │       │   │   ├── ECCryptor.java.bak
        │       │   │   ├── ECCryptorTest.java
        │       │   │   ├── EllipticCurveTest.java
        │       │   │   ├── Login.java
        │       │   │   ├── Main.java
        │       │   │   ├── Screen.java
        │       │   │   └── View.java
        │       │   ├── ecc2/
        │       │   │   ├── BaseConvert.java
        │       │   │   ├── CurveParameters.java
        │       │   │   ├── PrivateKey.java
        │       │   │   ├── PrivateKeyTest.java
        │       │   │   ├── PublicKey.java
        │       │   │   ├── PublicKeyTest.java
        │       │   │   ├── UnsupportedBaseException.java
        │       │   │   └── Utils.java
        │       │   ├── rsa/
        │       │   │   ├── RSAKeyTest.java
        │       │   │   ├── RSASignerTest.java
        │       │   │   └── RSAryptorTest.java
        │       │   ├── sha1/
        │       │   │   └── SHA1BrokenTest.java
        │       │   └── sm/
        │       │       ├── SM2KeyExchangeTest.java
        │       │       ├── SM2Test.java
        │       │       ├── SM3DigestTest.java
        │       │       └── SM4Test.java
        │       ├── log4j/
        │       │   └── TestLog4j.java
        │       ├── model/
        │       │   ├── PageInfo.java
        │       │   └── PagePlugin.java
        │       ├── pdf/
        │       │   ├── ItextUtil.java
        │       │   ├── PdfP7Sign.java
        │       │   └── TestPdfSign.java
        │       ├── qrcode/
        │       │   ├── Qrcode.java
        │       │   └── QrcodeTest.java
        │       ├── reflect/
        │       │   ├── ClassUtilsTest.java
        │       │   └── ProxyTest.java
        │       ├── swing/
        │       │   ├── SM2Crypto.java
        │       │   └── WebBrowser.java
        │       ├── tree/
        │       │   ├── NodePathSerialTest.java
        │       │   ├── NodePathTest.java
        │       │   ├── NodeTreeTest.java
        │       │   └── TreeNodePrinterTest.java
        │       └── utils/
        │           ├── AtomicStampedReferenceTest.java
        │           ├── Base58Test.java
        │           ├── Base64.java
        │           ├── BytesTest.java
        │           ├── FloatContent.java
        │           ├── GuavaCacheRefreshTest.java
        │           ├── GuavaCacheTest.java
        │           ├── Java8DateTimeTester.java
        │           ├── MapToObjTest.java
        │           ├── NumbersTest.java
        │           ├── ObjectUtilsTest.java
        │           ├── OptionalTest.java
        │           ├── ProjectFileUtilsTester.java
        │           ├── RepeatableAnn.java
        │           ├── SimpleXmlHandlerTest.java
        │           ├── TempTest.java
        │           ├── Test1.java
        │           ├── Test2.java
        │           ├── TestBeanCopy.java
        │           ├── TestCache.java
        │           ├── TestCost.java
        │           ├── TestInterrupt.java
        │           ├── TestLock.java
        │           ├── TestXmlReader.java
        │           └── Ztzip.java
        └── resources/
            ├── abc.xlsx
            ├── ca.pfx
            ├── cacert.pem
            ├── cas_test.pfx
            ├── copy-right.txt
            ├── csv.csv
            ├── log/
            │   ├── log4j.properties
            │   ├── log4j.properties.bak
            │   ├── log4j2.xml
            │   └── logback.xml
            ├── signer.xsd
            ├── signers.xml
            ├── sm2-1.cer
            ├── sm2-2.cer
            ├── sm2-crypto.cer
            ├── sm2-root.cer
            ├── subject.pfx
            └── test.txt
Download .txt
Showing preview only (519K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6451 symbols across 601 files)

FILE: src/main/java/cn/ponfee/commons/base/Initializable.java
  type Initializable (line 16) | @FunctionalInterface
    method init (line 21) | void init();
    method init (line 23) | static void init(Object caller) {

FILE: src/main/java/cn/ponfee/commons/base/NoArgMethodInvoker.java
  class NoArgMethodInvoker (line 22) | public final class NoArgMethodInvoker {
    method NoArgMethodInvoker (line 29) | public NoArgMethodInvoker(@Nonnull String... methodNames) {
    method invoke (line 36) | public void invoke(Object caller) {

FILE: src/main/java/cn/ponfee/commons/base/Predicates.java
  type Predicates (line 24) | public enum Predicates {
    method Predicates (line 36) | Predicates(int value, String desc) {
    method value (line 42) | public int value() {
    method code (line 46) | public char code() {
    method state (line 50) | public boolean state() {
    method desc (line 54) | public String desc() {
    method equals (line 59) | public boolean equals(Integer value) {
    method equals (line 63) | public boolean equals(int value) {
    method equals (line 70) | public boolean equals(String code) {
    method equals (line 82) | public boolean equals(Character code) {
    method equals (line 86) | public boolean equals(char code) {
    method equals (line 94) | public boolean equals(Boolean state) {
    method equals (line 98) | public boolean equals(boolean state) {
    method equals (line 102) | public boolean equals(Predicates other) {
    method yes (line 107) | public static boolean yes(Integer value) {
    method yes (line 111) | public static boolean yes(int value) {
    method yes (line 115) | public static boolean yes(String code) {
    method yes (line 119) | public static boolean yes(Character code) {
    method yes (line 123) | public static boolean yes(char code) {
    method yes (line 127) | public static boolean yes(Boolean state) {
    method yes (line 131) | public static boolean yes(boolean state) {
    method yes (line 135) | public static boolean yes(Predicates other) {
    method no (line 140) | public static boolean no(Integer value) {
    method no (line 144) | public static boolean no(int value) {
    method no (line 148) | public static boolean no(String code) {
    method no (line 152) | public static boolean no(Character code) {
    method no (line 156) | public static boolean no(char code) {
    method no (line 160) | public static boolean no(Boolean state) {
    method no (line 164) | public static boolean no(boolean state) {
    method no (line 168) | public static boolean no(Predicates other) {
    method of (line 173) | public static Predicates of(Integer value) {
    method of (line 177) | public static Predicates of(int value) {
    method of (line 181) | public static Predicates of(String code) {
    method of (line 185) | public static Predicates of(Character code) {
    method of (line 189) | public static Predicates of(char code) {
    method of (line 193) | public static Predicates of(Boolean state) {
    method of (line 197) | public static Predicates of(boolean state) {
    method not (line 201) | public static <T> Predicate<T> not(Predicate<T> target) {

FILE: src/main/java/cn/ponfee/commons/base/PrimitiveTypes.java
  type PrimitiveTypes (line 29) | public enum PrimitiveTypes {
    method PrimitiveTypes (line 51) | PrimitiveTypes(Class<?> wrapper, byte value, byte castable) {
    method PrimitiveTypes (line 55) | PrimitiveTypes(Class<?> wrapper, byte value, byte castable, int size) {
    method primitive (line 65) | public Class<?> primitive() {
    method wrapper (line 69) | public Class<?> wrapper() {
    method size (line 73) | public int size() {
    method isCastable (line 83) | public boolean isCastable(PrimitiveTypes target) {
    method ofPrimitive (line 87) | public static PrimitiveTypes ofPrimitive(Class<?> primitive) {
    method ofWrapper (line 91) | public static PrimitiveTypes ofWrapper(Class<?> wrapper) {
    method ofPrimitiveOrWrapper (line 95) | public static PrimitiveTypes ofPrimitiveOrWrapper(Class<?> primitive) {
    method allPrimitiveTypes (line 99) | public static Set<Class<?>> allPrimitiveTypes() {
    method allWrapperTypes (line 103) | public static Set<Class<?>> allWrapperTypes() {
    method isWrapperType (line 107) | public static boolean isWrapperType(Class<?> primitive) {
    method wrap (line 111) | public static <T> Class<T> wrap(Class<T> type) {
    method unwrap (line 116) | public static <T> Class<T> unwrap(Class<T> type) {
    class Hide (line 121) | private static class Hide {

FILE: src/main/java/cn/ponfee/commons/base/Releasable.java
  type Releasable (line 18) | @FunctionalInterface
    method release (line 26) | void release();
    method release (line 28) | static void release(Object caller) {
    method isReleased (line 56) | default boolean isReleased() {

FILE: src/main/java/cn/ponfee/commons/base/Symbol.java
  class Symbol (line 16) | public final class Symbol {
    type Str (line 18) | public interface Str {
    type Char (line 105) | public interface Char {

FILE: src/main/java/cn/ponfee/commons/base/TimestampProvider.java
  type TimestampProvider (line 16) | @FunctionalInterface
    method get (line 23) | long get();

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple.java
  class Tuple (line 25) | public abstract class Tuple implements Comparable<Object>, Iterable<Obje...
    method get (line 34) | public abstract <T> T get(int index);
    method set (line 42) | public abstract <T> void set(T value, int index);
    method copy (line 49) | public abstract <T extends Tuple> T copy();
    method length (line 56) | public abstract int length();
    method toArray (line 64) | public final Object[] toArray() {
    method toString (line 78) | @Override
    method hashCode (line 88) | @Override
    method equals (line 108) | @Override
    method equals (line 133) | public final boolean equals(Object... elements) {
    method compareTo (line 146) | @Override
    method toList (line 173) | public List<Object> toList() {
    method iterator (line 185) | @Override
    method spliterator (line 191) | @Override
    method join (line 205) | public final String join(CharSequence delimiter,
    class TupleIterator (line 224) | private class TupleIterator<T> implements Iterator<T> {
      method hasNext (line 228) | @Override
      method next (line 233) | @Override
      method remove (line 241) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple0.java
  class Tuple0 (line 18) | public final class Tuple0 extends Tuple {
    method Tuple0 (line 22) | public Tuple0() {
    method of (line 25) | public static Tuple0 of() {
    method get (line 29) | @Override
    method set (line 34) | @Override
    method length (line 39) | @Override
    method copy (line 44) | @Override
    method toList (line 49) | @Override
    method iterator (line 54) | @Override
    method spliterator (line 59) | @Override
    method readResolve (line 64) | private Object readResolve() {

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple1.java
  class Tuple1 (line 16) | public final class Tuple1<A> extends Tuple {
    method Tuple1 (line 21) | public Tuple1(A a) {
    method of (line 25) | public static <A> Tuple1<A> of(A a) {
    method get (line 29) | @Override
    method set (line 38) | @Override
    method length (line 47) | @Override
    method copy (line 52) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple2.java
  class Tuple2 (line 16) | public final class Tuple2<A, B> extends Tuple {
    method Tuple2 (line 22) | public Tuple2(A a, B b) {
    method of (line 27) | public static <A, B> Tuple2<A, B> of(A a, B b) {
    method get (line 31) | @Override
    method set (line 40) | @Override
    method length (line 49) | @Override
    method copy (line 54) | @Override
    method swap (line 64) | public Tuple2<B, A> swap() {

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple3.java
  class Tuple3 (line 16) | public final class Tuple3<A, B, C> extends Tuple {
    method Tuple3 (line 23) | public Tuple3(A a, B b, C c) {
    method of (line 29) | public static <A, B, C> Tuple3<A, B, C> of(A a, B b, C c) {
    method get (line 33) | @Override
    method set (line 43) | @Override
    method length (line 53) | @Override
    method copy (line 58) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple4.java
  class Tuple4 (line 16) | public final class Tuple4<A, B, C, D> extends Tuple {
    method Tuple4 (line 24) | public Tuple4(A a, B b, C c, D d) {
    method of (line 31) | public static <A, B, C, D> Tuple4<A, B, C, D> of(A a, B b, C c, D d) {
    method get (line 35) | @Override
    method set (line 46) | @Override
    method length (line 57) | @Override
    method copy (line 62) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple5.java
  class Tuple5 (line 16) | public final class Tuple5<A, B, C, D, E> extends Tuple {
    method Tuple5 (line 25) | public Tuple5(A a, B b, C c, D d, E e) {
    method of (line 33) | public static <A, B, C, D, E> Tuple5<A, B, C, D, E> of(A a, B b, C c, ...
    method get (line 37) | @Override
    method set (line 49) | @Override
    method length (line 61) | @Override
    method copy (line 66) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple6.java
  class Tuple6 (line 16) | public final class Tuple6<A, B, C, D, E, F> extends Tuple {
    method Tuple6 (line 26) | public Tuple6(A a, B b, C c, D d, E e, F f) {
    method of (line 35) | public static <A, B, C, D, E, F> Tuple6<A, B, C, D, E, F> of(A a, B b,...
    method get (line 39) | @Override
    method set (line 52) | @Override
    method length (line 65) | @Override
    method copy (line 70) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple7.java
  class Tuple7 (line 16) | public final class Tuple7<A, B, C, D, E, F, G> extends Tuple {
    method Tuple7 (line 27) | public Tuple7(A a, B b, C c, D d, E e, F f, G g) {
    method of (line 37) | public static <A, B, C, D, E, F, G> Tuple7<A, B, C, D, E, F, G> of(A a...
    method get (line 41) | @Override
    method set (line 55) | @Override
    method length (line 69) | @Override
    method copy (line 74) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple8.java
  class Tuple8 (line 16) | public final class Tuple8<A, B, C, D, E, F, G, H> extends Tuple {
    method Tuple8 (line 28) | public Tuple8(A a, B b, C c, D d, E e, F f, G g, H h) {
    method of (line 39) | public static <A, B, C, D, E, F, G, H> Tuple8<A, B, C, D, E, F, G, H> ...
    method get (line 43) | @Override
    method set (line 58) | @Override
    method length (line 73) | @Override
    method copy (line 78) | @Override

FILE: src/main/java/cn/ponfee/commons/base/tuple/Tuple9.java
  class Tuple9 (line 16) | public final class Tuple9<A, B, C, D, E, F, G, H, I> extends Tuple {
    method Tuple9 (line 29) | public Tuple9(A a, B b, C c, D d, E e, F f, G g, H h, I i) {
    method of (line 41) | public static <A, B, C, D, E, F, G, H, I> Tuple9<A, B, C, D, E, F, G, ...
    method get (line 45) | @Override
    method set (line 61) | @Override
    method length (line 77) | @Override
    method copy (line 82) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/ArrayHashKey.java
  class ArrayHashKey (line 21) | public final class ArrayHashKey implements java.io.Serializable, Compara...
    method ArrayHashKey (line 27) | public ArrayHashKey(Object... key) {
    method of (line 31) | public static ArrayHashKey of(Object... key) {
    method equals (line 35) | @Override
    method hashCode (line 43) | @Override
    method compareTo (line 48) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/ByteArrayComparator.java
  class ByteArrayComparator (line 18) | public final class ByteArrayComparator {
    method compareTo (line 20) | public static int compareTo(final byte[] left, final byte[] right) {
    method compareTo (line 24) | public static int compareTo(byte[] buffer1, int offset1, int length1,

FILE: src/main/java/cn/ponfee/commons/collect/ByteArrayTrait.java
  class ByteArrayTrait (line 18) | public abstract class ByteArrayTrait {
    method ByteArrayTrait (line 20) | public ByteArrayTrait(byte[] array) {}
    method toByteArray (line 27) | public abstract byte[] toByteArray();

FILE: src/main/java/cn/ponfee/commons/collect/ByteArrayWrapper.java
  class ByteArrayWrapper (line 23) | public final class ByteArrayWrapper implements java.io.Serializable, Com...
    method ByteArrayWrapper (line 29) | public ByteArrayWrapper(Byte... array) {
    method ByteArrayWrapper (line 33) | public ByteArrayWrapper(byte... array) {
    method of (line 38) | public static ByteArrayWrapper of(byte... array) {
    method equals (line 42) | @Override
    method hashCode (line 53) | @Override
    method compareTo (line 58) | @Override
    method getArray (line 69) | public byte[] getArray() {
    method toString (line 73) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/Collects.java
  class Collects (line 30) | public final class Collects {
    method toArray (line 37) | @SuppressWarnings("unchecked")
    method toList (line 47) | public static List<Object> toList(Object obj) {
    method newLinkedList (line 66) | public static <E> LinkedList<E> newLinkedList(E element) {
    method getFirst (line 79) | public static <T> T getFirst(Collection<T> values) {
    method getLast (line 99) | public static <T> T getLast(Collection<T> values) {
    method get (line 112) | public static <T> T get(T[] array, int index) {
    method get (line 119) | public static <T> T get(List<T> list, int index) {
    method intersect (line 135) | public static <T> List<T> intersect(Collection<T> coll1, Collection<T>...
    method intersect (line 146) | @SuppressWarnings({ "unchecked" })
    method union (line 163) | public static <T> List<T> union(Collection<T> coll1, Collection<T> col...
    method different (line 184) | public static <T> List<T> different(List<T> list1, List<T> list2) {
    method different (line 198) | public static <T> Set<T> different(Set<T> set1, Set<T> set2) {
    method different (line 212) | public static <K, V> Map<K, V> different(Map<K, V> map1, Map<K, V> map...
    method duplicate (line 226) | public static <T> List<T> duplicate(Collection<T> list) {
    method duplicate (line 236) | public static <T, R> List<R> duplicate(Collection<T> list, Function<T,...
    method concat (line 259) | @SuppressWarnings({ "unchecked" })
    method set (line 285) | public static <T> void set(List<T> list, int index, T obj) {
    method expand (line 300) | public static <T> void expand(List<T> list, int size, Supplier<T> supp...
    method partition (line 322) | public static List<int[]> partition(int[] array, int size) {
    method cartesian (line 353) | public static <A, B, T> List<List<T>> cartesian(List<A> x, List<B> y, ...
    method rotate (line 373) | public static List<Object[]> rotate(List<Object[]> list) {
    method sortAndGetIndexSwapMapping (line 390) | public static int[] sortAndGetIndexSwapMapping(int[] array) {
    method requireNonEmpty (line 415) | public static <T> T[] requireNonEmpty(T[] array) {
    method requireNonEmpty (line 430) | public static <T> List<T> requireNonEmpty(List<T> list) {
    method convert (line 437) | public static <E, R> List<R> convert(Collection<E> collection, Functio...
    method convert (line 441) | public static <E, R> List<R> convert(Collection<E> collection, Predica...
    method concat (line 459) | @SafeVarargs
    method newArray (line 473) | public static <T> T[] newArray(Class<? extends T[]> arrayType, int len...
    method stream (line 479) | public static <E> Stream<E> stream(Collection<E> collection) {

FILE: src/main/java/cn/ponfee/commons/collect/Comparators.java
  class Comparators (line 18) | public final class Comparators {
    method asc (line 24) | public static <T extends Comparable<? super T>> Comparator<T> asc() {
    method desc (line 28) | public static <T extends Comparable<? super T>> Comparator<T> desc() {
    method order (line 32) | public static <T extends Comparable<? super T>> Comparator<T> order(bo...

FILE: src/main/java/cn/ponfee/commons/collect/DelegatedIntSpliterator.java
  class DelegatedIntSpliterator (line 24) | public class DelegatedIntSpliterator<T> implements Spliterator<T> {
    method DelegatedIntSpliterator (line 34) | public DelegatedIntSpliterator(int startInclusive, int endExclusive, I...
    method DelegatedIntSpliterator (line 39) | public DelegatedIntSpliterator(Spliterator.OfInt delegate, IntFunction...
    method tryAdvance (line 44) | @Override
    method forEachRemaining (line 49) | @Override
    method trySplit (line 54) | @Override
    method estimateSize (line 60) | @Override
    method characteristics (line 65) | @Override
    method getComparator (line 70) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/DoubleListViewer.java
  class DoubleListViewer (line 21) | public class DoubleListViewer<E> implements List<E>, RandomAccess {
    method DoubleListViewer (line 26) | public DoubleListViewer(Collection<List<E>> list) {
    method size (line 32) | @Override
    method isEmpty (line 37) | @Override
    method contains (line 42) | @Override
    method containsAll (line 47) | @Override
    method toArray (line 57) | @Override
    method toArray (line 62) | @Override
    method get (line 70) | @Override
    method indexOf (line 92) | @Override
    method lastIndexOf (line 123) | @Override
    method iterator (line 154) | @Override
    method listIterator (line 159) | @Override
    method listIterator (line 164) | @Override
    method subList (line 169) | @Override
    method toString (line 174) | @Override
    method hashCode (line 193) | @Override
    method equals (line 202) | @Override
    method set (line 223) | @Override
    method add (line 228) | @Override
    method remove (line 233) | @Override
    method addAll (line 238) | @Override
    method addAll (line 243) | @Override
    method removeAll (line 248) | @Override
    method retainAll (line 253) | @Override
    method clear (line 258) | @Override
    method add (line 263) | @Override
    method remove (line 268) | @Override
    class UnmodifiableListIterator (line 275) | private class UnmodifiableListIterator extends UnmodifiableIterator im...
      method UnmodifiableListIterator (line 276) | UnmodifiableListIterator(int position, int end) {
      method hasPrevious (line 280) | @Override
      method previous (line 285) | @Override
      method nextIndex (line 293) | @Override
      method previousIndex (line 298) | @Override
      method set (line 303) | @Override
      method add (line 308) | @Override
    class UnmodifiableIterator (line 314) | private class UnmodifiableIterator implements Iterator<E> {
      method UnmodifiableIterator (line 318) | UnmodifiableIterator(int position, int end) {
      method hasNext (line 323) | @Override
      method next (line 328) | @Override
      method remove (line 336) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/FilterableIterator.java
  class FilterableIterator (line 26) | public class FilterableIterator<T> implements Iterable<T>, Iterator<T> {
    method FilterableIterator (line 32) | private FilterableIterator(Iterator<T> iterator) {
    method FilterableIterator (line 36) | private FilterableIterator(Predicate<T> predicate, Iterator<T> iterato...
    method of (line 41) | public static <T> FilterableIterator<T> of(Iterator<T> iterator) {
    method of (line 45) | public static <T> FilterableIterator<T> of(Predicate<T> predicate, Ite...
    method of (line 49) | public static <T> FilterableIterator<T> of(Iterable<T> iterable) {
    method of (line 53) | public static <T> FilterableIterator<T> of(Predicate<T> predicate, Ite...
    method of (line 57) | @SafeVarargs
    method of (line 62) | @SafeVarargs
    method iterator (line 67) | @Override
    method hasNext (line 72) | @Override
    method next (line 82) | @Override
    class ArrayIterator (line 87) | private static class ArrayIterator<T> implements Iterator<T> {
      method ArrayIterator (line 91) | @SafeVarargs
      method hasNext (line 96) | @Override
      method next (line 101) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/ImmutableArrayList.java
  class ImmutableArrayList (line 26) | public class ImmutableArrayList<E> extends ToJsonString
    method ImmutableArrayList (line 35) | public ImmutableArrayList() {
    method ImmutableArrayList (line 39) | public ImmutableArrayList(Object[] elements) {
    method of (line 50) | public static <T> ImmutableArrayList<T> of() {
    method of (line 54) | @SafeVarargs
    method of (line 59) | public static <T> ImmutableArrayList<T> of(T[] array, T last) {
    method of (line 63) | public static <T> ImmutableArrayList<T> of(List<T> list) {
    method of (line 67) | public static <T> ImmutableArrayList<T> of(List<T> list, T last) {
    method offset (line 72) | protected int offset() {
    method size (line 76) | @Override
    method isEmpty (line 81) | @Override
    method toArray (line 86) | @Override
    method toArray (line 94) | @Override
    method get (line 112) | @Override
    method indexOf (line 120) | @Override
    method lastIndexOf (line 138) | @Override
    method contains (line 156) | @Override
    method containsAll (line 161) | @Override
    method iterator (line 171) | @Override
    method listIterator (line 176) | @Override
    method listIterator (line 181) | @Override
    method subList (line 186) | @Override
    method spliterator (line 199) | @Override
    method hashCode (line 204) | @Override
    method equals (line 213) | @Override
    method clone (line 232) | @Override
    method join (line 237) | public final E[] join(E last) {
    method concat (line 252) | public final ImmutableArrayList<E> concat(E last) {
    method add (line 257) | @Override
    method remove (line 262) | @Override
    method addAll (line 267) | @Override
    method addAll (line 272) | @Override
    method removeAll (line 277) | @Override
    method removeIf (line 282) | @Override
    method retainAll (line 287) | @Override
    method replaceAll (line 292) | @Override
    method sort (line 297) | @Override
    method clear (line 302) | @Override
    method set (line 307) | @Override
    method add (line 312) | @Override
    method remove (line 317) | @Override
    class UnmodifiableIterator (line 322) | private class UnmodifiableIterator implements Iterator<E> {
      method UnmodifiableIterator (line 326) | UnmodifiableIterator(int position, int end) {
      method hasNext (line 331) | @Override
      method next (line 336) | @Override
      method remove (line 344) | @Override
    class UnmodifiableListIterator (line 350) | private class UnmodifiableListIterator extends UnmodifiableIterator im...
      method UnmodifiableListIterator (line 352) | UnmodifiableListIterator(int position, int end) {
      method hasPrevious (line 356) | @Override
      method previous (line 361) | @Override
      method nextIndex (line 369) | @Override
      method previousIndex (line 374) | @Override
      method set (line 379) | @Override
      method add (line 384) | @Override
    class SubList (line 390) | private class SubList extends ImmutableArrayList<E> {
      method SubList (line 396) | SubList(int from, int to) {
      method offset (line 402) | @Override
      method size (line 407) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/ImmutableHashList.java
  class ImmutableHashList (line 27) | public class ImmutableHashList<K extends Comparable<K>, V> {
    method ImmutableHashList (line 34) | private ImmutableHashList() {
    method ImmutableHashList (line 40) | private ImmutableHashList(List<V> values, Function<V, K> mapper) {
    method values (line 49) | public final List<V> values() {
    method contains (line 53) | public final boolean contains(V value) {
    method isEmpty (line 57) | public final boolean isEmpty() {
    method of (line 61) | public static <K extends Comparable<K>, V> ImmutableHashList<K, V> of(...
    method empty (line 65) | public static <K extends Comparable<K>, V> ImmutableHashList<K, V> emp...

FILE: src/main/java/cn/ponfee/commons/collect/LRUCache.java
  class LRUCache (line 23) | public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    method LRUCache (line 31) | public LRUCache() {
    method LRUCache (line 35) | public LRUCache(int maxCapacity) {
    method removeEldestEntry (line 40) | @Override
    method containsKey (line 45) | @Override
    method get (line 55) | @Override
    method put (line 65) | @Override
    method remove (line 75) | @Override
    method size (line 85) | @Override
    method clear (line 95) | @Override
    method getMaxSize (line 105) | public int getMaxSize() {
    method setMaxSize (line 109) | public void setMaxSize(int maxSize) {

FILE: src/main/java/cn/ponfee/commons/collect/Maps.java
  class Maps (line 25) | public final class Maps {
    method hasKey (line 34) | public static boolean hasKey(Map<?, ?> map, String key) {
    method toArray (line 47) | public static Object[] toArray(Map<String, Object> map, String... fiel...
    method toArray (line 57) | public static List<Object[]> toArray(List<Map<String, Object>> data, S...
    method toArray (line 72) | public static Object[] toArray(LinkedHashMap<String, Object> data) {
    method toArray (line 84) | public static List<Object[]> toArray(List<LinkedHashMap<String, Object...
    method toArray (line 99) | public static Result<Page<Object[]>> toArray(Result<Page<LinkedHashMap...
    method toArray (line 109) | public static Result<Page<Object[]>> toArray(Result<Page<Map<String, O...
    method toMap (line 120) | public static Map<String, Object> toMap(Object... kv) {

FILE: src/main/java/cn/ponfee/commons/collect/StreamForker.java
  class StreamForker (line 31) | public class StreamForker<T> {
    method StreamForker (line 36) | public StreamForker(Stream<T> stream) {
    method fork (line 40) | public StreamForker<T> fork(Object key, Function<Stream<T>, ?> f) {
    method getResults (line 45) | public Results getResults() {
    method build (line 55) | private ForkingStreamConsumer<T> build() {
    method getOperationResult (line 73) | private Future<?> getOperationResult(List<BlockingQueue<T>> queues, Fu...
    type Results (line 80) | public interface Results {
      method get (line 81) | <R> R get(Object key);
    class ForkingStreamConsumer (line 84) | @SuppressWarnings("unchecked")
      method ForkingStreamConsumer (line 91) | ForkingStreamConsumer(List<BlockingQueue<T>> queues, Map<Object, Fut...
      method accept (line 96) | @Override
      method get (line 101) | @Override
      method finish (line 110) | void finish() {
    class BlockingQueueSpliterator (line 115) | private static class BlockingQueueSpliterator<T> implements Spliterato...
      method BlockingQueueSpliterator (line 118) | BlockingQueueSpliterator(BlockingQueue<T> q) {
      method tryAdvance (line 122) | @Override
      method trySplit (line 143) | @Override
      method estimateSize (line 148) | @Override
      method characteristics (line 153) | @Override

FILE: src/main/java/cn/ponfee/commons/collect/ValueSortedMap.java
  class ValueSortedMap (line 32) | public class ValueSortedMap<K, V> extends TreeMap<K, V> {
    method ValueSortedMap (line 36) | private ValueSortedMap(Map<? extends K, ? extends V> map,
    method nullsFirst (line 42) | public static <K, V extends Comparable<? super V>> ValueSortedMap<K, V...
    method nullsFirst (line 47) | public static <K, V> ValueSortedMap<K, V> nullsFirst(
    method nullsLast (line 52) | public static <K, V extends Comparable<? super V>> ValueSortedMap<K, V...
    method nullsLast (line 57) | public static <K, V> ValueSortedMap<K, V> nullsLast(
    class MapValueComparator (line 63) | private static class MapValueComparator<K, V> implements Comparator<K> {
      method MapValueComparator (line 67) | private MapValueComparator(Map<? extends K, ? extends V> data,
      method compare (line 73) | @Override
    method put (line 81) | @Deprecated @Override
    method putIfAbsent (line 86) | @Deprecated @Override
    method replace (line 91) | @Deprecated @Override
    method replace (line 96) | @Deprecated @Override
    method computeIfAbsent (line 101) | @Deprecated @Override
    method computeIfPresent (line 106) | @Deprecated @Override
    method compute (line 112) | @Deprecated @Override
    method merge (line 117) | @Deprecated @Override
    method putAll (line 123) | @Deprecated @Override
    method replaceAll (line 128) | @Deprecated @Override
    method remove (line 133) | @Deprecated @Override
    method remove (line 138) | @Deprecated @Override
    method clear (line 143) | @Deprecated @Override

FILE: src/main/java/cn/ponfee/commons/concurrent/AsyncBatchProcessor.java
  class AsyncBatchProcessor (line 36) | public final class AsyncBatchProcessor<T> {
    method AsyncBatchProcessor (line 42) | public AsyncBatchProcessor(BatchProcessor<T> processor) {
    method AsyncBatchProcessor (line 52) | public AsyncBatchProcessor(BatchProcessor<T> processor,
    method put (line 66) | public boolean put(T element) {
    method put (line 75) | public boolean put(T[] elements) {
    method put (line 93) | public boolean put(List<T> elements) {
    method stop (line 111) | public boolean stop() {
    method stopAndAwait (line 115) | public void stopAndAwait() throws InterruptedException {
    class AsyncBatchThread (line 125) | private static class AsyncBatchThread<T> extends Thread {
      method AsyncBatchThread (line 147) | private AsyncBatchThread(BatchProcessor<T> processor,
      method run (line 174) | @Override
      method isEnd (line 254) | private boolean isEnd() {
    type BatchProcessor (line 259) | @FunctionalInterface
      method process (line 261) | void process(List<T> t, boolean stopped);

FILE: src/main/java/cn/ponfee/commons/concurrent/AsyncDelayedExecutor.java
  class AsyncDelayedExecutor (line 27) | public final class AsyncDelayedExecutor<E> extends Thread {
    method AsyncDelayedExecutor (line 37) | public AsyncDelayedExecutor(Consumer<E> processor) {
    method AsyncDelayedExecutor (line 45) | public AsyncDelayedExecutor(int maximumPoolSize,
    method put (line 72) | public boolean put(DelayedData<E> delayedData) {
    method doStop (line 79) | public void doStop() {
    method run (line 85) | @Override

FILE: src/main/java/cn/ponfee/commons/concurrent/DelayedData.java
  class DelayedData (line 22) | public class DelayedData<E> implements Delayed {
    method DelayedData (line 27) | private DelayedData(E data, long delayInMilliseconds) {
    method of (line 32) | public static <E> DelayedData<E> of(E data, long delayInMilliseconds) {
    method getDelay (line 36) | @Override
    method compareTo (line 42) | @Override
    method getData (line 47) | public E getData() {

FILE: src/main/java/cn/ponfee/commons/concurrent/MultithreadExecutors.java
  class MultithreadExecutors (line 27) | public class MultithreadExecutors {
    method run (line 30) | public static <T> void run(Collection<T> coll, Consumer<T> action, Exe...
    method run (line 41) | public static <T> void run(Collection<T> coll, Consumer<T> action, Exe...
    method call (line 55) | public static <T, U> List<U> call(Collection<T> coll, Function<T, U> m...
    method call (line 67) | public static <T, U> List<U> call(Collection<T> coll, Function<T, U> m...

FILE: src/main/java/cn/ponfee/commons/concurrent/NamedThreadFactory.java
  class NamedThreadFactory (line 21) | public class NamedThreadFactory implements ThreadFactory {
    method NamedThreadFactory (line 32) | public NamedThreadFactory(String prefix,
    method newThread (line 47) | @Override
    method getThreadGroup (line 60) | public ThreadGroup getThreadGroup() {
    method builder (line 64) | public static Builder builder() {
    class Builder (line 68) | public static class Builder {
      method Builder (line 74) | private Builder() { }
      method prefix (line 76) | public Builder prefix(String prefix) {
      method daemon (line 81) | public Builder daemon(boolean daemon) {
      method priority (line 86) | public Builder priority(Integer priority) {
      method uncaughtExceptionHandler (line 91) | public Builder uncaughtExceptionHandler(Thread.UncaughtExceptionHand...
      method build (line 96) | public NamedThreadFactory build() {

FILE: src/main/java/cn/ponfee/commons/concurrent/SingleThreadShutdownHook.java
  class SingleThreadShutdownHook (line 21) | public class SingleThreadShutdownHook {
    method addHook (line 27) | public static void addHook(Runnable hook) {
    class HookThread (line 37) | private static class HookThread extends Thread {
      method run (line 40) | @Override

FILE: src/main/java/cn/ponfee/commons/concurrent/ThreadPoolExecutors.java
  class ThreadPoolExecutors (line 27) | public final class ThreadPoolExecutors {
    method builder (line 73) | public static Builder builder() {
    type PrestartCoreThreadType (line 77) | public enum PrestartCoreThreadType { NONE, ONE, ALL }
    class Builder (line 79) | public static class Builder {
      method Builder (line 89) | private Builder() {
      method corePoolSize (line 92) | public Builder corePoolSize(int corePoolSize) {
      method maximumPoolSize (line 97) | public Builder maximumPoolSize(int maximumPoolSize) {
      method workQueue (line 102) | public Builder workQueue(BlockingQueue<Runnable> workQueue) {
      method keepAliveTimeSeconds (line 107) | public Builder keepAliveTimeSeconds(long keepAliveTimeSeconds) {
      method rejectedHandler (line 112) | public Builder rejectedHandler(RejectedExecutionHandler rejectedHand...
      method threadFactory (line 117) | public Builder threadFactory(ThreadFactory threadFactory) {
      method allowCoreThreadTimeOut (line 122) | public Builder allowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) {
      method prestartCoreThreadType (line 127) | public Builder prestartCoreThreadType(PrestartCoreThreadType prestar...
      method build (line 132) | public ThreadPoolExecutor build() {
    method shutdown (line 168) | public static boolean shutdown(ExecutorService executorService) {
    method shutdown (line 190) | public static boolean shutdown(ExecutorService executorService, int aw...

FILE: src/main/java/cn/ponfee/commons/concurrent/ThreadPoolMonitor.java
  class ThreadPoolMonitor (line 22) | @Getter
    method ThreadPoolMonitor (line 41) | public ThreadPoolMonitor(ThreadPoolExecutor pool) {

FILE: src/main/java/cn/ponfee/commons/concurrent/Threads.java
  class Threads (line 20) | public final class Threads {
    method isStopped (line 29) | public static boolean isStopped(Thread thread) {
    method stopThread (line 42) | public static boolean stopThread(Thread thread, int sleepCount, long s...
    method interruptIfNecessary (line 82) | public static void interruptIfNecessary(Throwable t) {
    method stopThread (line 94) | private static boolean stopThread(Thread thread) {

FILE: src/main/java/cn/ponfee/commons/concurrent/TracedRunnable.java
  class TracedRunnable (line 20) | public final class TracedRunnable implements Runnable {
    method TracedRunnable (line 24) | private TracedRunnable(Runnable runnable) {
    method of (line 28) | public static TracedRunnable of(Runnable runnable) {
    method run (line 32) | @Override

FILE: src/main/java/cn/ponfee/commons/constrain/Constraint.java
  type Tense (line 123) | enum Tense {
    method Tense (line 128) | Tense(String desc) {
    method desc (line 132) | public String desc() {

FILE: src/main/java/cn/ponfee/commons/constrain/FailFastValidatorFactoryBean.java
  class FailFastValidatorFactoryBean (line 22) | public class FailFastValidatorFactoryBean implements FactoryBean<Validat...
    method FailFastValidatorFactoryBean (line 27) | public FailFastValidatorFactoryBean() {
    method getObject (line 39) | @Override
    method getObjectType (line 44) | @Override
    method isSingleton (line 49) | @Override

FILE: src/main/java/cn/ponfee/commons/constrain/FieldValidator.java
  class FieldValidator (line 52) | public class FieldValidator {
    method FieldValidator (line 65) | protected FieldValidator() {}
    method newInstance (line 67) | public static FieldValidator newInstance() {
    method constrain (line 75) | public final void constrain(Object bean) {
    method processError (line 101) | protected Object processError(StringBuilder errorMsgBuilder, Method me...
    method handleFailure (line 118) | protected Object handleFailure(Class<?> returnType, String errMsg) {
    method constrain (line 126) | protected final String constrain(GenericDeclaration classOrMethod, Str...
    method constrain (line 165) | protected final String constrain(String name, Object value,
    method verifyMeta (line 180) | private void verifyMeta(String name, Constraint c, Class<?> type) {
    method isEmptiable (line 235) | private boolean isEmptiable(Class<?> type) {
    method verifyValue (line 243) | private String verifyValue(String str, Object value, Constraint cst) {
    method verify (line 259) | private String verify(String n, Object v, Constraint c) {

FILE: src/main/java/cn/ponfee/commons/constrain/Jsr303Validator.java
  class Jsr303Validator (line 32) | public abstract class Jsr303Validator {
    method verify (line 35) | public Object verify(ProceedingJoinPoint pjp, BindingResult bindingRes...
    method handleFailure (line 44) | protected Object handleFailure(Class<?> returnType, BindingResult bind...

FILE: src/main/java/cn/ponfee/commons/constrain/MethodValidator.java
  class MethodValidator (line 57) | public abstract class MethodValidator extends FieldValidator {
    method constrain (line 67) | @SuppressWarnings("unchecked")
    method argsNullable (line 154) | private boolean[] argsNullable(Object[] args, Constraint[] csts) {

FILE: src/main/java/cn/ponfee/commons/constrain/ParamValidator.java
  class ParamValidator (line 38) | public abstract class ParamValidator extends FieldValidator {
    method constrain (line 47) | public Object constrain(ProceedingJoinPoint joinPoint) throws Throwable {

FILE: src/main/java/cn/ponfee/commons/dag/DAGEdge.java
  class DAGEdge (line 22) | public final class DAGEdge extends ToJsonString implements Serializable {
    method DAGEdge (line 28) | private DAGEdge(DAGNode source, DAGNode target) {
    method of (line 33) | public static DAGEdge of(DAGNode source, DAGNode target) {
    method of (line 37) | public static DAGEdge of(String source, String target) {
    method of (line 43) | public static DAGEdge of(EndpointPair<DAGNode> pair) {
    method getSource (line 48) | public DAGNode getSource() {
    method getTarget (line 52) | public DAGNode getTarget() {
    method hashCode (line 56) | @Override
    method equals (line 61) | @Override

FILE: src/main/java/cn/ponfee/commons/dag/DAGExpressionParser.java
  class DAGExpressionParser (line 91) | public class DAGExpressionParser {
    method DAGExpressionParser (line 132) | public DAGExpressionParser(String text) {
    method parse (line 137) | public Graph<DAGNode> parse() {
    method parseJsonGraph (line 161) | private void parseJsonGraph(ImmutableGraph.Builder<DAGNode> graphBuild...
    method parsePlainExpr (line 188) | private void parsePlainExpr(ImmutableGraph.Builder<DAGNode> graphBuild...
    method buildGraph (line 201) | private void buildGraph(int section, List<String> expressions,
    method resolve (line 228) | private List<String> resolve(String text) {
    method partition (line 266) | private List<String> partition(String expr, List<Integer> groups) {
    method increment (line 279) | private int increment(String name) {
    method divideFirstStage (line 291) | private static Tuple2<List<String>, List<String>> divideFirstStage(Lis...
    method buildTree (line 322) | static TreeNode<TreeNodeId, Object> buildTree(List<Tuple2<Integer, Int...
    method buildTree (line 337) | private static void buildTree(List<Tuple2<Integer, Integer>> groups,
    method concat (line 359) | private static List<String> concat(List<String> left, List<String> rig...
    method checkParenthesis (line 377) | static boolean checkParenthesis(String text) {
    method completeParenthesis (line 400) | static String completeParenthesis(String text) {
    method group (line 444) | static List<Tuple2<Integer, Integer>> group(String expr) {
    method wrap (line 467) | private static String wrap(String text) {
    class GraphEdge (line 471) | @Getter
      method toDAGEdge (line 480) | private DAGEdge toDAGEdge() {
      method fromJson (line 484) | private static List<GraphEdge> fromJson(String text) {
    class TreeNodeId (line 493) | static final class TreeNodeId implements Serializable, Comparable<Tree...
      method TreeNodeId (line 507) | private TreeNodeId(int open, int close) {
      method of (line 512) | private static TreeNodeId of(int open, int close) {
      method equals (line 518) | @Override
      method hashCode (line 528) | @Override
      method compareTo (line 533) | @Override
      method toString (line 539) | @Override
    class PartitionIdentityKey (line 545) | private static final class PartitionIdentityKey {
      method PartitionIdentityKey (line 550) | private PartitionIdentityKey(String expr, int open, int close) {
      method equals (line 559) | @Override
      method hashCode (line 571) | @Override
      method partition (line 576) | private String partition() {

FILE: src/main/java/cn/ponfee/commons/dag/DAGNode.java
  class DAGNode (line 24) | public final class DAGNode implements Serializable {
    method DAGNode (line 51) | private DAGNode(int section, int ordinal, String name) {
    method of (line 57) | public static DAGNode of(int section, int ordinal, String name) {
    method getSection (line 64) | public int getSection() {
    method getOrdinal (line 68) | public int getOrdinal() {
    method getName (line 72) | public String getName() {
    method isStart (line 76) | @Transient
    method isEnd (line 81) | @Transient
    method isStartOrEnd (line 86) | @Transient
    method hashCode (line 91) | @Override
    method equals (line 96) | @Override
    method equals (line 110) | public boolean equals(int section, int ordinal, String name) {
    method toString (line 116) | @Override
    method fromString (line 121) | public static DAGNode fromString(String str) {

FILE: src/main/java/cn/ponfee/commons/data/DataSourceFactory.java
  type DataSourceFactory (line 22) | @SuppressWarnings({"unchecked", "rawtypes"})
    method configure (line 25) | default void configure(T dataSource, Properties commonConfig) {
    method create (line 29) | default T create(String dataSourceClassName, Properties basicConfig, P...

FILE: src/main/java/cn/ponfee/commons/data/DruidDataSourceFactory.java
  class DruidDataSourceFactory (line 28) | public class DruidDataSourceFactory implements DataSourceFactory<DruidDa...
    method configure (line 30) | @Override
    method configureFilters (line 35) | private void configureFilters(DruidDataSource ds, String filters) {

FILE: src/main/java/cn/ponfee/commons/data/MultipleDataSourceAdvisor.java
  class MultipleDataSourceAdvisor (line 30) | public class MultipleDataSourceAdvisor implements MethodInterceptor {
    method doAround (line 73) | public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    method invoke (line 125) | @Override @Deprecated
    method around (line 132) | private static Object around(Method method, Object[] args, Callable<Ob...
    method around (line 136) | static Object around(Method method, Object[] args, DataSourceNaming dsn,

FILE: src/main/java/cn/ponfee/commons/data/MultipleDataSourceAspect.java
  class MultipleDataSourceAspect (line 53) | public abstract class MultipleDataSourceAspect implements Ordered {
    method doAround (line 57) | public Object doAround(ProceedingJoinPoint pjp, DataSourceNaming dsn) ...
    method getOrder (line 65) | @Override

FILE: src/main/java/cn/ponfee/commons/data/NamedDataSource.java
  class NamedDataSource (line 26) | public class NamedDataSource {
    method NamedDataSource (line 33) | public NamedDataSource(String name, DataSource dataSource) {
    method of (line 38) | public static NamedDataSource of(String name, DataSource dataSource) {
    method getName (line 42) | public String getName() {
    method getDataSource (line 46) | public DataSource getDataSource() {
    method build (line 56) | public static NamedDataSource[] build(String prefix, Properties props) {

FILE: src/main/java/cn/ponfee/commons/data/lookup/DataSourceLookup.java
  type DataSourceLookup (line 18) | public interface DataSourceLookup {
    method lookupDataSource (line 20) | DataSource lookupDataSource(String name);

FILE: src/main/java/cn/ponfee/commons/data/lookup/MultipleCachedDataSource.java
  class MultipleCachedDataSource (line 35) | public class MultipleCachedDataSource extends AbstractDataSource
    method MultipleCachedDataSource (line 43) | public MultipleCachedDataSource(int expireSeconds, NamedDataSource dat...
    method MultipleCachedDataSource (line 47) | public MultipleCachedDataSource(int expireSeconds, NamedDataSource... ...
    method MultipleCachedDataSource (line 56) | public MultipleCachedDataSource(int expireSeconds, String defaultName,
    method addIfAbsent (line 80) | public synchronized boolean addIfAbsent(String dataSourceName,
    method addIfAbsent (line 90) | public synchronized boolean addIfAbsent(String dataSourceName, DataSou...
    method add (line 99) | public synchronized void add(NamedDataSource ds) {
    method add (line 103) | public synchronized void add(@Nonnull String dataSourceName,
    method remove (line 113) | public synchronized void remove(String dataSourceName) {
    method getConnection (line 123) | @Override
    method getConnection (line 128) | @Override
    method unwrap (line 133) | @Override
    method isWrapperFor (line 142) | @Override
    method lookupDataSource (line 147) | @Override
    method init (line 155) | @Override
    method close (line 160) | @Override
    method determineTargetDataSource (line 182) | private DataSource determineTargetDataSource() {
    method existsDatasourceName (line 193) | private boolean existsDatasourceName(String name) {

FILE: src/main/java/cn/ponfee/commons/data/lookup/MultipleDataSourceContext.java
  class MultipleDataSourceContext (line 25) | public final class MultipleDataSourceContext {
    method set (line 30) | public static void set(String datasourceName) {
    method get (line 34) | public static String get() {
    method clear (line 38) | public static void clear() {
    method listDataSourceNames (line 47) | public static List<String> listDataSourceNames() {
    method add (line 54) | synchronized static void add(@Nonnull String key) {
    method addAll (line 61) | synchronized static void addAll(List<String> keys) {
    method remove (line 67) | synchronized static void remove(String key) {
    method process (line 71) | static Map<String, DataSource> process(String defaultName, DataSource ...

FILE: src/main/java/cn/ponfee/commons/data/lookup/MultipleFixedDataSource.java
  class MultipleFixedDataSource (line 34) | public class MultipleFixedDataSource extends AbstractRoutingDataSource
    method MultipleFixedDataSource (line 39) | public MultipleFixedDataSource(NamedDataSource dataSource) {
    method MultipleFixedDataSource (line 43) | public MultipleFixedDataSource(NamedDataSource... dataSources) {
    method MultipleFixedDataSource (line 51) | @SuppressWarnings({ "unchecked", "rawtypes" })
    method determineCurrentLookupKey (line 67) | @Override
    method lookupDataSource (line 72) | @Override
    method init (line 77) | @Override
    method close (line 82) | @Override

FILE: src/main/java/cn/ponfee/commons/data/lookup/MultipleScalableDataSource.java
  class MultipleScalableDataSource (line 34) | public class MultipleScalableDataSource extends AbstractDataSource
    method MultipleScalableDataSource (line 40) | public MultipleScalableDataSource(NamedDataSource dataSource) {
    method MultipleScalableDataSource (line 44) | public MultipleScalableDataSource(NamedDataSource... dataSources) {
    method MultipleScalableDataSource (line 52) | public MultipleScalableDataSource(String defaultName, DataSource defau...
    method add (line 65) | public synchronized void add(NamedDataSource ds) {
    method add (line 69) | public synchronized void add(@Nonnull String dataSourceName, @Nonnull ...
    method remove (line 77) | public synchronized void remove(String dataSourceName) {
    method remove (line 82) | public synchronized void remove(@Nonnull DataSource dataSource) {
    method getConnection (line 94) | @Override
    method getConnection (line 99) | @Override
    method unwrap (line 104) | @Override
    method isWrapperFor (line 113) | @Override
    method lookupDataSource (line 118) | @Override
    method init (line 123) | @Override
    method close (line 128) | @Override
    method determineTargetDataSource (line 142) | private DataSource determineTargetDataSource() {

FILE: src/main/java/cn/ponfee/commons/date/CustomLocalDateTimeDeserializer.java
  class CustomLocalDateTimeDeserializer (line 24) | public class CustomLocalDateTimeDeserializer extends JSR310DateTimeDeser...
    method CustomLocalDateTimeDeserializer (line 31) | protected CustomLocalDateTimeDeserializer() {
    method CustomLocalDateTimeDeserializer (line 35) | public CustomLocalDateTimeDeserializer(String pattern) {
    method CustomLocalDateTimeDeserializer (line 39) | public CustomLocalDateTimeDeserializer(DateTimeFormatter formatter) {
    method withShape (line 44) | @Override
    method withDateFormat (line 49) | @Override
    method withLeniency (line 54) | @Override
    method deserialize (line 59) | @Override
    method _fromString (line 125) | protected LocalDateTime _fromString(JsonParser p, DeserializationConte...

FILE: src/main/java/cn/ponfee/commons/date/DatePeriods.java
  type DatePeriods (line 32) | public enum DatePeriods {
    method DatePeriods (line 99) | DatePeriods(ChronoUnit unit, int multiple) {
    method next (line 113) | public final Segment next(LocalDateTime original, LocalDateTime target...
    method next (line 123) | public final Segment next(LocalDateTime target, int step, int next) {
    method next (line 127) | public final Segment next(LocalDateTime target, int next) {
    method next (line 131) | public final Segment next(Date original, Date target, int step, int ne...
    method next (line 135) | public final Segment next(Date target, int step, int next) {
    method next (line 140) | public final Segment next(Date target, int next) {
    class Segment (line 145) | public static final class Segment {
      method Segment (line 149) | private Segment(LocalDateTime begin, LocalDateTime end) {
      method begin (line 154) | public Date begin() {
      method end (line 158) | public Date end() {
      method toString (line 162) | @Override

FILE: src/main/java/cn/ponfee/commons/date/Dates.java
  class Dates (line 52) | public class Dates {
    method isValidDate (line 80) | public static boolean isValidDate(String dateStr) {
    method isValidDate (line 100) | public static boolean isValidDate(String dateStr, String pattern) {
    method isZeroDate (line 119) | public static boolean isZeroDate(Date date) {
    method now (line 128) | public static Date now() {
    method now (line 138) | public static String now(String pattern) {
    method toDate (line 148) | public static Date toDate(String dateStr) {
    method toDate (line 163) | public static Date toDate(String dateStr, String pattern) {
    method ofTimeMillis (line 177) | public static Date ofTimeMillis(long timeMillis) {
    method ofTimeMillis (line 181) | public static Date ofTimeMillis(Long timeMillis) {
    method currentUnixTimestamp (line 185) | public static long currentUnixTimestamp() {
    method ofUnixTimestamp (line 195) | public static Date ofUnixTimestamp(long unixTimestamp) {
    method ofUnixTimestamp (line 199) | public static Date ofUnixTimestamp(Long unixTimestamp) {
    method format (line 210) | public static String format(Date date, String pattern) {
    method format (line 223) | public static String format(Date date) {
    method format (line 234) | public static String format(long timeMillis, String pattern) {
    method plusMillis (line 247) | public static Date plusMillis(Date date, long millis) {
    method plusSeconds (line 258) | public static Date plusSeconds(Date date, long seconds) {
    method plusMinutes (line 269) | public static Date plusMinutes(Date date, long minutes) {
    method plusHours (line 280) | public static Date plusHours(Date date, long hours) {
    method plusDays (line 291) | public static Date plusDays(Date date, long days) {
    method plusWeeks (line 302) | public static Date plusWeeks(Date date, long weeks) {
    method plusMonths (line 313) | public static Date plusMonths(Date date, long months) {
    method plusYears (line 324) | public static Date plusYears(Date date, long years) {
    method minusMillis (line 337) | public static Date minusMillis(Date date, long millis) {
    method minusSeconds (line 348) | public static Date minusSeconds(Date date, long seconds) {
    method minusMinutes (line 359) | public static Date minusMinutes(Date date, long minutes) {
    method minusHours (line 370) | public static Date minusHours(Date date, long hours) {
    method minusDays (line 381) | public static Date minusDays(Date date, long days) {
    method minusWeeks (line 392) | public static Date minusWeeks(Date date, long weeks) {
    method minusMonths (line 403) | public static Date minusMonths(Date date, long months) {
    method minusYears (line 414) | public static Date minusYears(Date date, long years) {
    method startOfDay (line 426) | public static Date startOfDay(Date date) {
    method endOfDay (line 436) | public static Date endOfDay(Date date) {
    method startOfWeek (line 446) | public static Date startOfWeek(Date date) {
    method endOfWeek (line 456) | public static Date endOfWeek(Date date) {
    method startOfMonth (line 466) | public static Date startOfMonth(Date date) {
    method endOfMonth (line 476) | public static Date endOfMonth(Date date) {
    method startOfYear (line 486) | public static Date startOfYear(Date date) {
    method endOfYear (line 496) | public static Date endOfYear(Date date) {
    method withDayOfWeek (line 509) | public static Date withDayOfWeek(Date date, int dayOfWeek) {
    method withDayOfMonth (line 522) | public static Date withDayOfMonth(Date date, int dayOfMonth) {
    method withDayOfYear (line 533) | public static Date withDayOfYear(Date date, int dayOfYear) {
    method dayOfYear (line 539) | public static int dayOfYear(Date date) {
    method dayOfMonth (line 543) | public static int dayOfMonth(Date date) {
    method dayOfWeek (line 547) | public static int dayOfWeek(Date date) {
    method hourOfDay (line 551) | public static int hourOfDay(Date date) {
    method clockDiff (line 564) | public static long clockDiff(Date start, Date end) {
    method daysBetween (line 576) | public static int daysBetween(Date start, Date end) {
    method random (line 587) | public static Date random(Date begin, Date end) {
    method random (line 595) | public static Date random(long beginTimeMills, long endTimeMills) {
    method min (line 610) | public static Date min(Date a, Date b) {
    method max (line 621) | public static Date max(Date a, Date b) {
    method toLocalDateTime (line 627) | public static LocalDateTime toLocalDateTime(Date date) {
    method toDate (line 632) | public static Date toDate(LocalDateTime localDateTime) {
    method toLocalDate (line 636) | public static LocalDate toLocalDate(Date date) {
    method toDate (line 640) | public static Date toDate(LocalDate localDate) {
    method startOfDay (line 644) | public static LocalDateTime startOfDay(LocalDateTime dateTime) {
    method endOfDay (line 649) | public static LocalDateTime endOfDay(LocalDateTime dateTime) {
    method zoneConvert (line 662) | public static Date zoneConvert(Date date, ZoneId sourceZone, ZoneId ta...
    method zoneConvert (line 679) | public static LocalDateTime zoneConvert(LocalDateTime localDateTime, Z...
    method toCronExpression (line 686) | public static String toCronExpression(Date date) {
    method toCronExpression (line 696) | public static String toCronExpression(LocalDateTime dateTime) {
    method startOfDay0 (line 710) | private static LocalDateTime startOfDay0(Date date) {
    method endOfDay0 (line 714) | private static LocalDateTime endOfDay0(Date date) {

FILE: src/main/java/cn/ponfee/commons/date/JavaUtilDateFormat.java
  class JavaUtilDateFormat (line 30) | @ThreadSafe
    method JavaUtilDateFormat (line 91) | public JavaUtilDateFormat(String pattern) {
    method JavaUtilDateFormat (line 95) | public JavaUtilDateFormat(String pattern, Locale locale) {
    method JavaUtilDateFormat (line 99) | public JavaUtilDateFormat(FastDateFormat format) {
    method format (line 109) | @Override
    method parse (line 114) | @Override
    method parse (line 134) | @Override
    method parseToLocalDateTime (line 211) | public LocalDateTime parseToLocalDateTime(String source) throws ParseE...
    method parseToLocalDateTime (line 216) | public LocalDateTime parseToLocalDateTime(String source, ParsePosition...
    method parseObject (line 221) | @Override
    method parseObject (line 226) | @Override
    method hashCode (line 231) | @Override
    method equals (line 236) | @Override
    method formatToCharacterIterator (line 250) | @Override
    method clone (line 255) | @Override
    method setCalendar (line 262) | @Override @Deprecated
    method setNumberFormat (line 269) | @Override @Deprecated
    method setTimeZone (line 276) | @Override @Deprecated
    method setLenient (line 283) | @Override @Deprecated
    method isCrossbar (line 291) | static boolean isCrossbar(String str) {
    method isTSeparator (line 296) | static boolean isTSeparator(String str) {
    method isCST (line 300) | static boolean isCST(String str) {
    method padding (line 304) | static String padding(String source) {

FILE: src/main/java/cn/ponfee/commons/date/LocalDateTimeFormat.java
  class LocalDateTimeFormat (line 31) | @ThreadSafe
    method LocalDateTimeFormat (line 56) | public LocalDateTimeFormat(String pattern) {
    method LocalDateTimeFormat (line 60) | public LocalDateTimeFormat(DateTimeFormatter dateTimeFormatter) {
    method parse (line 66) | public LocalDateTime parse(String source) {
    method format (line 128) | public String format(LocalDateTime dateTime) {

FILE: src/main/java/cn/ponfee/commons/exception/BaseCheckedException.java
  class BaseCheckedException (line 18) | public abstract class BaseCheckedException extends Exception {
    method BaseCheckedException (line 26) | public BaseCheckedException(int code) {
    method BaseCheckedException (line 30) | public BaseCheckedException(CodeMsg codeMsg) {
    method BaseCheckedException (line 38) | public BaseCheckedException(int code, String message) {
    method BaseCheckedException (line 42) | public BaseCheckedException(CodeMsg codeMsg, Throwable cause) {
    method BaseCheckedException (line 51) | public BaseCheckedException(int code, String message, Throwable cause) {
    method BaseCheckedException (line 63) | public BaseCheckedException(int code,
    method getCode (line 77) | public int getCode() {

FILE: src/main/java/cn/ponfee/commons/exception/BaseUncheckedException.java
  class BaseUncheckedException (line 18) | public abstract class BaseUncheckedException extends RuntimeException {
    method BaseUncheckedException (line 26) | public BaseUncheckedException(int code) {
    method BaseUncheckedException (line 30) | public BaseUncheckedException(CodeMsg codeMsg) {
    method BaseUncheckedException (line 38) | public BaseUncheckedException(int code, String message) {
    method BaseUncheckedException (line 42) | public BaseUncheckedException(CodeMsg codeMsg, Throwable cause) {
    method BaseUncheckedException (line 51) | public BaseUncheckedException(int code, String message, Throwable caus...
    method BaseUncheckedException (line 63) | public BaseUncheckedException(int code,
    method getCode (line 77) | public int getCode() {

FILE: src/main/java/cn/ponfee/commons/exception/ServerException.java
  class ServerException (line 18) | public class ServerException extends BaseUncheckedException {
    method ServerException (line 23) | public ServerException() {
    method ServerException (line 27) | public ServerException(String message) {
    method ServerException (line 31) | public ServerException(Throwable cause) {
    method ServerException (line 35) | public ServerException(String message, Throwable cause) {
    method ServerException (line 39) | public ServerException(String message,

FILE: src/main/java/cn/ponfee/commons/exception/Throwables.java
  class Throwables (line 29) | public final class Throwables {
    method getRootCauseStackTrace (line 41) | public static String getRootCauseStackTrace(Throwable throwable) {
    method getRootCauseMessage (line 52) | public static String getRootCauseMessage(Throwable throwable) {
    type ThrowingRunnable (line 70) | @FunctionalInterface
      method run (line 72) | void run() throws T;
      method toSupplier (line 74) | default <R> ThrowingSupplier<R, T> toSupplier(R result) {
      method toCallable (line 81) | default <R> ThrowingCallable<R, T> toCallable(R result) {
      method doChecked (line 88) | static void doChecked(ThrowingRunnable<?> runnable) {
      method doCaught (line 96) | static void doCaught(ThrowingRunnable<?> runnable) {
      method doCaught (line 100) | static void doCaught(ThrowingRunnable<?> runnable, Supplier<String> ...
      method toChecked (line 109) | static Runnable toChecked(ThrowingRunnable<?> runnable) {
      method toCaught (line 119) | static Runnable toCaught(ThrowingRunnable<?> runnable) {
      method toCaught (line 123) | static Runnable toCaught(ThrowingRunnable<?> runnable, Supplier<Stri...
    type ThrowingSupplier (line 141) | @FunctionalInterface
      method get (line 143) | R get() throws T;
      method toRunnable (line 145) | default ThrowingRunnable<Throwable> toRunnable() {
      method doChecked (line 149) | static <R> R doChecked(ThrowingSupplier<R, ?> supplier) {
      method doCaught (line 157) | static <R> R doCaught(ThrowingSupplier<R, ?> supplier) {
      method doCaught (line 161) | static <R> R doCaught(ThrowingSupplier<R, ?> supplier, R defaultValu...
      method toChecked (line 171) | static <R> Supplier<R> toChecked(ThrowingSupplier<R, ?> supplier) {
      method toCaught (line 181) | static <R> Supplier<R> toCaught(ThrowingSupplier<R, ?> supplier) {
      method toCaught (line 185) | static <R> Supplier<R> toCaught(ThrowingSupplier<R, ?> supplier, R d...
    type ThrowingCallable (line 204) | @FunctionalInterface
      method call (line 206) | R call() throws T;
      method toRunnable (line 208) | default ThrowingRunnable<T> toRunnable() {
      method doChecked (line 212) | static <R> R doChecked(ThrowingCallable<R, ?> callable) {
      method doCaught (line 220) | static <R> R doCaught(ThrowingCallable<R, ?> callable) {
      method doCaught (line 224) | static <R> R doCaught(ThrowingCallable<R, ?> callable, R defaultValu...
      method toChecked (line 234) | static <R> Callable<R> toChecked(ThrowingCallable<R, ?> callable) {
      method toCaught (line 244) | static <R> Callable<R> toCaught(ThrowingCallable<R, ?> supplier) {
      method toCaught (line 248) | static <R> Callable<R> toCaught(ThrowingCallable<R, ?> supplier, R d...
    type ThrowingConsumer (line 267) | @FunctionalInterface
      method accept (line 269) | void accept(E e) throws T;
      method toFunction (line 271) | default <R> ThrowingFunction<E, R, T> toFunction(R result) {
      method doChecked (line 278) | static <E> void doChecked(ThrowingConsumer<E, ?> consumer, E arg) {
      method doCaught (line 286) | static <E> void doCaught(ThrowingConsumer<E, ?> consumer, E arg) {
      method doCaught (line 290) | static <E> void doCaught(ThrowingConsumer<E, ?> consumer, E arg, Sup...
      method toChecked (line 299) | static <E> Consumer<E> toChecked(ThrowingConsumer<E, ?> consumer) {
      method toCaught (line 309) | static <E> Consumer<E> toCaught(ThrowingConsumer<E, ?> consumer) {
      method toCaught (line 313) | static <E> Consumer<E> toCaught(ThrowingConsumer<E, ?> consumer, Sup...
    type ThrowingFunction (line 332) | @FunctionalInterface
      method apply (line 334) | R apply(E e) throws T;
      method toConsumer (line 336) | default ThrowingConsumer<E, T> toConsumer() {
      method doChecked (line 340) | static <E, R> R doChecked(ThrowingFunction<E, R, ?> function, E arg) {
      method doCaught (line 348) | static <E, R> R doCaught(ThrowingFunction<E, R, ?> function, E arg) {
      method doCaught (line 352) | static <E, R> R doCaught(ThrowingFunction<E, R, ?> function, E arg, ...
      method toChecked (line 362) | static <E, R> Function<E, R> toChecked(ThrowingFunction<E, R, ?> fun...
      method toCaught (line 372) | static <E, R> Function<E, R> toCaught(ThrowingFunction<E, R, ?> func...
      method toCaught (line 376) | static <E, R> Function<E, R> toCaught(ThrowingFunction<E, R, ?> func...

FILE: src/main/java/cn/ponfee/commons/exception/UnauthorizedException.java
  class UnauthorizedException (line 18) | public class UnauthorizedException extends BaseUncheckedException {
    method UnauthorizedException (line 23) | public UnauthorizedException() {
    method UnauthorizedException (line 27) | public UnauthorizedException(String message) {
    method UnauthorizedException (line 31) | public UnauthorizedException(Throwable cause) {
    method UnauthorizedException (line 35) | public UnauthorizedException(String message, Throwable cause) {
    method UnauthorizedException (line 39) | public UnauthorizedException(String message,

FILE: src/main/java/cn/ponfee/commons/exception/UnimplementedException.java
  class UnimplementedException (line 18) | public class UnimplementedException extends BaseUncheckedException {
    method UnimplementedException (line 23) | public UnimplementedException() {
    method UnimplementedException (line 27) | public UnimplementedException(String message) {
    method UnimplementedException (line 31) | public UnimplementedException(Throwable cause) {
    method UnimplementedException (line 35) | public UnimplementedException(String message, Throwable cause) {
    method UnimplementedException (line 39) | public UnimplementedException(String message,

FILE: src/main/java/cn/ponfee/commons/export/AbstractCsvExporter.java
  class AbstractCsvExporter (line 26) | public abstract class AbstractCsvExporter<T> extends AbstractDataExporte...
    method AbstractCsvExporter (line 32) | public AbstractCsvExporter(Appendable csv) {
    method AbstractCsvExporter (line 36) | public AbstractCsvExporter(Appendable csv, char csvSeparator) {
    method build (line 41) | @Override
    method buildComplexThead (line 112) | private void buildComplexThead(List<FlatNode<Integer, Thead>> thead) {
    method escapeCsv (line 136) | public static String escapeCsv(String text) {
    method escapeCsv (line 140) | public static String escapeCsv(String text, char separator) {
    method toString (line 155) | private static String toString(Object value) {

FILE: src/main/java/cn/ponfee/commons/export/AbstractDataExporter.java
  class AbstractDataExporter (line 25) | public abstract class AbstractDataExporter<T> implements DataExporter<T> {
    method isEmpty (line 32) | @Override
    method close (line 37) | @Override
    method nonEmpty (line 42) | public final void nonEmpty() {
    method setName (line 46) | public final AbstractDataExporter<T> setName(String name) {
    method getName (line 51) | public final String getName() {
    method rollingTbody (line 55) | protected final <E> void rollingTbody(Table<E> table, BiConsumer<Objec...
    method getLeafThead (line 100) | protected final List<Thead> getLeafThead(List<FlatNode<Integer, Thead>...
    method collection2array (line 107) | private static Object[] collection2array(Collection<?> coll) {
    method iterable2array (line 116) | private static Object[] iterable2array(Iterable<?> iterable) {
    method iterator2array (line 122) | private static Object[] iterator2array(Iterator<?> iter) {
    method covariantArray (line 130) | private static Object[] covariantArray(Object array0) {
    method map2array (line 139) | private static Object[] map2array(Map<?, ?> map) {
    method dictionary2array (line 145) | private static Object[] dictionary2array(Dictionary<?, ?> dic) {
    method bean2array (line 154) | private static Object[] bean2array(Object bean, String[] fields) {

FILE: src/main/java/cn/ponfee/commons/export/AbstractSplitExporter.java
  class AbstractSplitExporter (line 27) | public abstract class AbstractSplitExporter extends AbstractDataExporter...
    method AbstractSplitExporter (line 34) | public AbstractSplitExporter(int batchSize, String savingFilePathPrefix,
    method build (line 43) | @Override
    method splitExporter (line 70) | protected abstract AbstractAsyncSplitExporter splitExporter(Table<Obje...
    method export (line 73) | @Override
    method buildFilePath (line 78) | private String buildFilePath(int fileNo) {
    class AbstractAsyncSplitExporter (line 82) | public static abstract class AbstractAsyncSplitExporter implements Run...
      method AbstractAsyncSplitExporter (line 86) | public AbstractAsyncSplitExporter(Table<Object[]> subTable, String s...
      method run (line 91) | @Override
      method createExporter (line 102) | protected abstract AbstractDataExporter<?> createExporter() throws I...
      method complete (line 104) | protected void complete(AbstractDataExporter<?> exporter) {}

FILE: src/main/java/cn/ponfee/commons/export/CellStyleOptions.java
  type CellStyleOptions (line 16) | public enum CellStyleOptions {

FILE: src/main/java/cn/ponfee/commons/export/ConsoleExporter.java
  class ConsoleExporter (line 28) | public class ConsoleExporter extends AbstractDataExporter<String> {
    method ConsoleExporter (line 38) | public ConsoleExporter(Appendable out) {
    method ConsoleExporter (line 42) | public ConsoleExporter(Appendable out, int maxColumnWidth, boolean row...
    method build (line 51) | @Override
    method export (line 120) | @Override
    method horizon (line 126) | private ConsoleExporter horizon() throws IOException {
    method append (line 133) | private ConsoleExporter append(char c) throws IOException {
    method append (line 138) | private ConsoleExporter append(char c, int count) throws IOException {
    method append (line 145) | private ConsoleExporter append(CharSequence text) throws IOException {
    method append (line 150) | private ConsoleExporter append(String text, int width) throws IOExcept...
    method center (line 161) | private ConsoleExporter center(String text, int width) throws IOExcept...
    method newLine (line 172) | private void newLine() throws IOException {
    method union (line 176) | private static <T> List<T> union(T first, Collection<T> coll) {
    class Column (line 183) | private class Column extends Thead {
      method Column (line 188) | public Column(Thead th) {

FILE: src/main/java/cn/ponfee/commons/export/CsvFileExporter.java
  class CsvFileExporter (line 25) | public class CsvFileExporter extends CsvWriteExporter {
    method CsvFileExporter (line 27) | public CsvFileExporter(String filePath, boolean withBom) throws IOExce...
    method CsvFileExporter (line 31) | public CsvFileExporter(File file, Charset charset, boolean withBom) th...
    method CsvFileExporter (line 35) | public CsvFileExporter(File file, Charset charset, boolean withBom, ch...
    method createWriter (line 39) | private static Writer createWriter(File file, Charset charset, boolean...

FILE: src/main/java/cn/ponfee/commons/export/CsvStringExporter.java
  class CsvStringExporter (line 23) | public class CsvStringExporter extends AbstractCsvExporter<String> {
    method CsvStringExporter (line 25) | public CsvStringExporter() {
    method CsvStringExporter (line 29) | public CsvStringExporter(int capacity) {
    method CsvStringExporter (line 33) | public CsvStringExporter(int capacity, char csvSeparator) {
    method export (line 37) | @Override
    method write (line 42) | public void write(String filePath, Charset charset, boolean withBom) {

FILE: src/main/java/cn/ponfee/commons/export/CsvWriteExporter.java
  class CsvWriteExporter (line 18) | public class CsvWriteExporter extends AbstractCsvExporter<Void> {
    method CsvWriteExporter (line 20) | public CsvWriteExporter(Writer writer) {
    method CsvWriteExporter (line 24) | public CsvWriteExporter(Writer writer, char csvSeparator) {
    method export (line 28) | @Override
    method close (line 33) | @Override

FILE: src/main/java/cn/ponfee/commons/export/DataExporter.java
  type DataExporter (line 21) | public interface DataExporter<T> extends Closeable {
    method build (line 29) | <E> void build(Table<E> table);
    method export (line 34) | T export();
    method isEmpty (line 39) | boolean isEmpty();

FILE: src/main/java/cn/ponfee/commons/export/ExcelExporter.java
  class ExcelExporter (line 55) | public class ExcelExporter extends AbstractDataExporter<byte[]> {
    method ExcelExporter (line 87) | public ExcelExporter() {
    method build (line 154) | @Override
    method insertImage (line 248) | public void insertImage(byte[] imageBytes) {
    method insertImage (line 257) | public void insertImage(byte[] imageBytes, int width, int height) {
    method write (line 291) | public void write(OutputStream out) {
    method write (line 304) | public void write(String filepath) {
    method write (line 308) | public void write(File file) {
    method export (line 319) | @Override
    method close (line 329) | @Override
    method getSheet (line 349) | protected SXSSFSheet getSheet(String name) {
    method removeSheet (line 361) | protected void removeSheet(String name) {
    method createFreezePane (line 366) | private void createFreezePane() {
    method buildComplexThead (line 387) | private <E> void buildComplexThead(Table<E> table, SXSSFSheet sheet, C...
    method getTmeta (line 455) | private Tmeta getTmeta(List<Thead> thead, int index) {
    method createBlankRow (line 467) | private void createBlankRow(String text, SXSSFSheet sheet, XSSFCellSty...
    method createCell (line 479) | private void createCell(SXSSFRow row, int colIndex, XSSFCellStyle styl...
    method createCell (line 483) | private void createCell(SXSSFRow row, int colIndex, XSSFCellStyle styl...
    method createCell (line 498) | private void createCell(SXSSFRow row, int colIndex, XSSFCellStyle styl...
    method processOptions (line 549) | @SuppressWarnings("unchecked")
    method createStyles (line 585) | private List<XSSFCellStyle> createStyles(List<Thead> thead) {
    method setCellString (line 627) | private static void setCellString(SXSSFCell cell, Object value) {
    class CursorRowNumber (line 638) | @SuppressWarnings("unused")
      method CursorRowNumber (line 642) | CursorRowNumber() {
      method CursorRowNumber (line 646) | CursorRowNumber(int initValue) {
      method getAndIncrement (line 650) | int getAndIncrement() {
      method incrementAndGet (line 654) | int incrementAndGet() {
      method getAndDecrement (line 658) | int getAndDecrement() {
      method decrementAndGet (line 662) | int decrementAndGet() {
      method add (line 666) | void add(int i) {
      method addAndGet (line 670) | int addAndGet(int i) {
      method getAndAdd (line 675) | int getAndAdd(int i) {
      method set (line 681) | void set(int i) {
      method getAndSet (line 685) | int getAndSet(int i) {
      method get (line 691) | int get() {
      method increment (line 695) | void increment() {
    class Freeze (line 703) | @SuppressWarnings("unused")
      method Freeze (line 709) | Freeze(int colSplit, int rowSplit) {
      method enable (line 714) | void enable() {
      method disable (line 718) | void disable() {

FILE: src/main/java/cn/ponfee/commons/export/HtmlExporter.java
  class HtmlExporter (line 27) | public class HtmlExporter extends AbstractDataExporter<String> {
    method HtmlExporter (line 74) | public HtmlExporter() {
    method HtmlExporter (line 78) | public HtmlExporter(String initHtml) {
    method build (line 85) | @Override
    method export (line 183) | @Override
    method body (line 188) | public String body() {
    method horizon (line 192) | public HtmlExporter horizon() {
    method append (line 201) | public HtmlExporter append(String string) {
    method insertImage (line 210) | public HtmlExporter insertImage(String imageB64) {
    method buildComplexThead (line 226) | private void buildComplexThead(List<FlatNode<Integer, Thead>> flats) {
    method getTmeta (line 250) | private Tmeta getTmeta(List<Thead> thead, int index) {
    method processMeta (line 254) | private void processMeta(Object value, Tmeta tmeta) {
    method processMeta (line 268) | private void processMeta(Object value, Tmeta tmeta, int tbodyRowIdx,
    method formatData (line 318) | private static String formatData(Object data, Tmeta tmeta) {
    method processOptions (line 337) | @SuppressWarnings("unchecked")

FILE: src/main/java/cn/ponfee/commons/export/SplitCsvFileExporter.java
  class SplitCsvFileExporter (line 19) | public class SplitCsvFileExporter extends AbstractSplitExporter {
    method SplitCsvFileExporter (line 23) | public SplitCsvFileExporter(int batchSize, String savingFilePathPrefix,
    method splitExporter (line 29) | @Override
    class AsnycCsvFileExporter (line 34) | private static class AsnycCsvFileExporter extends AbstractAsyncSplitEx...
      method AsnycCsvFileExporter (line 37) | AsnycCsvFileExporter(Table<Object[]> subTable, String savingFilePath,
      method createExporter (line 43) | @Override

FILE: src/main/java/cn/ponfee/commons/export/SplitExcelExporter.java
  class SplitExcelExporter (line 18) | public class SplitExcelExporter extends AbstractSplitExporter {
    method SplitExcelExporter (line 20) | public SplitExcelExporter(int batchSize, String savingFilePathPrefix, ...
    method splitExporter (line 24) | @Override
    class AsnycExcelExporter (line 29) | private static class AsnycExcelExporter extends AbstractAsyncSplitExpo...
      method AsnycExcelExporter (line 32) | AsnycExcelExporter(Table<Object[]> subTable, String savingFilePath,
      method createExporter (line 38) | @Override
      method complete (line 45) | @Override

FILE: src/main/java/cn/ponfee/commons/export/Table.java
  class Table (line 29) | public class Table<E> implements Serializable {
    method Table (line 45) | public Table(List<FlatNode<Integer, Thead>> thead,
    method Table (line 57) | public Table(List<PlainNode<Integer, Thead>> list) {
    method Table (line 61) | public Table(List<PlainNode<Integer, Thead>> list,
    method Table (line 67) | public Table(String[] names) {
    method Table (line 71) | public Table(String[] names, Function<E, Object[]> converter) {
    method copyOfWithoutTbody (line 80) | public Table<E> copyOfWithoutTbody() {
    method copyOfWithoutTbody (line 84) | public <H> Table<H> copyOfWithoutTbody(Function<H, Object[]> converter) {
    method getThead (line 88) | public List<FlatNode<Integer, Thead>> getThead() {
    method getConverter (line 92) | public Function<E, Object[]> getConverter() {
    method getCaption (line 96) | public String getCaption() {
    method setCaption (line 100) | public void setCaption(String caption) {
    method getTfoot (line 104) | public Object[] getTfoot() {
    method setTfoot (line 108) | public void setTfoot(Object[] tfoot) {
    method getComment (line 112) | public String getComment() {
    method setComment (line 116) | public void setComment(String comment) {
    method getOptions (line 120) | public Map<CellStyleOptions, Object> getOptions() {
    method setOptions (line 124) | public void setOptions(Map<CellStyleOptions, Object> options) {
    method addRowsAndEnd (line 129) | public void addRowsAndEnd(List<E> rows) {
    method addRows (line 134) | public void addRows(List<E> rows) {
    method addRowAndEnd (line 149) | public void addRowAndEnd(E row) {
    method addRow (line 154) | public void addRow(E row) {
    method toEnd (line 168) | public synchronized Table<E> toEnd() {
    method isEnd (line 174) | boolean isEnd() {
    method isNotEnd (line 178) | boolean isNotEnd() {
    method isEmptyTbody (line 182) | boolean isEmptyTbody() {
    method getRow (line 186) | E getRow(long timeoutMillis) throws InterruptedException {

FILE: src/main/java/cn/ponfee/commons/export/Thead.java
  class Thead (line 18) | public class Thead implements Serializable {
    method Thead (line 26) | public Thead(String name) {
    method Thead (line 30) | public Thead(String name, Tmeta tmeta, String field) {
    method getName (line 36) | public String getName() {
    method getTmeta (line 40) | public Tmeta getTmeta() {
    method getField (line 44) | public String getField() {

FILE: src/main/java/cn/ponfee/commons/export/Tmeta.java
  class Tmeta (line 21) | public class Tmeta implements Serializable {
    method Tmeta (line 32) | public Tmeta() {}
    method Tmeta (line 34) | public Tmeta(Type type, String format, Align align,
    method getType (line 43) | public Type getType() {
    method setType (line 47) | public void setType(Type type) {
    method getAlign (line 51) | public Align getAlign() {
    method setAlign (line 55) | public void setAlign(Align align) {
    method isNowrap (line 59) | public boolean isNowrap() {
    method setNowrap (line 63) | public void setNowrap(boolean nowrap) {
    method setColor (line 67) | public void setColor(Color color) {
    method setColor (line 72) | public void setColor(String color) {
    method getColor (line 77) | public Color getColor() {
    method getColorHex (line 81) | public String getColorHex() {
    method getFormat (line 85) | public String getFormat() {
    method setFormat (line 89) | public void setFormat(String format) {
    type Type (line 93) | public enum Type {
    type Align (line 97) | public enum Align {

FILE: src/main/java/cn/ponfee/commons/extract/CsvExtractor.java
  class CsvExtractor (line 30) | public class CsvExtractor extends DataExtractor {
    method CsvExtractor (line 37) | protected CsvExtractor(ExtractableDataSource dataSource, String[] head...
    method extract (line 50) | @Override

FILE: src/main/java/cn/ponfee/commons/extract/DataExtractor.java
  class DataExtractor (line 28) | public abstract class DataExtractor {
    method DataExtractor (line 34) | protected DataExtractor(ExtractableDataSource dataSource, String[] hea...
    method extract (line 39) | public abstract void extract(BiConsumer<Integer, String[]> processor) ...
    method extract (line 41) | public final List<String[]> extract() throws IOException {
    method extract (line 54) | public final List<String[]> extract(int count) throws IOException {
    method extract (line 66) | public final void extract(int batchSize, Consumer<List<String[]>> acti...
    method verify (line 88) | public final ValidateResult verify(BiFunction<Integer, String[], Strin...
    method isNotEmpty (line 107) | protected boolean isNotEmpty(String[] data) {

FILE: src/main/java/cn/ponfee/commons/extract/DataExtractorBuilder.java
  class DataExtractorBuilder (line 29) | public class DataExtractorBuilder {
    method DataExtractorBuilder (line 48) | private DataExtractorBuilder(Object dataSource, String fileName,
    method newBuilder (line 55) | public static DataExtractorBuilder newBuilder(InputStream dataSource,
    method newBuilder (line 60) | public static DataExtractorBuilder newBuilder(String path) {
    method newBuilder (line 64) | public static DataExtractorBuilder newBuilder(File dataSource) {
    method headers (line 71) | public DataExtractorBuilder headers(String[] headers) {
    method startRow (line 76) | public DataExtractorBuilder startRow(int startRow) {
    method sheetIndex (line 81) | public DataExtractorBuilder sheetIndex(int sheetIndex) {
    method streaming (line 86) | public DataExtractorBuilder streaming(boolean streaming) {
    method csvFormat (line 91) | public DataExtractorBuilder csvFormat(CSVFormat csvFormat) {
    method charset (line 96) | public DataExtractorBuilder charset(Charset charset) {
    method build (line 101) | public DataExtractor build() {

FILE: src/main/java/cn/ponfee/commons/extract/ExcelExtractor.java
  class ExcelExtractor (line 30) | public class ExcelExtractor extends DataExtractor {
    method ExcelExtractor (line 36) | protected ExcelExtractor(ExtractableDataSource dataSource, String[] he...
    method extract (line 44) | @Override
    method createWorkbook (line 51) | protected Workbook createWorkbook(ExtractableDataSource dataSource) th...
    method extract (line 60) | private void extract(Workbook workbook, BiConsumer<Integer, String[]> ...
    method getStringCellValue (line 106) | private static String getStringCellValue(Cell cell) {
    method getNumericAsString (line 136) | private static String getNumericAsString(Cell cell) {
    type ExcelType (line 141) | public enum ExcelType {

FILE: src/main/java/cn/ponfee/commons/extract/ExtractableDataSource.java
  class ExtractableDataSource (line 19) | public class ExtractableDataSource implements Closeable {
    method ExtractableDataSource (line 23) | public ExtractableDataSource(@Nonnull Object dataSource) {
    method close (line 32) | @Override
    method getDataSource (line 39) | public Object getDataSource() {
    method asInputStream (line 43) | public InputStream asInputStream() throws IOException {

FILE: src/main/java/cn/ponfee/commons/extract/ValidateResult.java
  class ValidateResult (line 22) | public class ValidateResult {
    method hasErrors (line 27) | public boolean hasErrors() {
    method isEmpty (line 31) | public boolean isEmpty() {
    method getErrorsAsString (line 35) | public String getErrorsAsString() {
    method getData (line 39) | public List<String[]> getData() {
    method getErrors (line 43) | public List<String> getErrors() {
    method addData (line 47) | public void addData(String[] obj) {
    method addError (line 51) | public void addError(String error) {

FILE: src/main/java/cn/ponfee/commons/extract/streaming/StreamingExcelExtractor.java
  class StreamingExcelExtractor (line 71) | public class StreamingExcelExtractor extends ExcelExtractor {
    method StreamingExcelExtractor (line 75) | public StreamingExcelExtractor(ExtractableDataSource dataSource, Strin...
    method StreamingExcelExtractor (line 80) | public StreamingExcelExtractor(ExtractableDataSource dataSource, Strin...
    method StreamingExcelExtractor (line 85) | public StreamingExcelExtractor(ExtractableDataSource dataSource, Strin...
    method createWorkbook (line 91) | @Override

FILE: src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingCell.java
  class HSSFStreamingCell (line 25) | public class HSSFStreamingCell implements Cell {
    method HSSFStreamingCell (line 29) | public HSSFStreamingCell(String value) {
    method getStringCellValue (line 33) | @Override
    method getCellType (line 38) | @Override
    method getColumnIndex (line 44) | @Override @Deprecated
    method getRowIndex (line 49) | @Override @Deprecated
    method getSheet (line 54) | @Override @Deprecated
    method getRow (line 59) | @Override @Deprecated
    method setCellType (line 64) | @Override @Deprecated
    method getCachedFormulaResultType (line 69) | @Override @Deprecated
    method setCellValue (line 74) | @Override @Deprecated
    method setCellValue (line 79) | @Override @Deprecated
    method setCellValue (line 84) | @Override @Deprecated
    method setCellValue (line 89) | @Override @Deprecated
    method setCellValue (line 94) | @Override @Deprecated
    method setCellFormula (line 99) | @Override @Deprecated
    method getCellFormula (line 104) | @Override @Deprecated
    method getNumericCellValue (line 109) | @Override @Deprecated
    method getDateCellValue (line 114) | @Override @Deprecated
    method getRichStringCellValue (line 119) | @Override @Deprecated
    method setCellValue (line 124) | @Override @Deprecated
    method setCellErrorValue (line 129) | @Override @Deprecated
    method getBooleanCellValue (line 134) | @Override @Deprecated
    method getErrorCellValue (line 139) | @Override @Deprecated
    method setCellStyle (line 144) | @Override @Deprecated
    method getCellStyle (line 149) | @Override @Deprecated
    method setAsActiveCell (line 154) | @Override @Deprecated
    method getAddress (line 159) | @Override @Deprecated
    method setCellComment (line 164) | @Override @Deprecated
    method getCellComment (line 169) | @Override @Deprecated
    method removeCellComment (line 174) | @Override @Deprecated
    method getHyperlink (line 179) | @Override @Deprecated
    method setHyperlink (line 184) | @Override @Deprecated
    method removeHyperlink (line 189) | @Override @Deprecated
    method getArrayFormulaRange (line 194) | @Override @Deprecated
    method isPartOfArrayFormulaGroup (line 199) | @Override @Deprecated
    method removeFormula (line 204) | @Override @Deprecated
    method setBlank (line 209) | @Override @Deprecated
    method setCellValue (line 214) | @Override @Deprecated
    method getLocalDateTimeCellValue (line 219) | @Override @Deprecated

FILE: src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingReader.java
  class HSSFStreamingReader (line 28) | public class HSSFStreamingReader {
    method HSSFStreamingReader (line 34) | private HSSFStreamingReader() {}
    method create (line 41) | public static HSSFStreamingReader create() {
    method create (line 52) | public static HSSFStreamingReader create(int rowCacheSize, int... shee...
    method create (line 67) | public static HSSFStreamingReader create(int rowCacheSize, String... s...
    method open (line 76) | public HSSFStreamingWorkbook open(InputStream input, Executor executor) {
    method open (line 82) | public HSSFStreamingWorkbook open(File file, Executor executor) {
    method open (line 90) | public HSSFStreamingWorkbook open(String filePath, Executor executor) {

FILE: src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingRow.java
  class HSSFStreamingRow (line 26) | public class HSSFStreamingRow implements Row {
    method HSSFStreamingRow (line 32) | public HSSFStreamingRow(int rowNum, int rowOrder) {
    method iterator (line 37) | @Override
    method removeCell (line 42) | @Override
    method getRowNum (line 47) | @Override
    method getRowOrder (line 52) | public int getRowOrder() {
    method getCell (line 56) | @Override
    method getCell (line 61) | @Override
    method getLastCellNum (line 66) | @Override
    method getPhysicalNumberOfCells (line 71) | @Override
    method cellIterator (line 76) | @Override
    method putCell (line 81) | public void putCell(int index, Cell cell) {
    method isEmpty (line 85) | public boolean isEmpty() {
    method getSheet (line 90) | @Override
    method createCell (line 95) | @Override
    method createCell (line 100) | @Override
    method setRowNum (line 105) | @Override
    method getFirstCellNum (line 110) | @Override
    method setHeight (line 115) | @Override
    method setZeroHeight (line 120) | @Override
    method getZeroHeight (line 125) | @Override
    method setHeightInPoints (line 130) | @Override
    method getHeight (line 135) | @Override
    method getHeightInPoints (line 140) | @Override
    method isFormatted (line 145) | @Override
    method getRowStyle (line 150) | @Override
    method setRowStyle (line 155) | @Override
    method getOutlineLevel (line 160) | @Override
    method shiftCellsRight (line 165) | @Override
    method shiftCellsLeft (line 170) | @Override

FILE: src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingSheet.java
  class HSSFStreamingSheet (line 34) | public class HSSFStreamingSheet implements Sheet {
    method HSSFStreamingSheet (line 43) | public HSSFStreamingSheet(int index, String name,
    method iterator (line 60) | @Override
    method rowIterator (line 65) | @Override
    method getSheetName (line 70) | @Override
    method getSheetIndex (line 75) | public int getSheetIndex() {
    method isDiscard (line 79) | public boolean isDiscard() {
    method getCacheRowCount (line 83) | public int getCacheRowCount() {
    method toEnd (line 87) | void toEnd() {
    method isEnd (line 91) | private boolean isEnd() {
    method putRow (line 95) | void putRow(Row row) throws InterruptedException {
    class RowsIterator (line 99) | private static class RowsIterator implements Iterator<Row> {
      method RowsIterator (line 103) | RowsIterator(HSSFStreamingSheet sheet) {
      method hasNext (line 107) | @Override
      method next (line 124) | @Override
    method getWorkbook (line 133) | @Override
    method createRow (line 138) | @Override
    method removeRow (line 143) | @Override
    method getRow (line 148) | @Override
    method getPhysicalNumberOfRows (line 153) | @Override
    method getFirstRowNum (line 158) | @Override
    method getLastRowNum (line 163) | @Override
    method setColumnHidden (line 168) | @Override
    method isColumnHidden (line 173) | @Override
    method setRightToLeft (line 178) | @Override
    method isRightToLeft (line 183) | @Override
    method setColumnWidth (line 188) | @Override
    method getColumnWidth (line 193) | @Override
    method getColumnWidthInPixels (line 198) | @Override
    method setDefaultColumnWidth (line 203) | @Override
    method getDefaultColumnWidth (line 208) | @Override
    method getDefaultRowHeight (line 213) | @Override
    method getDefaultRowHeightInPoints (line 218) | @Override
    method setDefaultRowHeight (line 223) | @Override
    method setDefaultRowHeightInPoints (line 228) | @Override
    method getColumnStyle (line 233) | @Override
    method addMergedRegion (line 238) | @Override
    method addMergedRegionUnsafe (line 243) | @Override
    method validateMergedRegions (line 248) | @Override
    method setVerticallyCenter (line 253) | @Override
    method setHorizontallyCenter (line 258) | @Override
    method getHorizontallyCenter (line 263) | @Override
    method getVerticallyCenter (line 268) | @Override
    method removeMergedRegion (line 273) | @Override
    method removeMergedRegions (line 278) | @Override
    method getNumMergedRegions (line 283) | @Override
    method getMergedRegion (line 288) | @Override
    method getMergedRegions (line 293) | @Override
    method setForceFormulaRecalculation (line 298) | @Override
    method getForceFormulaRecalculation (line 303) | @Override
    method setAutobreaks (line 308) | @Override
    method setDisplayGuts (line 313) | @Override
    method setDisplayZeros (line 318) | @Override
    method isDisplayZeros (line 323) | @Override
    method setFitToPage (line 328) | @Override
    method setRowSumsBelow (line 333) | @Override
    method setRowSumsRight (line 338) | @Override
    method getAutobreaks (line 343) | @Override
    method getDisplayGuts (line 348) | @Override
    method getFitToPage (line 353) | @Override
    method getRowSumsBelow (line 358) | @Override
    method getRowSumsRight (line 363) | @Override
    method isPrintGridlines (line 368) | @Override
    method setPrintGridlines (line 373) | @Override
    method isPrintRowAndColumnHeadings (line 378) | @Override
    method setPrintRowAndColumnHeadings (line 383) | @Override
    method getPrintSetup (line 388) | @Override
    method getHeader (line 393) | @Override
    method getFooter (line 398) | @Override
    method setSelected (line 403) | @Override
    method getMargin (line 408) | @Override
    method getMargin (line 413) | @Override
    method setMargin (line 418) | @Override
    method setMargin (line 423) | @Override
    method getProtect (line 428) | @Override
    method protectSheet (line 433) | @Override
    method getScenarioProtect (line 438) | @Override
    method setZoom (line 443) | @Override
    method getTopRow (line 448) | @Override
    method getLeftCol (line 453) | @Override
    method showInPane (line 458) | @Override
    method shiftRows (line 463) | @Override
    method shiftRows (line 468) | @Override
    method shiftColumns (line 474) | @Override
    method createFreezePane (line 479) | @Override
    method createFreezePane (line 485) | @Override
    method createSplitPane (line 490) | @Override
    method createSplitPane (line 496) | @Override
    method getPaneInformation (line 501) | @Override
    method setDisplayGridlines (line 506) | @Override
    method isDisplayGridlines (line 511) | @Override
    method setDisplayFormulas (line 516) | @Override
    method isDisplayFormulas (line 521) | @Override
    method setDisplayRowColHeadings (line 526) | @Override
    method isDisplayRowColHeadings (line 531) | @Override
    method setRowBreak (line 536) | @Override
    method isRowBroken (line 541) | @Override
    method removeRowBreak (line 546) | @Override
    method getRowBreaks (line 551) | @Override
    method getColumnBreaks (line 556) | @Override
    method setColumnBreak (line 561) | @Override
    method isColumnBroken (line 566) | @Override
    method removeColumnBreak (line 571) | @Override
    method setColumnGroupCollapsed (line 576) | @Override
    method groupColumn (line 581) | @Override
    method ungroupColumn (line 586) | @Override
    method groupRow (line 591) | @Override
    method ungroupRow (line 596) | @Override
    method setRowGroupCollapsed (line 601) | @Override
    method setDefaultColumnStyle (line 606) | @Override
    method autoSizeColumn (line 611) | @Override
    method autoSizeColumn (line 616) | @Override
    method getCellComment (line 621) | @Override
    method getCellComments (line 626) | @Override
    method getDrawingPatriarch (line 631) | @Override
    method createDrawingPatriarch (line 636) | @Override
    method isSelected (line 641) | @Override
    method setArrayFormula (line 646) | @Override
    method removeArrayFormula (line 652) | @Override
    method getDataValidationHelper (line 657) | @Override
    method getDataValidations (line 662) | @Override
    method addValidationData (line 667) | @Override
    method setAutoFilter (line 672) | @Override
    method getSheetConditionalFormatting (line 677) | @Override
    method getRepeatingRows (line 682) | @Override
    method getRepeatingColumns (line 687) | @Override
    method setRepeatingRows (line 692) | @Override
    method setRepeatingColumns (line 697) | @Override
    method getColumnOutlineLevel (line 702) | @Override
    method getHyperlink (line 707) | @Override
    method getHyperlink (line 712) | @Override
    method getHyperlinkList (line 717) | @Override
    method getActiveCell (line 722) | @Override
    method setActiveCell (line 727) | @Override

FILE: src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingWorkbook.java
  class HSSFStreamingWorkbook (line 37) | public class HSSFStreamingWorkbook implements Workbook, Closeable {
    method HSSFStreamingWorkbook (line 44) | public HSSFStreamingWorkbook(InputStream input, int rowCacheSize,
    method iterator (line 52) | @Override
    method sheetIterator (line 58) | @Override
    method getSheetName (line 64) | @Override
    method getSheetIndex (line 70) | @Override
    method getSheetIndex (line 81) | @Override
    method getNumberOfSheets (line 92) | @Override
    method getSheetAt (line 98) | @Override
    method getSheet (line 104) | @Override
    method close (line 115) | @Override
    method awaitReadAllSheet (line 120) | private void awaitReadAllSheet() {
    class AsyncHSSFReader (line 134) | private class AsyncHSSFReader implements HSSFListener, Runnable {
      method AsyncHSSFReader (line 151) | private AsyncHSSFReader(int rowCacheSize, int[] sheetIndexs,
      method run (line 159) | @Override
      method processRecord (line 183) | @Override
      method endRead (line 224) | private void endRead() {
      method putRow (line 232) | private void putRow(HSSFStreamingRow row) {
      method isDiscard (line 246) | private boolean isDiscard(int sstIdx, String sstName) {
      method getString (line 256) | private String getString(CellRecord record) {
    method isSheetHidden (line 284) | @Override @Deprecated
    method isSheetVeryHidden (line 289) | @Override @Deprecated
    method getActiveSheetIndex (line 294) | @Override @Deprecated
    method setActiveSheet (line 299) | @Override @Deprecated
    method getFirstVisibleTab (line 304) | @Override @Deprecated
    method setFirstVisibleTab (line 309) | @Override @Deprecated
    method setSheetOrder (line 314) | @Override @Deprecated
    method setSelectedTab (line 319) | @Override @Deprecated
    method setSheetName (line 324) | @Override @Deprecated
    method createSheet (line 329) | @Override @Deprecated
    method createSheet (line 334) | @Override @Deprecated
    method cloneSheet (line 339) | @Override @Deprecated
    method removeSheetAt (line 344) | @Override @Deprecated
    method createFont (line 349) | @Override @Deprecated
    method findFont (line 354) | @Override @Deprecated
    method getNumberOfFonts (line 359) | @Override @Deprecated
    method getNumberOfFontsAsInt (line 364) | @Override @Deprecated
    method getFontAt (line 369) | @Override @Deprecated
    method createCellStyle (line 374) | @Override @Deprecated
    method getNumCellStyles (line 379) | @Override @Deprecated
    method getCellStyleAt (line 384) | @Override @Deprecated
    method write (line 389) | @Override @Deprecated
    method getNumberOfNames (line 394) | @Override @Deprecated
    method getName (line 399) | @Override @Deprecated
    method getNames (line 404) | @Override @Deprecated
    method getAllNames (line 409) | @Override @Deprecated
    method createName (line 414) | @Override @Deprecated
    method removeName (line 419) | @Override @Deprecated
    method linkExternalWorkbook (line 424) | @Override @Deprecated
    method setPrintArea (line 429) | @Override @Deprecated
    method setPrintArea (line 434) | @Override @Deprecated
    method getPrintArea (line 439) | @Override @Deprecated
    method removePrintArea (line 444) | @Override @Deprecated
    method getMissingCellPolicy (line 449) | @Override @Deprecated
    method setMissingCellPolicy (line 454) | @Override @Deprecated
    method createDataFormat (line 459) | @Override @Deprecated
    method addPicture (line 464) | @Override @Deprecated
    method getAllPictures (line 469) | @Override @Deprecated
    method getCreationHelper (line 474) | @Override @Deprecated
    method isHidden (line 479) | @Override @Deprecated
    method setHidden (line 484) | @Override @Deprecated
    method setSheetHidden (line 489) | @Override @Deprecated
    method getSheetVisibility (line 494) | @Override @Deprecated
    method setSheetVisibility (line 499) | @Override @Deprecated
    method addToolPack (line 504) | @Override @Deprecated
    method setForceFormulaRecalculation (line 509) | @Override @Deprecated
    method getForceFormulaRecalculation (line 514) | @Override @Deprecated
    method getSpreadsheetVersion (line 519) | @Override @Deprecated
    method addOlePackage (line 524) | @Override @Deprecated
    method createEvaluationWorkbook (line 529) | @Override @Deprecated
    method getCellReferenceType (line 534) | @Override @Deprecated
    method setCellReferenceType (line 539) | @Override @Deprecated

FILE: src/main/java/cn/ponfee/commons/http/ContentType.java
  type ContentType (line 16) | public enum ContentType {
    method ContentType (line 43) | ContentType(String value) {
    method value (line 47) | public String value() {
    method ofValue (line 51) | public static ContentType ofValue(String value) {

FILE: src/main/java/cn/ponfee/commons/http/Http.java
  class Http (line 58) | public final class Http {
    method Http (line 80) | private Http(@Nonnull String url, @Nonnull HttpMethod method) {
    method get (line 86) | public static Http get(String url) {
    method post (line 90) | public static Http post(String url) {
    method put (line 94) | public static Http put(String url) {
    method head (line 98) | public static Http head(String url) {
    method delete (line 102) | public static Http delete(String url) {
    method trace (line 106) | public static Http trace(String url) {
    method options (line 110) | public static Http options(String url) {
    method of (line 114) | public static Http of(String url, String method) {
    method of (line 118) | public static Http of(String url, HttpMethod method) {
    method addHeader (line 129) | public Http addHeader(String name, String value) {
    method addHeader (line 139) | public Http addHeader(Map<String, String> headers) {
    method addParam (line 154) | public Http addParam(Map<String, ?> params) {
    method addParam (line 159) | public <T> Http addParam(String name, T value) {
    method data (line 171) | public Http data(Map<String, ?> data) {
    method data (line 184) | public Http data(Map<String, ?> data, String charset) {
    method data (line 194) | public Http data(String data) {
    method addPart (line 202) | public Http addPart(String formName, String fileName, Object mimePart) {
    method addPart (line 214) | public Http addPart(String formName, String fileName,
    method encode (line 226) | public Http encode(Boolean encode) {
    method contentType (line 244) | public Http contentType(ContentType contentType, String contentCharset) {
    method contentType (line 250) | public Http contentType(ContentType contentType) {
    method accept (line 261) | public Http accept(ContentType contentType) {
    method connTimeoutSeconds (line 272) | public Http connTimeoutSeconds(int seconds) {
    method readTimeoutSeconds (line 282) | public Http readTimeoutSeconds(int seconds) {
    method setSSLSocketFactory (line 293) | public Http setSSLSocketFactory(SSLSocketFactory factory) {
    method setSSLSocketFactory (line 298) | public Http setSSLSocketFactory(SSLContext sslContext) {
    method request (line 303) | public <T> T request(JavaType type) {
    method request (line 307) | public <T> T request(Class<T> type) {
    method request (line 315) | public String request() {
    method download (line 324) | public void download(String filepath) {
    method download (line 332) | public byte[] download() {
    method download (line 343) | public void download(OutputStream output) {
    method getRespHeaders (line 368) | public Map<String, List<String>> getRespHeaders() {
    method getReqHeaders (line 372) | public Map<String, String> getReqHeaders() {
    method getRespHeaders (line 376) | public String[] getRespHeaders(String name) {
    method getRespHeader (line 388) | public String getRespHeader(String name) {
    method getStatus (line 398) | public HttpStatus getStatus() {
    method request0 (line 403) | private HttpRequest request0() {
    method disconnect (line 449) | private void disconnect(HttpRequest request) {
    type HttpMethod (line 463) | public enum HttpMethod {
    class MimePart (line 470) | private static final class MimePart {
      method MimePart (line 476) | MimePart(String formName, String fileName, String contentType, Objec...

FILE: src/main/java/cn/ponfee/commons/http/HttpException.java
  class HttpException (line 16) | public class HttpException extends RuntimeException {
    method HttpException (line 20) | public HttpException() {
    method HttpException (line 24) | public HttpException(String message) {
    method HttpException (line 28) | public HttpException(String message, Throwable cause) {
    method HttpException (line 32) | public HttpException(Throwable cause) {
    method HttpException (line 36) | protected HttpException(String message, Throwable cause,

FILE: src/main/java/cn/ponfee/commons/http/HttpParams.java
  class HttpParams (line 28) | public class HttpParams {
    method parseUrlParams (line 31) | public static Map<String, String[]> parseUrlParams(String url) {
    method parseUrlParams (line 35) | public static Map<String, String[]> parseUrlParams(String url, String ...
    method parseParams (line 41) | public static Map<String, String[]> parseParams(String queryString) {
    method parseParams (line 51) | public static Map<String, String[]> parseParams(String queryString, St...
    method buildParams (line 75) | public static String buildParams(Map<String, ?> params) {
    method buildParams (line 85) | public static String buildParams(Map<String, ?> params, String encodin...
    method buildUrlPath (line 122) | public static String buildUrlPath(String url, String encoding, Map<Str...
    method buildUrlPath (line 132) | public static String buildUrlPath(String url, String encoding, Object....
    method buildSigning (line 142) | public static String buildSigning(Map<String, ?> params) {
    method buildSigning (line 146) | public static String buildSigning(Map<String, ?> params, String[] excl...
    method buildSigning (line 150) | public static String buildSigning(Map<String, ?> params, String wrapCh...
    method buildForm (line 186) | public static String buildForm(String url, Map<String, ?> params) {
    method buildSoap (line 224) | public static String buildSoap(String method, String namespace, Map<St...
    method putParam (line 243) | private static void putParam(Map<String, String[]> params, String name...
    method buildInputElement (line 252) | private static void buildInputElement(StringBuilder form, String name,...

FILE: src/main/java/cn/ponfee/commons/http/HttpRequest.java
  class HttpRequest (line 71) | public class HttpRequest {
    method getAcceptedIssuers (line 225) | @Override
    method checkClientTrusted (line 230) | @Override
    method checkServerTrusted (line 235) | @Override
    method getValidCharset (line 251) | private static String getValidCharset(String charset) {
    method addPathSeparator (line 259) | private static StringBuilder addPathSeparator(String baseUrl, StringBu...
    method addParamPrefix (line 270) | private static StringBuilder addParamPrefix(String baseUrl, StringBuil...
    method addParam (line 282) | private static StringBuilder addParam(Object key, Object value, String...
    type ConnectionFactory (line 315) | public interface ConnectionFactory {
      method create (line 320) | HttpURLConnection create(URL url) throws IOException;
      method create (line 327) | HttpURLConnection create(URL url, Proxy proxy) throws IOException;
      method create (line 334) | @Override
      method create (line 339) | @Override
    method setConnectionFactory (line 351) | public static void setConnectionFactory(ConnectionFactory cf) {
    type UploadProgress (line 358) | public interface UploadProgress {
      method onUpload (line 366) | void onUpload(long uploaded, long total);
    class Operation (line 379) | private abstract static class Operation<V> implements Callable<V> {
      method run (line 388) | protected abstract V run() throws HttpException, IOException;
      method done (line 395) | protected abstract void done() throws IOException;
      method call (line 397) | @Override
    class CloseOperation (line 421) | private abstract static class CloseOperation<V> extends Operation<V> {
      method CloseOperation (line 433) | protected CloseOperation(Closeable closeable, boolean ignoreCloseExc...
      method done (line 438) | @Override
    class FlushOperation (line 462) | private abstract static class FlushOperation<V> extends Operation<V> {
      method FlushOperation (line 471) | protected FlushOperation(Flushable flushable) {
      method done (line 475) | @Override
    class RequestOutputStream (line 484) | public static class RequestOutputStream extends BufferedOutputStream {
      method RequestOutputStream (line 495) | public RequestOutputStream(OutputStream stream, String charset, int ...
      method write (line 508) | public RequestOutputStream write(String value) throws IOException {
    method encode (line 528) | public static String encode(CharSequence url)
    method append (line 566) | public static String append(CharSequence url, Map<?, ?> params) {
    method append (line 601) | public static String append(CharSequence url, Object... params) {
    method get (line 633) | public static HttpRequest get(CharSequence url) throws HttpException {
    method get (line 644) | public static HttpRequest get(URL url) throws HttpException {
    method get (line 660) | public static HttpRequest get(CharSequence baseUrl, Map<?, ?> params, ...
    method get (line 678) | public static HttpRequest get(CharSequence baseUrl, boolean encode, Ob...
    method post (line 690) | public static HttpRequest post(CharSequence url) throws HttpException {
    method post (line 701) | public static HttpRequest post(URL url) throws HttpException {
    method post (line 717) | public static HttpRequest post(CharSequence baseUrl, Map<?, ?> params,...
    method post (line 735) | public static HttpRequest post(CharSequence baseUrl, boolean encode, O...
    method put (line 747) | public static HttpRequest put(CharSequence url) throws HttpException {
    method put (line 758) | public static HttpRequest put(URL url) throws HttpException {
    method put (line 774) | public static HttpRequest put(CharSequence baseUrl, Map<?, ?> params, ...
    method put (line 792) | public static HttpRequest put(CharSequence baseUrl, boolean encode, Ob...
    method delete (line 804) | public static HttpRequest delete(CharSequence url) throws HttpException {
    method delete (line 815) | public static HttpRequest delete(URL url) throws HttpException {
    method delete (line 831) | public static HttpRequest delete(CharSequence baseUrl, Map<?, ?> param...
    method delete (line 849) | public static HttpRequest delete(CharSequence baseUrl, boolean encode,...
    method head (line 861) | public static HttpRequest head(CharSequence url) throws HttpException {
    method head (line 872) | public static HttpRequest head(URL url) throws HttpException {
    method head (line 886) | public static HttpRequest head(CharSequence baseUrl, Map<?, ?> params,...
    method head (line 902) | public static HttpRequest head(CharSequence baseUrl,
    method options (line 915) | public static HttpRequest options(CharSequence url)
    method options (line 927) | public static HttpRequest options(URL url) throws HttpException {
    method trace (line 938) | public static HttpRequest trace(CharSequence url)
    method trace (line 950) | public static HttpRequest trace(URL url) throws HttpException {
    method keepAlive (line 961) | public static void keepAlive(boolean keepAlive) {
    method maxConnections (line 972) | public static void maxConnections(int maxConnections) {
    method proxyHost (line 984) | public static void proxyHost(String host) {
    method proxyPort (line 997) | public static void proxyPort(int port) {
    method nonProxyHosts (line 1012) | public static void nonProxyHosts(String... hosts) {
    method setProperty (line 1035) | private static String setProperty(String name, String value) {
    method HttpRequest (line 1080) | public HttpRequest(CharSequence url, String method) throws HttpExcepti...
    method HttpRequest (line 1096) | public HttpRequest(URL url, String method)
    method createProxy (line 1102) | private Proxy createProxy() {
    method createConnection (line 1106) | private HttpURLConnection createConnection() {
    method toString (line 1121) | @Override
    method getConnection (line 1131) | public HttpURLConnection getConnection() {
    method ignoreCloseExceptions (line 1147) | public HttpRequest ignoreCloseExceptions(boolean ignore) {
    method ignoreCloseExceptions (line 1158) | public boolean ignoreCloseExceptions() {
    method code (line 1168) | public int code() throws HttpException {
    method code (line 1185) | public HttpRequest code(AtomicInteger output) throws HttpException {
    method ok (line 1196) | public boolean ok() throws HttpException {
    method created (line 1206) | public boolean created() throws HttpException {
    method noContent (line 1216) | public boolean noContent() throws HttpException {
    method serverError (line 1226) | public boolean serverError() throws HttpException {
    method badRequest (line 1236) | public boolean badRequest() throws HttpException {
    method notFound (line 1246) | public boolean notFound() throws HttpException {
    method notModified (line 1256) | public boolean notModified() throws HttpException {
    method status (line 1265) | public HttpStatus status() {
    method message (line 1274) | public String message() throws HttpException {
    method disconnect (line 1288) | public HttpRequest disconnect() {
    method chunk (line 1299) | public HttpRequest chunk(int size) {
    method bufferSize (line 1315) | public HttpRequest bufferSize(int size) {
    method bufferSize (line 1330) | public int bufferSize() {
    method decompress (line 1352) | public HttpRequest decompress(boolean decompress) {
    method byteStream (line 1362) | protected ByteArrayOutputStream byteStream() {
    method body (line 1381) | public String body(String charset) throws HttpException {
    method body (line 1398) | public String body() throws HttpException {
    method body (line 1410) | public HttpRequest body(AtomicReference<String> output)
    method body (line 1425) | public HttpRequest body(AtomicReference<String> output, String charset)
    method isBodyEmpty (line 1437) | public boolean isBodyEmpty() throws HttpException {
    method bytes (line 1446) | public byte[] bytes() {
    method buffer (line 1459) | public BufferedInputStream buffer() throws HttpException {
    method stream (line 1469) | public InputStream stream() throws HttpException {
    method reader (line 1513) | public InputStreamReader reader(String charset)
    method reader (line 1529) | public InputStreamReader reader() throws HttpException {
    method bufferedReader (line 1543) | public BufferedReader bufferedReader(String charset)
    method bufferedReader (line 1556) | public BufferedReader bufferedReader() throws HttpException {
    method receive (line 1567) | public HttpRequest receive(File file) throws HttpException {
    method receive (line 1589) | public HttpRequest receive(OutputStream output) {
    method receive (line 1600) | public HttpRequest receive(PrintStream output) throws HttpException {
    method receive (line 1611) | public HttpRequest receive(Appendable appendable) throws HttpException {
    method receive (line 1636) | public HttpRequest receive(Writer writer) throws HttpException {
    method readTimeout (line 1653) | public HttpRequest readTimeout(int timeout) {
    method connectTimeout (line 1664) | public HttpRequest connectTimeout(int timeout) {
    method header (line 1676) | public HttpRequest header(String name, String value) {
    method header (line 1688) | public HttpRequest header(String name, Number value) {
    method headers (line 1699) | public HttpRequest headers(Map<String, String> headers) {
    method header (line 1714) | public HttpRequest header(Entry<String, String> header) {
    method header (line 1725) | public String header(String name) throws HttpException {
    method headers (line 1736) | public Map<String, List<String>> headers() throws HttpException {
    method dateHeader (line 1749) | public long dateHeader(String name) throws HttpException {
    method dateHeader (line 1762) | public long dateHeader(String name, long defaultValue) throws HttpExce...
    method intHeader (line 1775) | public int intHeader(String name) throws HttpException {
    method intHeader (line 1789) | public int intHeader(String name, int defaultValue)
    method headers (line 1801) | public String[] headers(String name) {
    method parameter (line 1822) | public String parameter(String headerName, String paramName) {
    method parameters (line 1835) | public Map<String, String> parameters(String headerName) {
    method getParams (line 1845) | protected Map<String, String> getParams(String header) {
    method getParam (line 1897) | protected String getParam(String value, String paramName) {
    method charset (line 1944) | public String charset() {
    method userAgent (line 1954) | public HttpRequest userAgent(String userAgent) {
    method referer (line 1964) | public HttpRequest referer(String referer) {
    method useCaches (line 1974) | public HttpRequest useCaches(boolean useCaches) {
    method acceptEncoding (line 1985) | public HttpRequest acceptEncoding(String acceptEncoding) {
    method acceptGzipEncoding (line 1995) | public HttpRequest acceptGzipEncoding() {
    method acceptCharset (line 2005) | public HttpRequest acceptCharset(String acceptCharset) {
    method contentEncoding (line 2014) | public String contentEncoding() {
    method server (line 2023) | public String server() {
    method date (line 2032) | public long date() {
    method cacheControl (line 2041) | public String cacheControl() {
    method eTag (line 2050) | public String eTag() {
    method expires (line 2059) | public long expires() {
    method lastModified (line 2068) | public long lastModified() {
    method location (line 2077) | public String location() {
    method authorization (line 2087) | public HttpRequest authorization(String authorization) {
    method proxyAuthorization (line 2097) | public HttpRequest proxyAuthorization(String proxyAuthorization) {
    method basic (line 2109) | public HttpRequest basic(String name, String password) {
    method proxyBasic (line 2122) | public HttpRequest proxyBasic(String name, String password) {
    method ifModifiedSince (line 2133) | public HttpRequest ifModifiedSince(long ifModifiedSince) {
    method ifNoneMatch (line 2144) | public HttpRequest ifNoneMatch(String ifNoneMatch) {
    method contentType (line 2154) | public HttpRequest contentType(String contentType) {
    method contentType (line 2165) | public HttpRequest contentType(String contentType, String charset) {
    method contentType (line 2179) | public String contentType() {
    method contentLength (line 2188) | public int contentLength() {
    method contentLength (line 2198) | public HttpRequest contentLength(String contentLength) {
    method contentLength (line 2208) | public HttpRequest contentLength(int contentLength) {
    method accept (line 2219) | public HttpRequest accept(String accept) {
    method acceptJson (line 2228) | public HttpRequest acceptJson() {
    method copy (line 2240) | protected HttpRequest copy(InputStream input, OutputStream output) {
    method copy (line 2264) | protected HttpRequest copy(Reader input, Writer output) {
    method progress (line 2286) | public HttpRequest progress(UploadProgress callback) {
    method incrementTotalSize (line 2295) | private HttpRequest incrementTotalSize(long size) {
    method closeOutput (line 2310) | protected HttpRequest closeOutput() throws IOException {
    method closeOutputQuietly (line 2340) | protected HttpRequest closeOutputQuietly() throws HttpException {
    method openOutput (line 2354) | protected HttpRequest openOutput() throws IOException {
    method startPart (line 2370) | protected HttpRequest startPart() throws IOException {
    method writePartHeader (line 2389) | protected HttpRequest writePartHeader(String name, String filename) {
    method writePartHeader (line 2402) | protected HttpRequest writePartHeader(String name, String filename, St...
    method part (line 2423) | public HttpRequest part(String name, String part) {
    method part (line 2436) | public HttpRequest part(String name, String filename, String part)
    method part (line 2451) | public HttpRequest part(String name, String filename, String contentTy...
    method part (line 2471) | public HttpRequest part(String name, Number part)
    method part (line 2484) | public HttpRequest part(String name, String filename, Number part) {
    method part (line 2496) | public HttpRequest part(String name, File part)
    method part (line 2510) | public HttpRequest part(String name, String filename, File part)
    method part (line 2525) | public HttpRequest part(String name, String filename, String contentTy...
    method part (line 2545) | public HttpRequest part(String name, InputStream part)
    method part (line 2560) | public HttpRequest part(String name, String filename, String contentTy...
    method partHeader (line 2580) | public HttpRequest partHeader(String name, String value)
    method send (line 2592) | public HttpRequest send(File input) throws HttpException {
    method send (line 2610) | public HttpRequest send(byte[] input) throws HttpException {
    method send (line 2627) | public HttpRequest send(InputStream input) throws HttpException {
    method send (line 2646) | public HttpRequest send(Reader input) throws HttpException {
    method send (line 2673) | public HttpRequest send(CharSequence value) throws HttpException {
    method writer (line 2689) | public OutputStreamWriter writer() throws HttpException {
    method form (line 2708) | public HttpRequest form(Map<?, ?> values) throws HttpException {
    method form (line 2722) | public HttpRequest form(Entry<?, ?> entry) throws HttpException {
    method form (line 2737) | public HttpRequest form(Entry<?, ?> entry, String charset)
    method form (line 2753) | public HttpRequest form(Object name, Object value) throws HttpException {
    method form (line 2769) | public HttpRequest form(Object name, Object value, String charset)
    method form (line 2801) | public HttpRequest form(Map<?, ?> values, String charset)
    method trustAllCerts (line 2819) | public HttpRequest trustAllCerts() throws HttpException {
    method setSSLSocketFactory (line 2832) | public HttpRequest setSSLSocketFactory(SSLSocketFactory factory) {
    method trustAllHosts (line 2849) | public HttpRequest trustAllHosts() {
    method url (line 2862) | public URL url() {
    method method (line 2871) | public String method() {
    method useProxy (line 2883) | public HttpRequest useProxy(String proxyHost, int proxyPort) {
    method followRedirects (line 2901) | public HttpRequest followRedirects(boolean followRedirects) {

FILE: src/main/java/cn/ponfee/commons/http/HttpStatus.java
  type HttpStatus (line 20) | public enum HttpStatus {
    method HttpStatus (line 404) | HttpStatus(int code, String desc) {
    method code (line 412) | public int code() {
    method desc (line 419) | public String desc() {
    method series (line 427) | public Series series() {
    method is1xxInformational (line 437) | public boolean is1xxInformational() {
    method is2xxSuccessful (line 447) | public boolean is2xxSuccessful() {
    method is3xxRedirection (line 457) | public boolean is3xxRedirection() {
    method is4xxClientError (line 467) | public boolean is4xxClientError() {
    method is5xxServerError (line 477) | public boolean is5xxServerError() {
    method toString (line 484) | @Override
    method valueOf (line 495) | public static HttpStatus valueOf(int statusCode) {
    type Series (line 513) | public enum Series {
      method Series (line 522) | Series(int value) {
      method value (line 529) | public int value() {
      method valueOf (line 539) | public static Series valueOf(HttpStatus status) {
      method valueOf (line 549) | public static Series valueOf(int statusCode) {

FILE: src/main/java/cn/ponfee/commons/io/ByteOrderMarks.java
  type ByteOrderMarks (line 44) | public enum ByteOrderMarks {
    method ByteOrderMarks (line 63) | ByteOrderMarks(Charset charset, byte... bytes) {
    method of (line 69) | public static ByteOrderMarks of(String path) throws IOException {
    method of (line 73) | public static ByteOrderMarks of(File file) throws IOException {
    method of (line 77) | public static ByteOrderMarks of(InputStream input) throws IOException {
    method of (line 81) | public static ByteOrderMarks of(byte[] bytes) {
    method of (line 86) | public static ByteOrderMarks of(Charset charset, String path) throws I...
    method of (line 90) | public static ByteOrderMarks of(Charset charset, File file) throws IOE...
    method of (line 98) | public static ByteOrderMarks of(Charset charset, InputStream input) th...
    method of (line 106) | public static ByteOrderMarks of(Charset charset, byte[] bytes) {
    method has (line 116) | public static boolean has(String path) throws IOException {
    method has (line 120) | public static boolean has(File file) throws IOException {
    method has (line 124) | public static boolean has(InputStream input) throws IOException {
    method has (line 128) | public static boolean has(byte[] bytes) {
    method has (line 133) | public static boolean has(Charset charset, String path) throws IOExcep...
    method has (line 137) | public static boolean has(Charset charset, File file) throws IOExcepti...
    method has (line 141) | public static boolean has(Charset charset, InputStream input) throws I...
    method has (line 145) | public static boolean has(Charset charset, byte[] bytes) {
    method add (line 150) | public static ByteOrderMarks add(String path) throws IOException {
    method add (line 154) | public static ByteOrderMarks add(File file) throws IOException {
    method add (line 158) | public static ByteOrderMarks add(Charset charset, String path) throws ...
    method add (line 162) | public static ByteOrderMarks add(Charset charset, File file) throws IO...
    method remove (line 200) | public static ByteOrderMarks remove(String path) throws IOException {
    method remove (line 204) | public static ByteOrderMarks remove(File file) throws IOException {
    method remove (line 208) | public static ByteOrderMarks remove(Charset charset, String path) thro...
    method remove (line 212) | public static ByteOrderMarks remove(Charset charset, File file) throws...
    method get (line 250) | public static byte[] get(Charset charset) {
    method charset (line 256) | public Charset charset() {
    method bytes (line 260) | public byte[] bytes() {
    method length (line 264) | public int length() {
    method match (line 269) | private boolean match(byte[] array) {
    method match (line 273) | private boolean match(byte[] array, int count) {

FILE: src/main/java/cn/ponfee/commons/io/CharsetDetector.java
  class CharsetDetector (line 23) | public class CharsetDetector {
    method detect (line 29) | public static Charset detect(String path) {
    method detect (line 33) | public static Charset detect(String path, int length) {
    method detect (line 37) | public static Charset detect(File file) {
    method detect (line 41) | public static Charset detect(File file, int length) {
    method detect (line 49) | public static Charset detect(URL url) {
    method detect (line 53) | public static Charset detect(URL url, int length) {
    method detect (line 62) | public static Charset detect(byte[] bytes) {
    method detect (line 66) | public static Charset detect(byte[] bytes, int length) {
    method detect (line 70) | public static Charset detect(byte[] bytes, int offset, int length) {
    method detect (line 80) | public static Charset detect(InputStream input) throws IOException {
    method detect (line 84) | public static Charset detect(InputStream input, int length) throws IOE...

FILE: src/main/java/cn/ponfee/commons/io/Closeables.java
  class Closeables (line 22) | public final class Closeables {
    method ignore (line 31) | public static void ignore(@Nullable AutoCloseable closeable) {
    method console (line 46) | public static void console(@Nullable AutoCloseable closeable) {
    method log (line 56) | public static void log(@Nullable AutoCloseable closeable) {
    method log (line 66) | public static void log(@Nullable AutoCloseable closeable, String errMs...

FILE: src/main/java/cn/ponfee/commons/io/ExtendedGZIPOutputStream.java
  class ExtendedGZIPOutputStream (line 20) | public class ExtendedGZIPOutputStream extends GZIPOutputStream {
    method ExtendedGZIPOutputStream (line 22) | public ExtendedGZIPOutputStream(OutputStream out) throws IOException {
    method ExtendedGZIPOutputStream (line 26) | public ExtendedGZIPOutputStream(OutputStream out, int level) throws IO...

FILE: src/main/java/cn/ponfee/commons/io/FileTransformer.java
  class FileTransformer (line 22) | public class FileTransformer {
    method FileTransformer (line 43) | public FileTransformer(String source, String target) {
    method FileTransformer (line 47) | public FileTransformer(String source, String target, String encoding) {
    method setIncludeFileExtensions (line 58) | public void setIncludeFileExtensions(String... includeFileExtensions) {
    method setReplaceEach (line 62) | public void setReplaceEach(String[] searchList, String[] replacementLi...
    method transform (line 70) | public void transform() {
    method getTransformLog (line 74) | public String getTransformLog() {
    method transform (line 78) | private void transform(File file) {
    method transform (line 119) | public static void transform(File source, File target) {
    method transform (line 136) | public static void transform(File source, File target,
    method transform (line 156) | public static void transform(File source, File target,
    method transform (line 169) | public static void transform(File source, File target,
    method writeln (line 182) | private static void writeln(WrappedBufferedReader reader,
    method regexExtensions (line 200) | private static String regexExtensions(String... fileExtensions) {

FILE: src/main/java/cn/ponfee/commons/io/Files.java
  class Files (line 28) | public final class Files {
    method mkdir (line 83) | public static File mkdir(String filePath) {
    method mkdir (line 95) | public static void mkdir(File file) {
    method touch (line 114) | public static void touch(File file) {
    method toString (line 138) | public static String toString(File file) throws IOException {
    method toString (line 143) | public static String toString(File file, Charset charset) throws IOExc...
    method toByteArray (line 169) | public static byte[] toByteArray(File file) {
    method readByteArray (line 184) | public static byte[] readByteArray(String filePath, int count) throws ...
    method readByteArray (line 188) | public static byte[] readByteArray(File file, int count) throws IOExce...
    method readByteArray (line 194) | public static byte[] readByteArray(InputStream input, int count) throw...
    method listFiles (line 204) | public static TreeNode<Integer, File> listFiles(String filePath) {
    method listFiles (line 214) | public static TreeNode<Integer, File> listFiles(File file) {
    method tree (line 233) | public static String tree(String filePath) throws IOException {
    method tree (line 244) | public static String tree(File file) throws IOException {

FILE: src/main/java/cn/ponfee/commons/io/GzipProcessor.java
  class GzipProcessor (line 21) | public final class GzipProcessor {
    method compress (line 30) | public static byte[] compress(byte[] data) {
    method compress (line 41) | public static void compress(byte[] data, OutputStream output) {
    method compress (line 56) | public static long compress(InputStream input, OutputStream output) {
    method decompress (line 72) | public static byte[] decompress(byte[] data) {
    method decompress (line 78) | public static void decompress(byte[] data, OutputStream output) {
    method decompress (line 87) | public static void decompress(InputStream input, OutputStream output) {

FILE: src/main/java/cn/ponfee/commons/io/HumanReadables.java
  type HumanReadables (line 30) | public enum HumanReadables {
    method HumanReadables (line 45) | HumanReadables(int base, String... units) {
    method human (line 62) | public strictfp String human(long size) {
    method parse (line 85) | public long parse(String size) {
    method parse (line 96) | public strictfp long parse(String size, boolean strict) {
    method base (line 180) | public int base() {
    method units (line 184) | public String[] units() {
    method sizes (line 188) | public long[] sizes() {
    method find (line 193) | private int find(long bytes) {
    method isBlank (line 203) | private boolean isBlank(char c) {

FILE: src/main/java/cn/ponfee/commons/io/PrereadInputStream.java
  class PrereadInputStream (line 19) | public class PrereadInputStream extends InputStream {
    method PrereadInputStream (line 26) | public PrereadInputStream(InputStream input, int maxCount) throws IOEx...
    method read (line 36) | @Override
    method read (line 45) | @Override
    method read (line 65) | @Override
    method heads (line 70) | public byte[] heads() {
    method skip (line 74) | @Override
    method available (line 88) | @Override
    method close (line 93) | @Override
    method mark (line 99) | @Override @Deprecated
    method reset (line 104) | @Override
    method markSupported (line 109) | @Override

FILE: src/main/java/cn/ponfee/commons/io/StringPrintWriter.java
  class StringPrintWriter (line 19) | public class StringPrintWriter extends PrintWriter {
    method StringPrintWriter (line 21) | public StringPrintWriter() {
    method StringPrintWriter (line 25) | public StringPrintWriter(int initialSize) {
    method getString (line 29) | public String getString() {
    method toString (line 34) | @Override

FILE: src/main/java/cn/ponfee/commons/io/WrappedBufferedReader.java
  class WrappedBufferedReader (line 20) | public class WrappedBufferedReader extends Reader {
    method WrappedBufferedReader (line 24) | public WrappedBufferedReader(File file) throws FileNotFoundException {
    method WrappedBufferedReader (line 28) | public WrappedBufferedReader(File file, String charset) throws FileNot...
    method WrappedBufferedReader (line 32) | public WrappedBufferedReader(File file, Charset charset) throws FileNo...
    method WrappedBufferedReader (line 36) | public WrappedBufferedReader(InputStream input, Charset charset) {
    method close (line 42) | @Override
    method read (line 48) | @Override
    method read (line 53) | @Override
    method read (line 58) | @Override
    method read (line 63) | @Override
    method skip (line 68) | @Override
    method ready (line 73) | @Override
    method markSupported (line 78) | @Override
    method mark (line 83) | @Override
    method reset (line 88) | @Override
    method readLine (line 93) | public String readLine() throws IOException {

FILE: src/main/java/cn/ponfee/commons/io/WrappedBufferedWriter.java
  class WrappedBufferedWriter (line 19) | public class WrappedBufferedWriter extends Writer {
    method WrappedBufferedWriter (line 24) | public WrappedBufferedWriter(File file) throws FileNotFoundException {
    method WrappedBufferedWriter (line 28) | public WrappedBufferedWriter(File file, String charset) throws FileNot...
    method WrappedBufferedWriter (line 32) | public WrappedBufferedWriter(File file, Charset charset) throws FileNo...
    method WrappedBufferedWriter (line 36) | public WrappedBufferedWriter(OutputStream output, Charset charset) {
    method write (line 43) | @Override
    method write (line 48) | @Override
    method write (line 53) | @Override
    method write (line 58) | @Override
    method append (line 63) | @Override
    method append (line 68) | @Override
    method append (line 73) | @Override
    method flush (line 78) | @Override
    method close (line 83) | @Override
    method write (line 90) | @Override
    method newLine (line 95) | public void newLine() throws IOException {
    method write (line 99) | public void write(byte[] bytes) throws IOException {
    method writeln (line 103) | public void writeln() throws IOException {
    method writeln (line 107) | public void writeln(String str) throws IOException {

FILE: src/main/java/cn/ponfee/commons/io/charset/BytesDetector.java
  class BytesDetector (line 26) | public class BytesDetector {
    method detect (line 30) | public static Charset detect(InputStream input, int length) throws IOE...
    method detect (line 35) | public static String detect(byte[] rawtext) {
    method gb2312_probability (line 79) | private static int gb2312_probability(byte[] rawtext) {
    method gbk_probability (line 114) | private static int gbk_probability(byte[] rawtext) {
    method gb18030_probability (line 168) | private static int gb18030_probability(byte[] rawtext) {
    method hz_probability (line 233) | private static int hz_probability(byte[] rawtext) {
    method between (line 291) | private static boolean between(byte b) {
    method big5_probability (line 299) | private static int big5_probability(byte[] rawtext) {
    method euc_tw_probability (line 337) | private static int euc_tw_probability(byte[] rawtext) {
    method iso_2022_cn_probability (line 378) | private static int iso_2022_cn_probability(byte[] rawtext) {
    method utf8_probability (line 450) | private static int utf8_probability(byte[] rawtext) {
    method utf16_probability (line 492) | private static int utf16_probability(byte[] rawtext) {
    method ascii_probability (line 521) | private static int ascii_probability(byte[] rawtext) {
    method euc_kr_probability (line 540) | private static int euc_kr_probability(byte[] rawtext) {
    method cp949_probability (line 574) | private static int cp949_probability(byte[] rawtext) {
    method iso_2022_kr_probability (line 607) | private static int iso_2022_kr_probability(byte[] rawtext) {
    method euc_jp_probability (line 621) | private static int euc_jp_probability(byte[] rawtext) {
    method iso_2022_jp_probability (line 651) | private static int iso_2022_jp_probability(byte[] rawtext) {
    method sjis_probability (line 664) | private static int sjis_probability(byte[] rawtext) {
    class Encoding (line 1604) | private static class Encoding {

FILE: src/main/java/cn/ponfee/commons/io/charset/TikaDetector.java
  class TikaDetector (line 38) | public class TikaDetector {
    method detect (line 40) | public static Charset detect(InputStream input, int length) throws IOE...

FILE: src/main/java/cn/ponfee/commons/jce/CryptoProvider.java
  class CryptoProvider (line 36) | public abstract class CryptoProvider {
    method encrypt (line 44) | public abstract byte[] encrypt(@Nonnull byte[] original);
    method decrypt (line 52) | public abstract byte[] decrypt(@Nonnull byte[] encrypted);
    method sign (line 60) | public byte[] sign(byte[] data) {
    method verify (line 71) | public boolean verify(byte[] data, byte[] signed) {
    method encrypt (line 81) | public final String encrypt(String plaintext) {
    method encrypt (line 92) | public final String encrypt(String plaintext, Charset charset) {
    method decrypt (line 108) | public final String decrypt(String ciphertext) {
    method decrypt (line 119) | public final String decrypt(String ciphertext, Charset charset) {
    method sign (line 136) | public final String sign(String data) {
    method sign (line 147) | public final String sign(String data, String charset) {
    method verify (line 163) | public final boolean verify(String data, String signed) {
    method verify (line 175) | public final boolean verify(String data, String charset, String signed) {
    method symmetricKeyProvider (line 188) | public static CryptoProvider symmetricKeyProvider(SymmetricCryptor sym...
    method rsaPublicKeyProvider (line 212) | public static CryptoProvider rsaPublicKeyProvider(String pkcs8PublicKe...
    method rsaPrivateKeyProvider (line 242) | public static CryptoProvider rsaPrivateKeyProvider(String pkcs8Private...
    method rsaProvider (line 254) | public static CryptoProvider rsaProvider(RSAPrivateKey priKey, RSAPubl...
    method sm2PublicKeyProvider (line 282) | public static CryptoProvider sm2PublicKeyProvider(byte[] publicKey) {
    method sm2PublicKeyProvider (line 286) | public static CryptoProvider sm2PublicKeyProvider(ECParameters ecParam...
    method sm2PrivateKeyProvider (line 308) | public static CryptoProvider sm2PrivateKeyProvider(byte[] publicKey,
    method sm2PrivateKeyProvider (line 313) | public static CryptoProvider sm2PrivateKeyProvider(ECParameters ecPara...
    method ecdsaPublicKeyProvider (line 343) | public static CryptoProvider ecdsaPublicKeyProvider(byte[] publicKey) {
    method ecdsaPrivateKeyProvider (line 364) | public static CryptoProvider ecdsaPrivateKeyProvider(byte[] publicKey,...

FILE: src/main/java/cn/ponfee/commons/jce/DigestAlgorithms.java
  type DigestAlgorithms (line 21) | public enum DigestAlgorithms {
    method DigestAlgorithms (line 81) | DigestAlgorithms(int bitLen) {
    method DigestAlgorithms (line 86) | DigestAlgorithms(String algorithm, int bitLen) {
    method algorithm (line 91) | public String algorithm() {
    method byteSize (line 95) | public int byteSize() {

FILE: src/main/java/cn/ponfee/commons/jce/ECParameters.java
  class ECParameters (line 44) | @SuppressWarnings("unchecked")
    method ECParameters (line 176) | public ECParameters(String name, String p, String a,
    method toString (line 211) | @Override
    method fromString (line 224) | public static ECParameters fromString(String parameter) {
    method encodeHex (line 232) | private static String encodeHex(byte[] bytes) {
    method hashCode (line 237) | @Override
    method equals (line 244) | @Override
    method hexToBigInteger (line 267) | private static BigInteger hexToBigInteger(String hex) {

FILE: src/main/java/cn/ponfee/commons/jce/HmacAlgorithms.java
  type HmacAlgorithms (line 17) | public enum HmacAlgorithms {
    method HmacAlgorithms (line 60) | HmacAlgorithms(int bitLen) {
    method HmacAlgorithms (line 65) | HmacAlgorithms(String algorithm, int bitLen) {
    method algorithm (line 70) | public String algorithm() {
    method byteSize (line 74) | public int byteSize() {

FILE: src/main/java/cn/ponfee/commons/jce/Providers.java
  type Providers (line 27) | @SuppressWarnings("restriction")
    method get (line 30) | static Provider get(String name) {
    method get (line 34) | static Provider get(Class<? extends Provider> type) {
    method set (line 53) | static void set(Provider provider) {
    method clear (line 57) | static void clear() {
    method setGlobal (line 61) | static void setGlobal(Provider provider) {
    method clearGlobal (line 65) | static void clearGlobal() {
    method getKeyAgreement (line 70) | static KeyAgreement getKeyAgreement(String algorithm) {
    method getKeyAgreement (line 74) | static KeyAgreement getKeyAgreement(String algorithm, Provider provide...
    method getKeyGenerator (line 85) | static KeyGenerator getKeyGenerator(String algorithm) {
    method getKeyGenerator (line 89) | static KeyGenerator getKeyGenerator(String algorithm, Provider provide...
    method getCipher (line 100) | static Cipher getCipher(String algorithm) {
    method getCipher (line 104) | static Cipher getCipher(String algorithm, Provider provider) {
    method getKeyPairGenerator (line 115) | static KeyPairGenerator getKeyPairGenerator(String algorithm) {
    method getKeyPairGenerator (line 119) | static KeyPairGenerator getKeyPairGenerator(String algorithm, Provider...
    method getKeyFactory (line 130) | static KeyFactory getKeyFactory(String algorithm) {
    method getKeyFactory (line 134) | static KeyFactory getKeyFactory(String algorithm, Provider provider) {
    method getSignature (line 145) | static Signature getSignature(String algorithm) {
    method getSignature (line 149) | static Signature getSignature(String algorithm, Provider provider) {
    method getKeyStore (line 160) | static KeyStore getKeyStore(String algorithm) {
    method getKeyStore (line 164) | static KeyStore getKeyStore(String algorithm, Provider provider) {
    method getTrustManagerFactory (line 175) | static TrustManagerFactory getTrustManagerFactory(String algorithm) {
    method getTrustManagerFactory (line 179) | static TrustManagerFactory getTrustManagerFactory(String algorithm, Pr...
    method getKeyManagerFactory (line 190) | static KeyManagerFactory getKeyManagerFactory(String algorithm) {
    method getKeyManagerFactory (line 194) | static KeyManagerFactory getKeyManagerFactory(String algorithm, Provid...
    method getSSLContext (line 205) | static SSLContext getSSLContext(String algorithm) {
    method getSSLContext (line 209) | static SSLContext getSSLContext(String algorithm, Provider provider) {
    method getCertificateFactory (line 220) | static CertificateFactory getCertificateFactory(String algorithm) {
    method getCertificateFactory (line 224) | static CertificateFactory getCertificateFactory(String algorithm, Prov...
    method getSecretKeyFactory (line 235) | static SecretKeyFactory getSecretKeyFactory(String algorithm) {
    method getSecretKeyFactory (line 239) | static SecretKeyFactory getSecretKeyFactory(String algorithm, Provider...
    class ProvidersHolder (line 271) | final class ProvidersHolder {
      method getProvider (line 288) | private static Provider getProvider(Provider provider) {
    class NullProvider (line 303) | final class NullProvider extends Provider {
      method NullProvider (line 307) | private NullProvider() {

FILE: src/main/java/cn/ponfee/commons/jce/RSACipherPaddings.java
  type RSACipherPaddings (line 19) | public enum RSACipherPaddings {
    method RSACipherPaddings (line 56) | RSACipherPaddings(String transform) {
    method transform (line 60) | public String transform() {

FILE: src/main/java/cn/ponfee/commons/jce/RSASignAlgorithms.java
  type RSASignAlgorithms (line 16) | public enum RSASignAlgorithms {

FILE: src/main/java/cn/ponfee/commons/jce/cert/CertPKCS1Verifier.java
  class CertPKCS1Verifier (line 24) | public class CertPKCS1Verifier extends CertSignedVerifier {
    method CertPKCS1Verifier (line 34) | public CertPKCS1Verifier(X509Certificate rootCert, X509CRL crl,
    method verifySigned (line 41) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/cert/CertPKCS7Verifier.java
  class CertPKCS7Verifier (line 29) | @SuppressWarnings("restriction")
    method CertPKCS7Verifier (line 41) | public CertPKCS7Verifier(X509Certificate rootCert, X509CRL crl,
    method CertPKCS7Verifier (line 52) | public CertPKCS7Verifier(X509Certificate rootCert, X509CRL crl, byte[]...
    method CertPKCS7Verifier (line 62) | public CertPKCS7Verifier(X509Certificate rootCert, X509CRL crl, PKCS7 ...
    method CertPKCS7Verifier (line 73) | public CertPKCS7Verifier(X509Certificate rootCert, X509CRL crl,
    method verifySigned (line 98) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/cert/CertSignedVerifier.java
  class CertSignedVerifier (line 25) | public abstract class CertSignedVerifier {
    method CertSignedVerifier (line 35) | protected CertSignedVerifier(X509Certificate rootCert, X509CRL crl, by...
    method verify (line 44) | public final void verify() {
    method verifySigned (line 70) | public abstract void verifySigned();
    method verifyCertDate (line 76) | public static void verifyCertDate(X509Certificate subject) {
    method verifyIssuingSign (line 93) | public static void verifyIssuingSign(X509Certificate subject, X509Cert...
    method verifyCrlRevoke (line 111) | public static void verifyCrlRevoke(X509Certificate subject, X509CRL cr...
    method getSubjects (line 118) | public X509Certificate[] getSubjects() {
    method getInfo (line 122) | public byte[] getInfo() {
    method getSignedInfo (line 126) | public List<byte[]> getSignedInfo() {
    method setVerifySigned (line 130) | public void setVerifySigned(boolean verifySigned) {

FILE: src/main/java/cn/ponfee/commons/jce/cert/ObjectIdentifiers.java
  class ObjectIdentifiers (line 17) | public final class ObjectIdentifiers {

FILE: src/main/java/cn/ponfee/commons/jce/cert/RepairX500Principal.java
  class RepairX500Principal (line 22) | public class RepairX500Principal implements Principal {
    method RepairX500Principal (line 37) | public RepairX500Principal(X500Principal principal) {
    method getName (line 41) | @Override
    method preLen (line 97) | private int preLen(int tag) {

FILE: src/main/java/cn/ponfee/commons/jce/cert/X509CertGenerator.java
  class X509CertGenerator (line 37) | @SuppressWarnings({ "restriction" })
    method createRootCert (line 41) | public static X509Certificate createRootCert(String issuer, RSASignAlg...
    method createRootCert (line 57) | public static X509Certificate createRootCert(BigInteger sn, String iss...
    method createSubjectCert (line 65) | public static X509Certificate createSubjectCert(X509Certificate caCert...
    method createSubjectCert (line 84) | public static X509Certificate createSubjectCert(X509Certificate caCert...
    method createSubjectCert (line 92) | public static X509Certificate createSubjectCert(X509Certificate caCert...
    method createSubjectCert (line 107) | public static X509Certificate createSubjectCert(X509Certificate caCert...
    method createPkcs10 (line 122) | public static PKCS10 createPkcs10(String subject, PrivateKey privateKey,
    method createExtensions (line 142) | public static CertificateExtensions createExtensions(boolean isCA) {
    method createCertInfo (line 191) | private static X509CertInfo createCertInfo(@Nullable BigInteger sn, PK...
    method selfSign (line 235) | private static X509Certificate selfSign(PrivateKey caKey, X509CertInfo...
    method caSign (line 254) | private static X509Certificate caSign(X509Certificate caCert, PrivateK...

FILE: src/main/java/cn/ponfee/commons/jce/cert/X509CertInfo.java
  type X509CertInfo (line 33) | public enum X509CertInfo {
    method X509CertInfo (line 53) | X509CertInfo(String desc) {
    method X509CertInfo (line 57) | X509CertInfo(String attr, String desc) {
    method attr (line 62) | public String attr() {
    method desc (line 66) | public String desc() {

FILE: src/main/java/cn/ponfee/commons/jce/cert/X509CertUtils.java
  class X509CertUtils (line 47) | @SuppressWarnings({ "deprecation" })
    method loadPemCert (line 60) | public static X509Certificate loadPemCert(String pem) {
    method loadX509Cert (line 69) | public static X509Certificate loadX509Cert(byte[] bytes) {
    method loadX509Cert (line 111) | public static X509Certificate loadX509Cert(InputStream input) throws I...
    method loadX509Cert (line 121) | public static X509Certificate loadX509Cert(File certFile) throws IOExc...
    method exportToPem (line 137) | public static String exportToPem(Object obj) {
    method loadX509Crl (line 155) | public static X509CRL loadX509Crl(byte[] bytes) {
    method loadX509Crl (line 181) | public static X509CRL loadX509Crl(InputStream is) throws IOException {
    method loadX509Crl (line 191) | public static X509CRL loadX509Crl(File crlFile) throws IOException {
    method getX509CrlEntry (line 202) | public static X509CRLEntry getX509CrlEntry(File crlFile, File certFile...
    method getCertExtVal (line 214) | public static String getCertExtVal(X509Certificate cert, String oid) {
    method getCertInfo (line 233) | public static String getCertInfo(X509Certificate cert, X509CertInfo in...
    method parseCertDN (line 288) | private static String parseCertDN(String certDN, X509CertInfo ci) {
    method parseP7 (line 304) | @SuppressWarnings("unchecked")
    method isBase64 (line 331) | private static boolean isBase64(InputStream inputstream) throws IOExce...
    method getTotalBytes (line 364) | private static byte[] getTotalBytes(InputStream input)
    method base64ToBinary (line 375) | private static byte[] base64ToBinary(InputStream input) throws IOExcep...
    method readLine (line 407) | private static String readLine(BufferedReader bufferedreader)

FILE: src/main/java/cn/ponfee/commons/jce/digest/DigestUtils.java
  class DigestUtils (line 28) | public final class DigestUtils {
    method md5 (line 32) | public static byte[] md5(InputStream input) {
    method md5 (line 36) | public static byte[] md5(byte[] data) {
    method md5Hex (line 40) | public static String md5Hex(InputStream input) {
    method md5Hex (line 44) | public static String md5Hex(byte[] data) {
    method md5Hex (line 48) | public static String md5Hex(String data) {
    method md5Hex (line 52) | public static String md5Hex(String data, String charset) {
    method sha1 (line 56) | public static byte[] sha1(InputStream input) {
    method sha1 (line 60) | public static byte[] sha1(String data) {
    method sha1 (line 64) | public static byte[] sha1(byte[] data) {
    method sha1Hex (line 68) | public static String sha1Hex(InputStream input) {
    method sha1Hex (line 72) | public static String sha1Hex(byte[] data) {
    method sha1Hex (line 76) | public static String sha1Hex(String data) {
    method sha1Hex (line 80) | public static String sha1Hex(String data, String charset) {
    method sha224 (line 84) | public static byte[] sha224(byte[] data) {
    method sha224Hex (line 88) | public static String sha224Hex(byte[] data) {
    method sha256 (line 92) | public static byte[] sha256(byte[] data) {
    method sha256Hex (line 96) | public static String sha256Hex(byte[] data) {
    method sha256Hex (line 100) | public static String sha256Hex(String data, String charset) {
    method sha384 (line 104) | public static byte[] sha384(byte[] data) {
    method sha384Hex (line 108) | public static String sha384Hex(byte[] data) {
    method sha512 (line 112) | public static byte[] sha512(byte[] input, byte[]... data) {
    method sha512Hex (line 116) | public static String sha512Hex(byte[] data) {
    method ripeMD128 (line 121) | public static byte[] ripeMD128(byte[] data) {
    method ripeMD128Hex (line 125) | public static String ripeMD128Hex(byte[] data) {
    method ripeMD160 (line 129) | public static byte[] ripeMD160(byte[] data) {
    method ripeMD160Hex (line 133) | public static String ripeMD160Hex(byte[] data) {
    method ripeMD256 (line 137) | public static byte[] ripeMD256(byte[] data) {
    method ripeMD256Hex (line 141) | public static String ripeMD256Hex(byte[] data) {
    method ripeMD320 (line 145) | public static byte[] ripeMD320(byte[] data) {
    method ripeMD320Hex (line 149) | public static String ripeMD320Hex(byte[] data) {
    method getMessageDigest (line 154) | public static MessageDigest getMessageDigest(DigestAlgorithms alg, Pro...
    method digest (line 164) | public static byte[] digest(DigestAlgorithms alg, byte[] input) {
    method digest (line 168) | public static byte[] digest(DigestAlgorithms alg, Provider provider, b...
    method digest (line 174) | public static byte[] digest(DigestAlgorithms alg, byte[] input, byte[]...
    method digest (line 185) | public static byte[] digest(DigestAlgorithms alg, Provider provider,
    method digest (line 195) | public static byte[] digest(DigestAlgorithms alg, InputStream input) {
    method digest (line 206) | public static byte[] digest(DigestAlgorithms alg, Provider provider,

FILE: src/main/java/cn/ponfee/commons/jce/digest/HmacUtils.java
  class HmacUtils (line 42) | public final class HmacUtils {
    method sha1 (line 46) | public static byte[] sha1(byte[] key, byte[] data) {
    method sha1 (line 50) | public static byte[] sha1(byte[] key, InputStream data) {
    method sha1Hex (line 54) | public static String sha1Hex(byte[] key, byte[] data) {
    method sha1Hex (line 58) | public static String sha1Hex(byte[] key, InputStream data) {
    method md5 (line 62) | public static byte[] md5(byte[] key, byte[] data) {
    method md5Hex (line 66) | public static String md5Hex(byte[] key, byte[] data) {
    method sha224 (line 70) | public static byte[] sha224(byte[] key, byte[] data) {
    method sha224Hex (line 74) | public static String sha224Hex(byte[] key, byte[] data) {
    method sha256 (line 78) | public static byte[] sha256(byte[] key, byte[] data) {
    method sha256Hex (line 82) | public static String sha256Hex(byte[] key, byte[] data) {
    method sha384 (line 86) | public static byte[] sha384(byte[] key, byte[] data) {
    method sha384Hex (line 90) | public static String sha384Hex(byte[] key, byte[] data) {
    method sha512 (line 94) | public static byte[] sha512(byte[] key, byte[] data) {
    method sha512Hex (line 98) | public static String sha512Hex(byte[] key, byte[] data) {
    method ripeMD128 (line 102) | public static byte[] ripeMD128(byte[] key, byte[] data) {
    method ripeMD128Hex (line 106) | public static String ripeMD128Hex(byte[] key, byte[] data) {
    method ripeMD160 (line 110) | public static byte[] ripeMD160(byte[] key, byte[] data) {
    method ripeMD160Hex (line 114) | public static String ripeMD160Hex(byte[] key, byte[] data) {
    method ripeMD256 (line 118) | public static byte[] ripeMD256(byte[] key, byte[] data) {
    method ripeMD256Hex (line 122) | public static String ripeMD256Hex(byte[] key, byte[] data) {
    method ripeMD320 (line 126) | public static byte[] ripeMD320(byte[] key, byte[] data) {
    method ripeMD320Hex (line 130) | public static String ripeMD320Hex(byte[] key, byte[] data) {
    method getInitializedMac (line 134) | public static Mac getInitializedMac(HmacAlgorithms algorithm, byte[] k...
    method getInitializedMac (line 138) | public static Mac getInitializedMac(HmacAlgorithms algorithm,
    method crypt (line 158) | public static byte[] crypt(byte[] key, byte[] data, HmacAlgorithms alg) {
    method crypt (line 162) | public static byte[] crypt(byte[] key, byte[] data,
    method crypt (line 167) | public static byte[] crypt(byte[] key, InputStream input,
    method crypt (line 172) | public static byte[] crypt(byte[] key, InputStream input,

FILE: src/main/java/cn/ponfee/commons/jce/implementation/Cryptor.java
  class Cryptor (line 15) | public abstract class Cryptor {
    method encrypt (line 17) | public final byte[] encrypt(byte[] original, Key ek) {
    method encrypt (line 28) | public abstract byte[] encrypt(byte[] original, int length, Key ek);
    method decrypt (line 36) | public abstract byte[] decrypt(byte[] cipher, Key dk);
    method generateKey (line 42) | public abstract Key generateKey();

FILE: src/main/java/cn/ponfee/commons/jce/implementation/Key.java
  type Key (line 19) | public interface Key {
    method readKey (line 21) | Key readKey(InputStream in) throws IOException;
    method writeKey (line 23) | void writeKey(OutputStream out) throws IOException;
    method getPublic (line 25) | Key getPublic();
    method isPublic (line 27) | boolean isPublic();

FILE: src/main/java/cn/ponfee/commons/jce/implementation/NoopCryptor.java
  class NoopCryptor (line 19) | public final class NoopCryptor extends Cryptor {
    method NoopCryptor (line 23) | private NoopCryptor() {}
    method encrypt (line 25) | @Override
    method decrypt (line 30) | @Override
    method generateKey (line 35) | @Override
    method toString (line 40) | @Override
    class NoopKey (line 45) | private static final class NoopKey implements Key {
      method NoopKey (line 49) | private NoopKey() {}
      method readKey (line 51) | @Override
      method writeKey (line 56) | @Override
      method getPublic (line 59) | @Override
      method isPublic (line 64) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/implementation/digest/RipeMD160Digest.java
  class RipeMD160Digest (line 16) | public class RipeMD160Digest {
    method RipeMD160Digest (line 66) | private RipeMD160Digest() {
    method RipeMD160Digest (line 70) | private RipeMD160Digest(RipeMD160Digest d) {
    method getInstance (line 77) | public static RipeMD160Digest getInstance() {
    method getInstance (line 81) | public static RipeMD160Digest getInstance(RipeMD160Digest d) {
    method reset (line 85) | public void reset() {
    method update (line 92) | public void update(byte input) {
    method update (line 105) | public void update(byte[] input) {
    method update (line 109) | public void update(byte[] input, int offset, int len) {
    method update (line 116) | public void update(String s) {
    method doFinal (line 124) | public byte[] doFinal() {
    method doFinal (line 137) | public byte[] doFinal(byte[] input) {
    method doFinal (line 142) | public byte[] doFinal(byte[] input, int offset, int len) {
    method digestBlock (line 148) | private void digestBlock(int[] X) {
    method finish (line 268) | private void finish(int[] array, int lswlen, int mswlen) {
    method getDigestSize (line 286) | public static int getDigestSize() {

FILE: src/main/java/cn/ponfee/commons/jce/implementation/digest/SHA1Digest.java
  class SHA1Digest (line 112) | public class SHA1Digest {
    method SHA1Digest (line 138) | private SHA1Digest() {
    method SHA1Digest (line 142) | private SHA1Digest(SHA1Digest d) {
    method getInstance (line 154) | public static SHA1Digest getInstance() {
    method getInstance (line 158) | public static SHA1Digest getInstance(SHA1Digest d) {
    method update (line 162) | public void update(byte input) {
    method update (line 171) | public void update(byte[] input) {
    method update (line 175) | public void update(byte[] input, int offset, int length) {
    method doFinal (line 182) | public byte[] doFinal(byte[] data) {
    method doFinal (line 187) | public byte[] doFinal() {
    method reset (line 220) | public void reset() {
    method getDigestSize (line 231) | public static int getDigestSize() {
    method digestBlock (line 236) | private void digestBlock(byte[] block) {
    method f0 (line 286) | private static int f0(int b, int c, int d) {
    method f1 (line 290) | private static int f1(int b, int c, int d) {
    method f2 (line 294) | private static int f2(int b, int c, int d) {
    method f3 (line 298) | private static int f3(int b, int c, int d) {

FILE: src/main/java/cn/ponfee/commons/jce/implementation/ecc/ECCryptor.java
  class ECCryptor (line 53) | public class ECCryptor extends Cryptor {
    method ECCryptor (line 59) | public ECCryptor(EllipticCurve curve) {
    method encrypt (line 67) | @Override
    method decrypt (line 107) | @Override
    method generateKey (line 144) | @Override
    method toString (line 149) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/implementation/ecc/ECKey.java
  class ECKey (line 21) | public class ECKey implements Key {
    method ECKey (line 32) | public ECKey(EllipticCurve ec) {
    method toString (line 48) | @Override
    method isPublic (line 57) | @Override
    method writeKey (line 62) | @Override
    method readKey (line 77) | @Override
    method getPublic (line 96) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/implementation/ecc/ECPoint.java
  class ECPoint (line 18) | public class ECPoint {
    method fastCache (line 29) | public void fastCache() {
    method ECPoint (line 48) | public ECPoint(EllipticCurve curve, BigInteger x, BigInteger y) {
    method ECPoint (line 63) | public ECPoint(byte[] bytes, EllipticCurve curve) {
    method ECPoint (line 86) | public ECPoint(EllipticCurve e) {
    method compress (line 96) | public byte[] compress() { // 只导出x坐标,y坐标可由方程计算得到
    method add (line 114) | public ECPoint add(ECPoint q) {
    method multiply (line 153) | public ECPoint multiply(BigInteger k) {
    method isZero (line 164) | public boolean isZero() {
    method getX (line 168) | public BigInteger getX() {
    method getY (line 172) | public BigInteger getY() {
    method getCurve (line 176) | public EllipticCurve getCurve() {
    method toString (line 180) | @Override
    method isSameCurve (line 185) | private boolean isSameCurve(ECPoint p) {

FILE: src/main/java/cn/ponfee/commons/jce/implementation/ecc/EllipticCurve.java
  class EllipticCurve (line 25) | public class EllipticCurve {
    method EllipticCurve (line 48) | public EllipticCurve(BigInteger a, BigInteger b, BigInteger p) {
    method EllipticCurve (line 67) | public EllipticCurve(ECParameters ecp) {
    method EllipticCurve (line 87) | public EllipticCurve(DataInputStream input) throws IOException {
    method writeCurve (line 119) | public void writeCurve(DataOutputStream output) throws IOException {
    method isOnCurve (line 149) | public boolean isOnCurve(ECPoint q) {
    method getN (line 160) | public BigInteger getN() {
    method getZero (line 164) | public ECPoint getZero() {
    method getA (line 168) | public BigInteger getA() {
    method getB (line 172) | public BigInteger getB() {
    method getP (line 176) | public BigInteger getP() {
    method getPCS (line 180) | public int getPCS() {
    method getBasePointG (line 184) | public ECPoint getBasePointG() {
    method getPSR2 (line 188) | public BigInteger getPSR2() {
    method toString (line 195) | @Override
    method equals (line 204) | @Override
    method hashCode (line 217) | @Override
    method isSingular (line 226) | private static boolean isSingular(BigInteger a, BigInteger b, BigInteg...
    method calculateN (line 237) | private BigInteger calculateN() {
    method calculateBasePointG (line 245) | private ECPoint calculateBasePointG() {

FILE: src/main/java/cn/ponfee/commons/jce/implementation/rsa/AbstractRSACryptor.java
  class AbstractRSACryptor (line 40) | public abstract class AbstractRSACryptor extends Cryptor {
    method AbstractRSACryptor (line 44) | public AbstractRSACryptor(boolean isPadding) {
    method getOriginBlockSize (line 48) | public int getOriginBlockSize(RSAKey rsaKey) {
    method getCipherBlockSize (line 54) | public int getCipherBlockSize(RSAKey rsaKey) {
    method encrypt (line 59) | @Override
    method decrypt (line 94) | @Override
    method encrypt (line 132) | public void encrypt(InputStream input, Key ek, OutputStream output) {
    method decrypt (line 161) | public void decrypt(InputStream input, Key dk, OutputStream output) {
    method getExponent (line 197) | public final BigInteger getExponent(RSAKey rsaKey) {
    method generateKey (line 205) | @Override
    method generateKey (line 210) | public final Key generateKey(int keySize) {
    method toString (line 214) | @Override
    method fixedByteArray (line 233) | private static void fixedByteArray(byte[] data, int fixedSize, OutputS...
    method trimByteArray (line 257) | private static void trimByteArray(byte[] data, OutputStream out)
    method encodeBlock (line 290) | private static byte[] encodeBlock(byte[] input, int from, int to,
    method decodeBlock (line 334) | private static void decodeBlock(byte[] input, int cipherBlockSize, Out...

FILE: src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSAHashCryptor.java
  class RSAHashCryptor (line 30) | public class RSAHashCryptor extends AbstractRSACryptor {
    method RSAHashCryptor (line 32) | public RSAHashCryptor() {
    method encrypt (line 46) | @Override
    method decrypt (line 75) | @Override
    method encrypt (line 101) | @Override
    method decrypt (line 136) | @Override
    method getOriginBlockSize (line 171) | @Override
    method getCipherBlockSize (line 176) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSAKey.java
  class RSAKey (line 57) | @SuppressWarnings("restriction")
    method RSAKey (line 80) | public RSAKey(int keySize) {
    method RSAKey (line 84) | public RSAKey(int keySize, int e) {
    method RSAKey (line 97) | public RSAKey(BigInteger n, BigInteger e,
    method RSAKey (line 115) | public RSAKey(BigInteger n, BigInteger e) {
    method isPublic (line 129) | @Override
    method isSecret (line 134) | public boolean isSecret() {
    method getPublic (line 141) | @Override
    method writeKey (line 148) | @Override
    method readKey (line 169) | @Override
    method getBigInteger (line 198) | private static BigInteger getBigInteger(DerInputStream derIn) {
    method generateKey (line 218) | public static KeyPair generateKey(int keySize, int e) {
    class KeyPair (line 285) | private static class KeyPair {

FILE: src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSANoPaddingCryptor.java
  class RSANoPaddingCryptor (line 16) | public class RSANoPaddingCryptor extends AbstractRSACryptor {
    method RSANoPaddingCryptor (line 18) | public RSANoPaddingCryptor() {

FILE: src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSAPKCS1PaddingCryptor.java
  class RSAPKCS1PaddingCryptor (line 16) | public class RSAPKCS1PaddingCryptor extends AbstractRSACryptor {
    method RSAPKCS1PaddingCryptor (line 18) | public RSAPKCS1PaddingCryptor() {
    method getOriginBlockSize (line 22) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSASigner.java
  class RSASigner (line 41) | public class RSASigner {
    method RSASigner (line 70) | public RSASigner(RSAKey rsaKey) {
    method signSha1 (line 81) | public byte[] signSha1(byte[] data) {
    method verifySha1 (line 85) | public boolean verifySha1(byte[] data, byte[] signature) {
    method signSha256 (line 89) | public byte[] signSha256(byte[] data) {
    method verifySha256 (line 93) | public boolean verifySha256(byte[] data, byte[] signature) {
    method sign (line 97) | public byte[] sign(byte[] data, DigestAlgorithms alg) {
    method verify (line 118) | public boolean verify(byte[] data, byte[] signature, DigestAlgorithms ...
    method derEncode (line 187) | private byte[] derEncode(byte[] hash, ASN1ObjectIdentifier digestOid)

FILE: src/main/java/cn/ponfee/commons/jce/implementation/symmetric/RC4.java
  class RC4 (line 29) | public class RC4 {
    method RC4 (line 42) | public RC4(byte[] keyBytes) {
    method encrypt (line 64) | public byte encrypt(byte in) {
    method decrypt (line 75) | public byte decrypt(byte in) {
    method encrypt (line 81) | public byte[] encrypt(byte[] in) {
    method decrypt (line 87) | public byte[] decrypt(byte[] in) {
    method doCrypt (line 93) | private void doCrypt(byte[] in, int inOff, int len, byte[] out, int ou...

FILE: src/main/java/cn/ponfee/commons/jce/passwd/BCrypt.java
  class BCrypt (line 45) | public final class BCrypt {
    method BCrypt (line 46) | private BCrypt() {}
    method create (line 329) | public static String create(String passwd) {
    method create (line 333) | public static String create(byte[] passwd) {
    method create (line 337) | public static String create(String passwd, int logrounds) {
    method create (line 348) | public static String create(byte[] passwd, int logrounds) {
    method check (line 366) | public static boolean check(String passwd, String hashed) {
    method check (line 376) | public static boolean check(byte[] passwd, String hashed) {
    method crypt (line 392) | public static byte[] crypt(byte[] passwd, byte[] salt, int logrounds) {
    method crypt (line 407) | public static byte[] crypt(byte[] passwd, byte[] salt, int logrounds, ...
    method ekskey (line 454) | private static void ekskey(int[] P, int[] S, byte[] data, byte[] key) {
    method streamtoword (line 486) | private static int streamtoword(byte[] data, int[] offp) {
    method key (line 505) | private static void key(int[] P, int[] S, byte[] key) {
    method encipher (line 536) | private static void encipher(int[] P, int[] S, int[] lr, int off) {

FILE: src/main/java/cn/ponfee/commons/jce/passwd/Crypt.java
  class Crypt (line 30) | public class Crypt {
    method create (line 34) | public static String create(String passwd) {
    method create (line 46) | public static String create(HmacAlgorithms alg, String passwd,
    method check (line 62) | public static boolean check(String passwd, String hashed) {
    method check (line 73) | public static boolean check(String passwd, String hashed, Provider pro...
    method crypt (line 97) | private static byte[] crypt(HmacAlgorithms alg, byte[] password,

FILE: src/main/java/cn/ponfee/commons/jce/passwd/PBKDF2.java
  class PBKDF2 (line 29) | public final class PBKDF2 {
    method PBKDF2 (line 30) | private PBKDF2() {}
    method create (line 39) | public static String create(String password) {
    method create (line 43) | public static String create(HmacAlgorithms alg, String password) {
    method create (line 55) | public static String create(HmacAlgorithms alg, char[] password) {
    method create (line 68) | public static String create(HmacAlgorithms alg, char[] password, int s...
    method check (line 95) | public static boolean check(String password, String correctHash) {
    method check (line 105) | public static boolean check(char[] password, String correctHash) {
    method pbkdf2 (line 136) | public static byte[] pbkdf2(HmacAlgorithms alg, char[] password, byte[...

FILE: src/main/java/cn/ponfee/commons/jce/passwd/SCrypt.java
  class SCrypt (line 32) | public final class SCrypt {
    method SCrypt (line 33) | private SCrypt() {}
    method create (line 38) | public static String create(String passwd, int N, int r, int p) {
    method create (line 54) | public static String create(HmacAlgorithms alg, String passwd,
    method check (line 79) | public static boolean check(String passwd, String hashed) {
    method pbkdf2 (line 112) | public static byte[] pbkdf2(HmacAlgorithms alg, byte[] P,
    method scrypt (line 171) | public static byte[] scrypt(HmacAlgorithms alg, byte[] P, byte[] S,
    method smix (line 193) | private static void smix(byte[] B, int Bi, int r, int N, byte[] V, byt...
    method blockmix_salsa8 (line 212) | private static void blockmix_salsa8(byte[] BY, int Bi, int Yi, int r) {
    method R (line 234) | private static int R(int a, int b) {
    method salsa20_8 (line 238) | private static void salsa20_8(byte[] B) {
    method blockxor (line 298) | private static void blockxor(byte[] S, int Si, byte[] D, int Di, int l...
    method integerify (line 304) | private static int integerify(byte[] B, int Bi, int r) {

FILE: src/main/java/cn/ponfee/commons/jce/pkcs/CryptoMessageSyntax.java
  class CryptoMessageSyntax (line 41) | public final class CryptoMessageSyntax {
    method sign (line 51) | public static byte[] sign(byte[] data, PrivateKey key, X509Certificate...
    method sign (line 62) | public static byte[] sign(byte[] data, List<PrivateKey> keys, List<X50...
    method verify (line 85) | public static void verify(byte[] signed) {
    method envelop (line 126) | public static byte[] envelop(byte[] data, X509Certificate cert, ASN1Ob...
    method unenvelop (line 149) | public static byte[] unenvelop(byte[] enveloped, X509Certificate cert,...

FILE: src/main/java/cn/ponfee/commons/jce/pkcs/PKCS1Signature.java
  class PKCS1Signature (line 23) | public class PKCS1Signature {
    method sign (line 32) | public static byte[] sign(byte[] data, PrivateKey privateKey, X509Cert...
    method verify (line 50) | public static boolean verify(byte[] data, byte[] signed, X509Certifica...

FILE: src/main/java/cn/ponfee/commons/jce/pkcs/PKCS7Signature.java
  class PKCS7Signature (line 34) | @SuppressWarnings("restriction")
    method sign (line 53) | public static byte[] sign(PrivateKey privKey, X509Certificate cert, by...
    method sign (line 65) | public static byte[] sign(PrivateKey[] privKeys, X509Certificate[] cer...
    method sign (line 83) | public static byte[] sign(PrivateKey privKey, X509Certificate cert, St...
    method sign (line 95) | public static byte[] sign(PrivateKey[] privKeys, X509Certificate[] cer...
    method verify (line 113) | public static byte[] verify(byte[] pkcs7Data) {
    method verify (line 126) | public static void verify(byte[] pkcs7Data, byte[] data) {
    method verify (line 130) | public static void verify(PKCS7 pkcs7, byte[] data) {
    method sign (line 155) | private static byte[] sign(ContentInfo contentInfo, byte[] data,
    method getPkcs7 (line 196) | public static PKCS7 getPkcs7(byte[] pkcs7Data) {
    method getContent (line 209) | public static byte[] getContent(PKCS7 pkcs7) {

FILE: src/main/java/cn/ponfee/commons/jce/security/DHKeyExchanger.java
  class DHKeyExchanger (line 50) | public final class DHKeyExchanger {
    method initPartAKey (line 55) | public static Pair<DHPublicKey, DHPrivateKey> initPartAKey() {
    method initPartAKey (line 64) | public static Pair<DHPublicKey, DHPrivateKey> initPartAKey(int keySize) {
    method initPartBKey (line 80) | public static Pair<DHPublicKey, DHPrivateKey> initPartBKey(byte[] part...
    method initPartBKey (line 90) | public static Pair<DHPublicKey, DHPrivateKey> initPartBKey(DHPublicKey...
    method encode (line 112) | public static byte[] encode(DHPublicKey key) {
    method encode (line 121) | public static byte[] encode(DHPrivateKey key) {
    method decodePrivateKey (line 131) | public static DHPrivateKey decodePrivateKey(byte[] privateKey) {
    method decodePublicKey (line 146) | public static DHPublicKey decodePublicKey(byte[] publicKey) {
    method genSecretKey (line 162) | public static SecretKey genSecretKey(byte[] bPriKey, byte[] aPubKey) {
    method genSecretKey (line 172) | public static SecretKey genSecretKey(DHPrivateKey bPriKey, DHPublicKey...
    method encrypt (line 190) | public static byte[] encrypt(byte[] data, SecretKey secretKey) {
    method decrypt (line 206) | public static byte[] decrypt(byte[] data, SecretKey secretKey) {

FILE: src/main/java/cn/ponfee/commons/jce/security/DSASigner.java
  class DSASigner (line 31) | public final class DSASigner {
    method initKey (line 39) | public static Pair<DSAPublicKey, DSAPrivateKey> initKey() {
    method initKey (line 50) | public static Pair<DSAPublicKey, DSAPrivateKey> initKey(String seed, i...
    method decodePrivateKey (line 62) | public static DSAPrivateKey decodePrivateKey(byte[] privateKey) {
    method decodePublicKey (line 71) | public static DSAPublicKey decodePublicKey(byte[] publicKey) {
    method sign (line 86) | public static byte[] sign(byte[] data, byte[] privateKey) {
    method sign (line 90) | public static byte[] sign(byte[] data, DSAPrivateKey privateKey) {
    method verify (line 109) | public static boolean verify(byte[] origin, byte[] publicKey, byte[] s...
    method verify (line 113) | public static boolean verify(byte[] origin, DSAPublicKey publicKey, by...

FILE: src/main/java/cn/ponfee/commons/jce/security/ECDHKeyExchanger.java
  class ECDHKeyExchanger (line 32) | public final class ECDHKeyExchanger {
    method initPartAKey (line 36) | public static Pair<ECPublicKey, ECPrivateKey> initPartAKey() {
    method initPartAKey (line 46) | public static Pair<ECPublicKey, ECPrivateKey> initPartAKey(int keySize) {
    method initPartBKey (line 56) | public static Pair<ECPublicKey, ECPrivateKey> initPartBKey(byte[] part...
    method initPartBKey (line 65) | public static Pair<ECPublicKey, ECPrivateKey> initPartBKey(ECPublicKey...
    method encode (line 86) | public static byte[] encode(ECPublicKey key) {
    method encode (line 95) | public static byte[] encode(ECPrivateKey key) {
    method decodePrivateKey (line 104) | public static ECPrivateKey decodePrivateKey(byte[] privateKey) {
    method decodePublicKey (line 119) | public static ECPublicKey decodePublicKey(byte[] publicKey) {
    method genSecretKey (line 135) | public static SecretKey genSecretKey(byte[] bPriKey, byte[] aPubKey) {
    method genSecretKey (line 145) | public static SecretKey genSecretKey(ECPrivateKey bPriKey, ECPublicKey...
    method encrypt (line 163) | public static byte[] encrypt(byte[] data, SecretKey secretKey) {
    method decrypt (line 179) | public static byte[] decrypt(byte[] data, SecretKey secretKey) {

FILE: src/main/java/cn/ponfee/commons/jce/security/ECDSASigner.java
  class ECDSASigner (line 28) | public final class ECDSASigner {
    type ECDSASignAlgorithms (line 30) | public enum ECDSASignAlgorithms {
    method generateKeyPair (line 37) | public static Pair<ECPublicKey, ECPrivateKey> generateKeyPair() {
    method generateKeyPair (line 46) | public static Pair<ECPublicKey, ECPrivateKey> generateKeyPair(int keyS...
    method encode (line 60) | public static byte[] encode(ECPublicKey key) {
    method encode (line 69) | public static byte[] encode(ECPrivateKey key) {
    method decodePublicKey (line 78) | public static ECPublicKey decodePublicKey(byte[] publicKey) {
    method decodePrivateKey (line 92) | public static ECPrivateKey decodePrivateKey(byte[] privateKey) {
    method signSha1 (line 101) | public static byte[] signSha1(byte[] data, ECPrivateKey privateKey) {
    method verifySha1 (line 105) | public static boolean verifySha1(byte[] data, byte[] signed, ECPublicK...
    method signSha256 (line 109) | public static byte[] signSha256(byte[] data, ECPrivateKey privateKey) {
    method verifySha256 (line 113) | public static boolean verifySha256(byte[] data, byte[] signed, ECPubli...
    method signSha512 (line 117) | public static byte[] signSha512(byte[] data, ECPrivateKey privateKey) {
    method verifySha512 (line 121) | public static boolean verifySha512(byte[] data, byte[] signed, ECPubli...
    method sign (line 125) | private static byte[] sign(byte[] data, ECPrivateKey privateKey,
    method verify (line 137) | private static boolean verify(byte[] data, byte[] signed, ECPublicKey ...

FILE: src/main/java/cn/ponfee/commons/jce/security/KeyStoreResolver.java
  class KeyStoreResolver (line 36) | public class KeyStoreResolver {
    type KeyStoreType (line 41) | public enum KeyStoreType {
    method KeyStoreResolver (line 47) | public KeyStoreResolver(KeyStoreType type) {
    method KeyStoreResolver (line 51) | public KeyStoreResolver(KeyStoreType type, String storePassword) {
    method KeyStoreResolver (line 55) | public KeyStoreResolver(KeyStoreType type, byte[] keyStore, String sto...
    method KeyStoreResolver (line 65) | public KeyStoreResolver(KeyStoreType type, InputStream input, String s...
    method setCertificateEntry (line 79) | public void setCertificateEntry(String alias, Certificate cert) {
    method setKeyEntry (line 95) | public final void setKeyEntry(String alias, PrivateKey key,
    method setKeyEntry (line 113) | public final void setKeyEntry(String alias, byte[] encryptedPkcs8Key,
    method export (line 123) | public byte[] export(String storePassword) {
    method export (line 134) | public void export(OutputStream out, String storePassword) {
    method listAlias (line 147) | public List<String> listAlias() {
    method delAlias (line 160) | public void delAlias(String alias) {
    method getFirstAlias (line 170) | public String getFirstAlias() {
    method getCertificate (line 178) | public Certificate getCertificate() {
    method getCertificate (line 188) | public Certificate getCertificate(String alias) {
    method getPrivateKey (line 199) | public PrivateKey getPrivateKey(String keyPassword) {
    method getPrivateKey (line 209) | public PrivateKey getPrivateKey(String alias, String keyPassword) {
    method getX509CertChain (line 222) | public X509Certificate[] getX509CertChain() {
    method getX509CertChain (line 231) | public X509Certificate[] getX509CertChain(String alias) {
    method getSSLContext (line 247) | public SSLContext getSSLContext(String keyPassword) {
    method getSSLContext (line 257) | public SSLContext getSSLContext(String keyPassword, KeyStore trustStor...
    method getKeyStore (line 278) | public KeyStore getKeyStore() {
    method loadFromPem (line 282) | public static KeyStoreResolver loadFromPem(String pem) {
    method checkAliasNotExists (line 289) | private void checkAliasNotExists(String alias) throws KeyStoreException {
    method toCharArray (line 295) | private static char[] toCharArray(String str) {

FILE: src/main/java/cn/ponfee/commons/jce/security/RSACryptor.java
  class RSACryptor (line 41) | public final class RSACryptor {
    method RSACryptor (line 42) | private RSACryptor() {}
    method generateKeyPair (line 46) | public static RSAKeyPair generateKeyPair() {
    method generateKeyPair (line 56) | public static RSAKeyPair generateKeyPair(int keySize) {
    method signMd5 (line 72) | public static byte[] signMd5(byte[] data, RSAPrivateKey privateKey) {
    method signSha1 (line 82) | public static byte[] signSha1(byte[] data, RSAPrivateKey privateKey) {
    method signSha256 (line 92) | public static byte[] signSha256(byte[] data, RSAPrivateKey privateKey) {
    method verifyMd5 (line 103) | public static boolean verifyMd5(byte[] data, RSAPublicKey publicKey, b...
    method verifySha1 (line 114) | public static boolean verifySha1(byte[] data, RSAPublicKey publicKey, ...
    method verifySha256 (line 125) | public static boolean verifySha256(byte[] data, RSAPublicKey publicKey...
    method encrypt (line 147) | public static <T extends Key & RSAKey> byte[] encrypt(byte[] data, T k...
    method encryptNoPadding (line 151) | public static <T extends Key & RSAKey> byte[] encryptNoPadding(byte[] ...
    method encrypt (line 155) | public static <T extends Key & RSAKey> void encrypt(InputStream input,...
    method encryptNoPadding (line 160) | public static <T extends Key & RSAKey> void encryptNoPadding(InputStre...
    method decrypt (line 171) | public static <T extends Key & RSAKey> byte[] decrypt(byte[] encrypted...
    method decryptNoPadding (line 175) | public static <T extends Key & RSAKey> byte[] decryptNoPadding(byte[] ...
    method decrypt (line 179) | public static <T extends Key & RSAKey> void decrypt(InputStream input,...
    method decryptNoPadding (line 184) | public static <T extends Key & RSAKey> void decryptNoPadding(InputStre...
    method getBlockSize (line 190) | private static <T extends Key & RSAKey> int getBlockSize(int cryptMode...
    method docrypt (line 196) | private static <T extends Key & RSAKey> void docrypt(InputStream input...
    method docrypt (line 230) | private static <T extends Key & RSAKey> byte[] docrypt(byte[] data, T ...
    method sign (line 259) | private static byte[] sign(byte[] data, RSAPrivateKey privateKey, RSAS...
    method verify (line 278) | private static boolean verify(byte[] data, RSAPublicKey publicKey,
    class RSAKeyPair (line 294) | public static final class RSAKeyPair implements Serializable {
      method RSAKeyPair (line 299) | private RSAKeyPair(RSAPrivateKey privateKey, RSAPublicKey publicKey) {
      method getPrivateKey (line 304) | public RSAPrivateKey getPrivateKey() {
      method getPublicKey (line 308) | public RSAPublicKey getPublicKey() {
      method toPkcs8PrivateKey (line 312) | public String toPkcs8PrivateKey() {
      method toPkcs1PrivateKey (line 316) | public String toPkcs1PrivateKey() {
      method toPkcs8PublicKey (line 320) | public String toPkcs8PublicKey() {
      method toPkcs1PublicKey (line 324) | public String toPkcs1PublicKey() {

FILE: src/main/java/cn/ponfee/commons/jce/security/RSAPrivateKeys.java
  class RSAPrivateKeys (line 75) | public final class RSAPrivateKeys {
    method RSAPrivateKeys (line 76) | private RSAPrivateKeys() {}
    method toRSAPrivateKey (line 85) | public static RSAPrivateKey toRSAPrivateKey(BigInteger modulus, BigInt...
    method inverse (line 102) | public static RSAPublicKey inverse(RSAPrivateKey privateKey) {
    method extractPublicKey (line 115) | public static RSAPublicKey extractPublicKey(RSAPrivateKey privateKey) {
    method toPkcs1 (line 132) | public static String toPkcs1(RSAPrivateKey privateKey) {
    method fromPkcs1 (line 148) | public static RSAPrivateKey fromPkcs1(String pkcs1PrivateKey) {
    method toPkcs1Pem (line 190) | public static String toPkcs1Pem(RSAPrivateKey privateKey) {
    method fromPkcs1Pem (line 199) | public static RSAPrivateKey fromPkcs1Pem(String pemPrivateKey) {
    method toPkcs8 (line 220) | public static String toPkcs8(RSAPrivateKey privateKey) {
    method fromPkcs8 (line 229) | public static RSAPrivateKey fromPkcs8(String pkcs8PrivateKey) {
    method toEncryptedPkcs8Pem (line 265) | public static String toEncryptedPkcs8Pem(RSAPrivateKey privateKey,
    method toEncryptedPkcs8Pem (line 288) | public static String toEncryptedPkcs8Pem(RSAPrivateKey privateKey, Str...
    method toEncryptedPkcs8 (line 306) | public static String toEncryptedPkcs8(RSAPrivateKey privateKey, String...
    method toEncryptedPkcs8 (line 324) | public static String toEncryptedPkcs8(RSAPrivateKey privateKey, Output...
    method fromEncryptedPkcs8Pem (line 342) | public static RSAPrivateKey fromEncryptedPkcs8Pem(String encryptedPem,
    method fromEncryptedPkcs8Pem (line 364) | public static RSAPrivateKey fromEncryptedPkcs8Pem(String encryptedPem,...
    method fromEncryptedPkcs8 (line 369) | public static RSAPrivateKey fromEncryptedPkcs8(String encryptedPrivate...
    method fromEncryptedPkcs8 (line 380) | public static RSAPrivateKey fromEncryptedPkcs8(byte[] encryptedPrivate...
    method fromEncryptedPkcs8 (line 385) | public static RSAPrivateKey fromEncryptedPkcs8(String encryptedPrivate...
    method fromEncryptedPkcs8 (line 397) | public static RSAPrivateKey fromEncryptedPkcs8(byte[] encryptedPrivate...

FILE: src/main/java/cn/ponfee/commons/jce/security/RSAPublicKeys.java
  class RSAPublicKeys (line 39) | public final class RSAPublicKeys {
    method RSAPublicKeys (line 40) | private RSAPublicKeys() {}
    method toRSAPublicKey (line 49) | public static RSAPublicKey toRSAPublicKey(BigInteger modulus, BigInteg...
    method getPublicKey (line 64) | public static RSAPublicKey getPublicKey(Certificate cert) {
    method inverse (line 75) | public static RSAPrivateKey inverse(RSAPublicKey publicKey) {
    method toPkcs1 (line 93) | public static String toPkcs1(RSAPublicKey publicKey) {
    method fromPkcs1 (line 107) | public static RSAPublicKey fromPkcs1(String pkcs1PublicKey) {
    method toPkcs8 (line 128) | public static String toPkcs8(RSAPublicKey publicKey) {
    method fromPkcs8 (line 137) | public static RSAPublicKey fromPkcs8(String pkcs8PublicKey) {
    method toPkcs8Pem (line 164) | public static String toPkcs8Pem(RSAPublicKey publicKey) {
    method fromPkcs8Pem (line 173) | public static RSAPublicKey fromPkcs8Pem(String pemPublicKey) {
    method getKeyLength (line 192) | public static int getKeyLength(RSAKey rsaKey) {

FILE: src/main/java/cn/ponfee/commons/jce/sm/SM2.java
  class SM2 (line 39) | public final class SM2 {
    method SM2 (line 53) | private SM2(ECPoint publicKey, BigInteger privateKey, BigInteger n) {
    method reset (line 71) | private void reset() {
    method nextKey (line 83) | private void nextKey() {
    method encrypt (line 91) | private void encrypt(byte[] data) {
    method decrypt (line 102) | private void decrypt(byte[] data) {
    method doFinal (line 113) | private byte[] doFinal() {
    method generateKeyPair (line 120) | public static Map<String, byte[]> generateKeyPair() {
    method generateKeyPair (line 130) | public static Map<String, byte[]> generateKeyPair(ECParameters ecParam) {
    method getPublicKey (line 142) | public static byte[] getPublicKey(Map<String, byte[]> keyMap) {
    method getPrivateKey (line 146) | public static byte[] getPrivateKey(Map<String, byte[]> keyMap) {
    method getPublicKey (line 150) | public static ECPoint getPublicKey(byte[] publicKey) {
    method getPublicKey (line 154) | public static ECPoint getPublicKey(ECParameters ecParam, byte[] public...
    method getPrivateKey (line 158) | public static BigInteger getPrivateKey(byte[] privateKey) {
    method encrypt (line 162) | public static byte[] encrypt(byte[] publicKey, byte[] data) {
    method encrypt (line 173) | public static byte[] encrypt(ECParameters ecParam, byte[] publicKey, b...
    method decrypt (line 196) | public static byte[] decrypt(byte[] privateKey, byte[] encrypted) {
    method decrypt (line 207) | public static byte[] decrypt(ECParameters ecParam,
    method sign (line 236) | public static byte[] sign(byte[] data, byte[] publicKey,
    method sign (line 241) | public static byte[] sign(byte[] data, byte[] ida,
    method sign (line 246) | public static byte[] sign(ECParameters ecParam, byte[] data,
    method sign (line 260) | public static byte[] sign(ECParameters ecParam, byte[] data, byte[] ida,
    method verify (line 284) | public static boolean verify(byte[] data, byte[] signed, byte[] public...
    method verify (line 288) | public static boolean verify(byte[] data, byte[] ida,
    method verify (line 293) | public static boolean verify(ECParameters ecParam, byte[] data,
    method verify (line 307) | public static boolean verify(ECParameters ecParam, byte[] data, byte[]...
    method checkPublicKey (line 334) | public static boolean checkPublicKey(byte[] publicKey) {
    method checkPublicKey (line 338) | public static boolean checkPublicKey(ECParameters ecParam, byte[] publ...
    method checkPublicKey (line 342) | public static boolean checkPublicKey(ECPoint publicKey) {
    method checkPublicKey (line 346) | public static boolean checkPublicKey(ECParameters ecParam, ECPoint pub...
    method calcZ (line 366) | static byte[] calcZ(SM3Digest sm3, ECParameters ecParam, ECPoint pubKe...
    method calcZ (line 377) | static byte[] calcZ(SM3Digest sm3, ECParameters ecParam, byte[] ida, E...
    method isNotBetween (line 402) | private static boolean isNotBetween(BigInteger number, BigInteger min,...
    class Signature (line 409) | private static class Signature implements java.io.Serializable {
      method Signature (line 416) | Signature(BigInteger r, BigInteger s, BigInteger n) {
      method Signature (line 422) | Signature(byte[] signed, BigInteger n) {
      method toByteArray (line 429) | byte[] toByteArray() {
      method toString (line 439) | @Override

FILE: src/main/java/cn/ponfee/commons/jce/sm/SM2KeyExchanger.java
  class SM2KeyExchanger (line 29) | public class SM2KeyExchanger implements Serializable {
    method SM2KeyExchanger (line 45) | public SM2KeyExchanger(ECPoint publicKey, BigInteger privateKey) {
    method SM2KeyExchanger (line 49) | public SM2KeyExchanger(byte[] ida, ECPoint publicKey, BigInteger priva...
    method SM2KeyExchanger (line 53) | public SM2KeyExchanger(ECPoint publicKey, BigInteger privateKey,
    method SM2KeyExchanger (line 58) | public SM2KeyExchanger(byte[] ida, ECPoint publicKey, BigInteger priva...
    method step1PartA (line 71) | public TransportEntity step1PartA() {
    method step2PartB (line 82) | public TransportEntity step2PartB(TransportEntity entity1) {
    method step3PartA (line 125) | public TransportEntity step3PartA(TransportEntity entity2) {
    method step4PartB (line 171) | public boolean step4PartB(TransportEntity entity3) {
    method getKey (line 186) | public byte[] getKey() {
    class TransportEntity (line 193) | public static class TransportEntity implements Serializable {
      method TransportEntity (line 201) | TransportEntity(byte[] r, byte[] s, byte[] z, ECPoint pKey) {
      method TransportEntity (line 205) | TransportEntity(byte[] r, byte[] s, byte[] z, byte[] publicKey) {
      method getR (line 212) | public byte[] getR() {
      method getS (line 216) | public byte[] getS() {
      method getZ (line 220) | public byte[] getZ() {
      method getK (line 224) | public byte[] getK() {
    method digest (line 238) | private static byte[] digest(SM3Digest sm3, byte[] x, byte[] z1,
    method kdf (line 257) | private static byte[] kdf(byte[] Z, int klen) {

FILE: src/main/java/cn/ponfee/commons/jce/sm/SM3Digest.java
  class SM3Digest (line 20) | public class SM3Digest {
    method SM3Digest (line 37) | private SM3Digest() {
    method SM3Digest (line 41) | private SM3Digest(SM3Digest t) {
    method getInstance (line 48) | public static SM3Digest getInstance() {
    method getInstance (line 52) | public static SM3Digest getInstance(SM3Digest t)
Condensed preview — 670 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,742K chars).
[
  {
    "path": ".editorconfig",
    "chars": 256,
    "preview": "# http://editorconfig.org\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\ncharset = utf-8\nend_of_line = lf\ntrim_t"
  },
  {
    "path": ".github/workflows/build-with-maven.yml",
    "chars": 746,
    "preview": "# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow executi"
  },
  {
    "path": ".gitignore",
    "chars": 767,
    "preview": "# Eclipse\n/**/.classpath\n/**/.project\n/**/.settings/\n/**/.myeclipse/\n\n# Intellij\n/**/.idea/\n/**/*.iml\n/**/*.iws\n/**/*.ip"
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "chars": 1019,
    "preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements.  See the NOTICE f"
  },
  {
    "path": "LICENSE",
    "chars": 11345,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 3352,
    "preview": "[![Blog](https://img.shields.io/badge/blog-@Ponfee-informational.svg?logo=Pelican)](http://www.ponfee.cn)\n[![License](ht"
  },
  {
    "path": "mvnw",
    "chars": 9781,
    "preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
  },
  {
    "path": "mvnw.cmd",
    "chars": 6702,
    "preview": "@REM ----------------------------------------------------------------------------\n@REM Licensed to the Apache Software F"
  },
  {
    "path": "pom.xml",
    "chars": 33467,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/Initializable.java",
    "chars": 1097,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/NoArgMethodInvoker.java",
    "chars": 1784,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/Predicates.java",
    "chars": 5136,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/PrimitiveTypes.java",
    "chars": 4530,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/Releasable.java",
    "chars": 1742,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/Symbol.java",
    "chars": 3419,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/TimestampProvider.java",
    "chars": 904,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple.java",
    "chars": 7355,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple0.java",
    "chars": 1749,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple1.java",
    "chars": 1522,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple2.java",
    "chars": 1897,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple3.java",
    "chars": 1816,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple4.java",
    "chars": 1957,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple5.java",
    "chars": 2098,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple6.java",
    "chars": 2239,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple7.java",
    "chars": 2383,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple8.java",
    "chars": 2525,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/base/tuple/Tuple9.java",
    "chars": 2666,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ArrayHashKey.java",
    "chars": 1622,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ByteArrayComparator.java",
    "chars": 1628,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ByteArrayTrait.java",
    "chars": 959,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ByteArrayWrapper.java",
    "chars": 2280,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/Collects.java",
    "chars": 15275,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/Comparators.java",
    "chars": 1227,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/DelegatedIntSpliterator.java",
    "chars": 2636,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/DoubleListViewer.java",
    "chars": 8931,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/FilterableIterator.java",
    "chars": 3147,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ImmutableArrayList.java",
    "chars": 11265,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ImmutableHashList.java",
    "chars": 2277,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/LRUCache.java",
    "chars": 2848,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/Maps.java",
    "chars": 4019,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/StreamForker.java",
    "chars": 4444,
    "preview": "package cn.ponfee.commons.collect;\n\nimport cn.ponfee.commons.exception.ServerException;\n\nimport java.util.*;\nimport java"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/collect/ValueSortedMap.java",
    "chars": 5144,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/AsyncBatchProcessor.java",
    "chars": 9696,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/AsyncDelayedExecutor.java",
    "chars": 3821,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/DelayedData.java",
    "chars": 1632,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/MultithreadExecutors.java",
    "chars": 3034,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/NamedThreadFactory.java",
    "chars": 3523,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/SingleThreadShutdownHook.java",
    "chars": 1536,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/ThreadPoolExecutors.java",
    "chars": 7827,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/ThreadPoolMonitor.java",
    "chars": 2044,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/Threads.java",
    "chars": 3943,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/concurrent/TracedRunnable.java",
    "chars": 1286,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/ConstrainParam.java",
    "chars": 1017,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/Constraint.java",
    "chars": 3099,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/Constraints.java",
    "chars": 1019,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/FailFastValidatorFactoryBean.java",
    "chars": 1688,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/FieldValidator.java",
    "chars": 12438,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/Jsr303Validator.java",
    "chars": 2297,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/MethodValidator.java",
    "chars": 7325,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/constrain/ParamValidator.java",
    "chars": 3595,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/dag/DAGEdge.java",
    "chars": 2429,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/dag/DAGExpressionParser.java",
    "chars": 21778,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/dag/DAGNode.java",
    "chars": 3815,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/DataSourceFactory.java",
    "chars": 1585,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/DataSourceNaming.java",
    "chars": 978,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/DruidDataSourceFactory.java",
    "chars": 2363,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/MultipleDataSourceAdvisor.java",
    "chars": 6854,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/MultipleDataSourceAspect.java",
    "chars": 2426,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/NamedDataSource.java",
    "chars": 3724,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/lookup/DataSourceLookup.java",
    "chars": 802,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/lookup/MultipleCachedDataSource.java",
    "chars": 7247,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/lookup/MultipleDataSourceContext.java",
    "chars": 3443,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/lookup/MultipleFixedDataSource.java",
    "chars": 3226,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/data/lookup/MultipleScalableDataSource.java",
    "chars": 5336,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/date/CustomLocalDateTimeDeserializer.java",
    "chars": 5685,
    "preview": "package cn.ponfee.commons.date;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport com.fasterxml.jackson.core.J"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/date/DatePeriods.java",
    "chars": 4373,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/date/Dates.java",
    "chars": 19321,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/date/JavaUtilDateFormat.java",
    "chars": 12353,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/date/LocalDateTimeFormat.java",
    "chars": 5909,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/exception/BaseCheckedException.java",
    "chars": 2478,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/exception/BaseUncheckedException.java",
    "chars": 2507,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/exception/ServerException.java",
    "chars": 1565,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/exception/Throwables.java",
    "chars": 12525,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/exception/UnauthorizedException.java",
    "chars": 1626,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/exception/UnimplementedException.java",
    "chars": 1642,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/AbstractCsvExporter.java",
    "chars": 5400,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/AbstractDataExporter.java",
    "chars": 5781,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/AbstractSplitExporter.java",
    "chars": 4159,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/CellStyleOptions.java",
    "chars": 720,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/ConsoleExporter.java",
    "chars": 6652,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/CsvFileExporter.java",
    "chars": 1812,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/CsvStringExporter.java",
    "chars": 1786,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/CsvWriteExporter.java",
    "chars": 1231,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/DataExporter.java",
    "chars": 1047,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/ExcelExporter.java",
    "chars": 26786,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/HtmlExporter.java",
    "chars": 14950,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/SplitCsvFileExporter.java",
    "chars": 1813,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/SplitExcelExporter.java",
    "chars": 1877,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/Table.java",
    "chars": 5685,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/Thead.java",
    "chars": 1325,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/export/Tmeta.java",
    "chars": 2430,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/CsvExtractor.java",
    "chars": 3736,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/DataExtractor.java",
    "chars": 3956,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/DataExtractorBuilder.java",
    "chars": 4871,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/ExcelExtractor.java",
    "chars": 4841,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/ExtractableDataSource.java",
    "chars": 1678,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/ValidateResult.java",
    "chars": 1518,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/streaming/StreamingExcelExtractor.java",
    "chars": 4385,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingCell.java",
    "chars": 6032,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingReader.java",
    "chars": 3214,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingRow.java",
    "chars": 4366,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingSheet.java",
    "chars": 18697,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/extract/streaming/xls/HSSFStreamingWorkbook.java",
    "chars": 17566,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/http/ContentType.java",
    "chars": 2362,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/http/Http.java",
    "chars": 16214,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/http/HttpException.java",
    "chars": 1343,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/http/HttpParams.java",
    "chars": 9140,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/http/HttpRequest.java",
    "chars": 81716,
    "preview": "/*\n * Copyright (c) 2014 Kevin Sawicki <kevinsawicki@gmail.com>\n *\n * Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/http/HttpStatus.java",
    "chars": 18626,
    "preview": "package cn.ponfee.commons.http;\n\nimport com.google.common.collect.ImmutableMap;\n\nimport java.util.Map;\n\n/**\n* Enumeratio"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/ByteOrderMarks.java",
    "chars": 10308,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/CharsetDetector.java",
    "chars": 3308,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/Closeables.java",
    "chars": 2143,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/ExtendedGZIPOutputStream.java",
    "chars": 1145,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/FileTransformer.java",
    "chars": 7548,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/Files.java",
    "chars": 8294,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/GzipProcessor.java",
    "chars": 2758,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/HumanReadables.java",
    "chars": 7291,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/PrereadInputStream.java",
    "chars": 3428,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/StringPrintWriter.java",
    "chars": 1141,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/WrappedBufferedReader.java",
    "chars": 2643,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/WrappedBufferedWriter.java",
    "chars": 3098,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/charset/BytesDetector.java",
    "chars": 151856,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/charset/CodepageDetector.java",
    "chars": 2283,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/charset/JchardetDetector.java",
    "chars": 3166,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/io/charset/TikaDetector.java",
    "chars": 1751,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/CryptoProvider.java",
    "chars": 12640,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/DigestAlgorithms.java",
    "chars": 3480,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/ECParameters.java",
    "chars": 11927,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/HmacAlgorithms.java",
    "chars": 2982,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/Providers.java",
    "chars": 11668,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/RSACipherPaddings.java",
    "chars": 3442,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/RSASignAlgorithms.java",
    "chars": 771,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/CertPKCS1Verifier.java",
    "chars": 2264,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/CertPKCS7Verifier.java",
    "chars": 4329,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/CertSignedVerifier.java",
    "chars": 4067,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/ObjectIdentifiers.java",
    "chars": 4252,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/RepairX500Principal.java",
    "chars": 3807,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/X509CertGenerator.java",
    "chars": 11909,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/X509CertInfo.java",
    "chars": 2385,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/cert/X509CertUtils.java",
    "chars": 15674,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/digest/DigestUtils.java",
    "chars": 7212,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/digest/HmacUtils.java",
    "chars": 6547,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/Cryptor.java",
    "chars": 1372,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/Key.java",
    "chars": 940,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/NoopCryptor.java",
    "chars": 1790,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/digest/RipeMD160Digest.java",
    "chars": 9312,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/digest/SHA1Digest.java",
    "chars": 9322,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/ecc/ECCryptor.java",
    "chars": 5447,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/ecc/ECKey.java",
    "chars": 3308,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/ecc/ECPoint.java",
    "chars": 5822,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/ecc/EllipticCurve.java",
    "chars": 7688,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/ecc/package-info.java",
    "chars": 680,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/package-info.java",
    "chars": 724,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/AbstractRSACryptor.java",
    "chars": 13489,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSAHashCryptor.java",
    "chars": 6765,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSAKey.java",
    "chars": 9617,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSANoPaddingCryptor.java",
    "chars": 822,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSAPKCS1PaddingCryptor.java",
    "chars": 948,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/RSASigner.java",
    "chars": 7328,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/rsa/package-info.java",
    "chars": 680,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/implementation/symmetric/RC4.java",
    "chars": 3211,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/package-info.java",
    "chars": 5768,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/passwd/BCrypt.java",
    "chars": 24797,
    "preview": "package cn.ponfee.commons.jce.passwd;\n\nimport cn.ponfee.commons.util.Base64UrlSafe;\nimport cn.ponfee.commons.util.Secure"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/passwd/Crypt.java",
    "chars": 3850,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/passwd/PBKDF2.java",
    "chars": 5567,
    "preview": "package cn.ponfee.commons.jce.passwd;\n\nimport cn.ponfee.commons.jce.HmacAlgorithms;\nimport cn.ponfee.commons.jce.Provide"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/passwd/SCrypt.java",
    "chars": 11176,
    "preview": "// Copyright (C) 2011 - Will Glozer. All rights reserved.\n\npackage cn.ponfee.commons.jce.passwd;\n\nimport cn.ponfee.commo"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/pkcs/CryptoMessageSyntax.java",
    "chars": 6786,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/pkcs/PKCS1Signature.java",
    "chars": 2126,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/pkcs/PKCS7Signature.java",
    "chars": 7932,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/DHKeyExchanger.java",
    "chars": 7053,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/DSASigner.java",
    "chars": 4229,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/ECDHKeyExchanger.java",
    "chars": 6084,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/ECDSASigner.java",
    "chars": 5930,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/KeyStoreResolver.java",
    "chars": 9616,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/RSACryptor.java",
    "chars": 10785,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/RSAPrivateKeys.java",
    "chars": 19107,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/security/RSAPublicKeys.java",
    "chars": 7216,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/sm/SM2.java",
    "chars": 15813,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/sm/SM2KeyExchanger.java",
    "chars": 8903,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/sm/SM3Digest.java",
    "chars": 12396,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/sm/SM4.java",
    "chars": 14507,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/Algorithm.java",
    "chars": 2728,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/Mode.java",
    "chars": 1272,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/PBECryptor.java",
    "chars": 2969,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/PBECryptorBuilder.java",
    "chars": 3525,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/Padding.java",
    "chars": 1386,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/SymmetricCryptor.java",
    "chars": 5054,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/jce/symmetric/SymmetricCryptorBuilder.java",
    "chars": 3492,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/json/FastjsonMoney.java",
    "chars": 2685,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  },
  {
    "path": "src/main/java/cn/ponfee/commons/json/FastjsonPropertyFilter.java",
    "chars": 2918,
    "preview": "/* __________              _____                                                *\\\n** \\______   \\____   _____/ ____\\____"
  }
]

// ... and 470 more files (download for full content)

About this extraction

This page contains the full source code of the ponfee/commons-core GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 670 files (3.3 MB), approximately 899.9k tokens, and a symbol index with 6451 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!