Full Code of youtongluan/sumk for AI

master 14bb16252228 cached
689 files
1.5 MB
427.9k tokens
4794 symbols
1 requests
Download .txt
Showing preview only (1,763K chars total). Download the full file or copy to clipboard to get everything.
Repository: youtongluan/sumk
Branch: master
Commit: 14bb16252228
Files: 689
Total size: 1.5 MB

Directory structure:
gitextract_rcvshosm/

├── CHANGELOG
├── LICENSE
├── README.md
├── async-logger/
│   ├── LICENSE
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       ├── slf4j/
│       │   │       │   ├── impl/
│       │   │       │   │   ├── StaticLoggerBinder.java
│       │   │       │   │   └── StaticMDCBinder.java
│       │   │       │   └── v2/
│       │   │       │       └── SumkServiceProvider.java
│       │   │       └── yx/
│       │   │           └── log/
│       │   │               └── impl/
│       │   │                   ├── CodeLine.java
│       │   │                   ├── CodeLineKit.java
│       │   │                   ├── DayRollingFileAppender.java
│       │   │                   ├── DefaultUnionLog.java
│       │   │                   ├── LeveledDayRollingFileAppender.java
│       │   │                   ├── LocalFileDao.java
│       │   │                   ├── LogAppendObserver.java
│       │   │                   ├── LogAppender.java
│       │   │                   ├── LogAppenderFactory.java
│       │   │                   ├── LogAppenders.java
│       │   │                   ├── LogHelper.java
│       │   │                   ├── LogObject.java
│       │   │                   ├── LogQueue.java
│       │   │                   ├── MonthRollingFileAppender.java
│       │   │                   ├── PlainOutput.java
│       │   │                   ├── PlainOutputImpl.java
│       │   │                   ├── RollingFileAppender.java
│       │   │                   ├── SumkLoggerFactory.java
│       │   │                   ├── SumkLoggerImpl.java
│       │   │                   ├── UnionLog.java
│       │   │                   ├── UnionLogDao.java
│       │   │                   ├── UnionLogObject.java
│       │   │                   ├── UnionLogObjectSerializer.java
│       │   │                   ├── UnionLogUtil.java
│       │   │                   └── UnionLogs.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── services/
│       │               └── org.slf4j.spi.SLF4JServiceProvider
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── test/
│           │           ├── ProxyLog.java
│           │           ├── Starter.java
│           │           └── UnionDemo.java
│           └── resources/
│               └── app.properties
├── pom.xml
├── sql.dtd
├── sumk-base/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── org/
│                   └── yx/
│                       ├── annotation/
│                       │   └── doc/
│                       │       ├── Comment.java
│                       │       └── NotNull.java
│                       ├── base/
│                       │   ├── Executable.java
│                       │   ├── ItemJoiner.java
│                       │   ├── Lifecycle.java
│                       │   ├── Ordered.java
│                       │   ├── StartOnceLifecycle.java
│                       │   ├── context/
│                       │   │   ├── ActionContext.java
│                       │   │   ├── AppContext.java
│                       │   │   └── LogContext.java
│                       │   ├── date/
│                       │   │   ├── DateAdapters.java
│                       │   │   ├── DateFormater.java
│                       │   │   ├── DateTimeFormater.java
│                       │   │   ├── DateTimeTypeAdapter.java
│                       │   │   ├── FullDateTimeFormater.java
│                       │   │   ├── SumkDateFormater.java
│                       │   │   ├── SumkDateQuery.java
│                       │   │   └── TimeUtil.java
│                       │   ├── matcher/
│                       │   │   ├── BooleanMatcher.java
│                       │   │   ├── InOutMatcher.java
│                       │   │   ├── Matchers.java
│                       │   │   └── WildcardMatcher.java
│                       │   ├── scaner/
│                       │   │   ├── ClassScaner.java
│                       │   │   ├── FileNameScaner.java
│                       │   │   └── JarFileUtil.java
│                       │   ├── sumk/
│                       │   │   ├── UnmodifiableArrayList.java
│                       │   │   ├── UnsafeByteArrayOutputStream.java
│                       │   │   ├── UnsafeStringWriter.java
│                       │   │   └── map/
│                       │   │       ├── ListEntrySet.java
│                       │   │       ├── ListMap.java
│                       │   │       └── UnmodifiableListMap.java
│                       │   └── thread/
│                       │       ├── PriorityRunnable.java
│                       │       ├── SumkExecutorService.java
│                       │       ├── ThreadPools.java
│                       │       └── ThresholdExecutor.java
│                       ├── conf/
│                       │   ├── AbsoluteXmlFilesLoader.java
│                       │   ├── AbstractFilesLoader.java
│                       │   ├── AbstractRefreshableSystemConfig.java
│                       │   ├── AppConfig.java
│                       │   ├── AppInfo.java
│                       │   ├── ClassPathXmlFilesLoader.java
│                       │   ├── ComposedConfig.java
│                       │   ├── Const.java
│                       │   ├── FileModifyTime.java
│                       │   ├── LocalMultiResourceLoaderSupplier.java
│                       │   ├── LocalhostUtil.java
│                       │   ├── MapConfig.java
│                       │   ├── MultiNodeConfig.java
│                       │   ├── MultiResourceLoader.java
│                       │   ├── RefreshableSystemConfig.java
│                       │   ├── SimpleBeanUtil.java
│                       │   ├── SystemConfig.java
│                       │   ├── SystemConfigHolder.java
│                       │   └── UrlSystemConfig.java
│                       ├── exception/
│                       │   ├── BizException.java
│                       │   ├── CodeException.java
│                       │   ├── SimpleSumkException.java
│                       │   ├── SoaException.java
│                       │   ├── SumkException.java
│                       │   └── SumkExceptionCode.java
│                       ├── log/
│                       │   ├── CodeLineMarker.java
│                       │   ├── ConsoleLog.java
│                       │   ├── DelegateLogger.java
│                       │   ├── Log.java
│                       │   ├── LogKits.java
│                       │   ├── LogLevel.java
│                       │   ├── LogSettings.java
│                       │   ├── Loggers.java
│                       │   ├── Logs.java
│                       │   ├── RawLog.java
│                       │   ├── SimpleLogger.java
│                       │   └── SumkLogger.java
│                       └── util/
│                           ├── BitUtil.java
│                           ├── CollectionUtil.java
│                           ├── ExceptionUtil.java
│                           ├── FileUtil.java
│                           ├── IOUtil.java
│                           ├── Loader.java
│                           ├── StringUtil.java
│                           ├── SumkDate.java
│                           ├── SumkThreadPool.java
│                           ├── Task.java
│                           └── UUIDSeed.java
├── sumk-db/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   └── db/
│           │           │       ├── AutoCreateTime.java
│           │           │       ├── Box.java
│           │           │       ├── Column.java
│           │           │       ├── SoftDelete.java
│           │           │       └── Table.java
│           │           └── db/
│           │               ├── DB.java
│           │               ├── DBJson.java
│           │               ├── SDB.java
│           │               ├── conn/
│           │               │   ├── CommonConfigFactory.java
│           │               │   ├── ConnectionPool.java
│           │               │   ├── DBCPDataSourceFactory.java
│           │               │   ├── DBConfig.java
│           │               │   ├── DBConfigFactory.java
│           │               │   ├── DSFactory.java
│           │               │   ├── DataSourceFactory.java
│           │               │   ├── DataSourceManager.java
│           │               │   ├── DataSourceManagerImpl.java
│           │               │   ├── DataSourceManagerSelector.java
│           │               │   ├── DataSources.java
│           │               │   ├── DefaultManagerSelector.java
│           │               │   ├── HookContext.java
│           │               │   ├── RouterFactory.java
│           │               │   ├── SqlSessionHook.java
│           │               │   ├── SumkConnection.java
│           │               │   ├── SumkDataSource.java
│           │               │   ├── WeightedDataSource.java
│           │               │   └── WeightedRouterFactory.java
│           │               ├── dao/
│           │               │   ├── AbstractCachable.java
│           │               │   └── CountedResult.java
│           │               ├── enums/
│           │               │   ├── CacheType.java
│           │               │   ├── ColumnType.java
│           │               │   ├── DBType.java
│           │               │   ├── TransactionType.java
│           │               │   ├── TxHook.java
│           │               │   └── ValidRecord.java
│           │               ├── event/
│           │               │   ├── DBEvent.java
│           │               │   ├── DBEventPublisher.java
│           │               │   ├── DeleteEvent.java
│           │               │   ├── EventLane.java
│           │               │   ├── InsertEvent.java
│           │               │   ├── ModifyEvent.java
│           │               │   ├── QueryEvent.java
│           │               │   └── UpdateEvent.java
│           │               ├── exec/
│           │               │   ├── BoxAopExecutorSupplier.java
│           │               │   ├── DBExecutor.java
│           │               │   ├── DBSource.java
│           │               │   ├── DBSources.java
│           │               │   ├── DBTransaction.java
│           │               │   └── DefaultDBSource.java
│           │               ├── kit/
│           │               │   ├── DBKits.java
│           │               │   └── SDBuilder.java
│           │               ├── listener/
│           │               │   ├── DeleteListener.java
│           │               │   ├── InsertListener.java
│           │               │   ├── SelectListener.java
│           │               │   └── UpdateListener.java
│           │               ├── log/
│           │               │   └── SimpleSqlLogImpl.java
│           │               ├── mapper/
│           │               │   ├── DBPlugin.java
│           │               │   ├── ForeachParser.java
│           │               │   ├── IFParser.java
│           │               │   ├── ItemsParser.java
│           │               │   ├── JoinerFactory.java
│           │               │   ├── NamedExecutor.java
│           │               │   ├── PureStringParser.java
│           │               │   ├── RawExecutor.java
│           │               │   ├── SqlHolder.java
│           │               │   ├── SqlParser.java
│           │               │   ├── SqlParsers.java
│           │               │   ├── SqlXmlBuilderFactory.java
│           │               │   └── SqlXmlParser.java
│           │               ├── monitor/
│           │               │   └── DBMonitor.java
│           │               ├── spec/
│           │               │   ├── BoxSpec.java
│           │               │   ├── ColumnSpec.java
│           │               │   ├── DBSpecs.java
│           │               │   └── TableSpec.java
│           │               ├── sql/
│           │               │   ├── AbstractOperationGroup.java
│           │               │   ├── AbstractSqlBuilder.java
│           │               │   ├── ColumnMeta.java
│           │               │   ├── ColumnOperation.java
│           │               │   ├── CompareOperation.java
│           │               │   ├── Count.java
│           │               │   ├── DBFactory.java
│           │               │   ├── DBFlag.java
│           │               │   ├── DBNameResolvers.java
│           │               │   ├── DBSettings.java
│           │               │   ├── DBSupplier.java
│           │               │   ├── DBSupplierImpl.java
│           │               │   ├── Delete.java
│           │               │   ├── EstimateVisitCounter.java
│           │               │   ├── GroupAND.java
│           │               │   ├── GroupOR.java
│           │               │   ├── InnerDelete.java
│           │               │   ├── Insert.java
│           │               │   ├── InsertResult.java
│           │               │   ├── MapedSql.java
│           │               │   ├── MapedSqlBuilder.java
│           │               │   ├── ModifySqlBuilder.java
│           │               │   ├── Operation.java
│           │               │   ├── PojoMeta.java
│           │               │   ├── PojoMetaHolder.java
│           │               │   ├── RawSqlBuilder.java
│           │               │   ├── Select.java
│           │               │   ├── SelectBuilder.java
│           │               │   ├── SoftDeleteMeta.java
│           │               │   ├── SoftDeleteParser.java
│           │               │   ├── SoftDeleteParserImpl.java
│           │               │   ├── SqlBuilder.java
│           │               │   ├── SqlLog.java
│           │               │   ├── TableBootWatcher.java
│           │               │   ├── Update.java
│           │               │   ├── VisitCounter.java
│           │               │   └── token/
│           │               │       ├── MapValueHandler.java
│           │               │       ├── MapedSqlTokenParser.java
│           │               │       ├── ReplaceTokenHandler.java
│           │               │       ├── StringTokenParser.java
│           │               │       └── VariableTokenHandler.java
│           │               ├── sumk/
│           │               │   └── batis/
│           │               │       ├── ConfigurationFactory.java
│           │               │       ├── ProxySession.java
│           │               │       ├── SqlSessionFactory.java
│           │               │       └── SqlSessionHolder.java
│           │               └── visit/
│           │                   ├── Exchange.java
│           │                   ├── MapResultHandler.java
│           │                   ├── PojoResultHandler.java
│           │                   ├── RecordAccess.java
│           │                   ├── RecordRepository.java
│           │                   ├── RedisAccess.java
│           │                   ├── ResultHandler.java
│           │                   ├── ResultSetUtils.java
│           │                   ├── SumkDbVisitor.java
│           │                   ├── SumkStatement.java
│           │                   └── Visitors.java
│           └── resources/
│               └── META-INF/
│                   ├── sql.dtd
│                   └── sumk.factories
├── sumk-framework/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   ├── Bean.java
│           │           │   ├── ConditionOnProperty.java
│           │           │   ├── Exclude.java
│           │           │   ├── ExcludeFromParams.java
│           │           │   ├── ExcludeFromResponse.java
│           │           │   ├── Inject.java
│           │           │   ├── Param.java
│           │           │   ├── Priority.java
│           │           │   └── spec/
│           │           │       ├── BeanSpec.java
│           │           │       ├── BuiltInParsers.java
│           │           │       ├── InjectSpec.java
│           │           │       ├── ParamSpec.java
│           │           │       ├── SpecParsers.java
│           │           │       └── Specs.java
│           │           ├── bean/
│           │           │   ├── BeanAssemblerBootWatcher.java
│           │           │   ├── BeanFieldFinder.java
│           │           │   ├── BeanKit.java
│           │           │   ├── BeanPool.java
│           │           │   ├── BeanProvider.java
│           │           │   ├── BeanRegistry.java
│           │           │   ├── Booter.java
│           │           │   ├── Boxed.java
│           │           │   ├── ComplexBean.java
│           │           │   ├── DefaultBeanFieldFinder.java
│           │           │   ├── FactoryBean.java
│           │           │   ├── IOC.java
│           │           │   ├── InnerIOC.java
│           │           │   ├── InnerProvider.java
│           │           │   ├── InterfaceBean.java
│           │           │   ├── NameSlot.java
│           │           │   ├── NamedBean.java
│           │           │   ├── ParallelBootWatcher.java
│           │           │   ├── Plugin.java
│           │           │   ├── PluginBooter.java
│           │           │   ├── aop/
│           │           │   │   ├── AopContext.java
│           │           │   │   ├── AopExecutor.java
│           │           │   │   ├── AopExecutorChain.java
│           │           │   │   ├── AopExecutorManager.java
│           │           │   │   ├── AopExecutorSupplier.java
│           │           │   │   ├── asm/
│           │           │   │   │   ├── AsmUtils.java
│           │           │   │   │   ├── MethodInfoClassVisitor.java
│           │           │   │   │   ├── MethodParamInfo.java
│           │           │   │   │   ├── MethodPojo.java
│           │           │   │   │   ├── ParamPojo.java
│           │           │   │   │   ├── ParamPojoClassFactory.java
│           │           │   │   │   ├── ParamPojos.java
│           │           │   │   │   ├── ParseParamsMethodVisitor.java
│           │           │   │   │   ├── ProxyClassLoader.java
│           │           │   │   │   ├── ProxyClassVistor.java
│           │           │   │   │   ├── ProxyMethodWritor.java
│           │           │   │   │   └── WriterHelper.java
│           │           │   │   └── context/
│           │           │   │       ├── CalleeNode.java
│           │           │   │       └── NodeContext.java
│           │           │   └── watcher/
│           │           │       ├── BeanCreateWatcher.java
│           │           │       ├── BeanInjectWatcher.java
│           │           │       └── BootWatcher.java
│           │           ├── common/
│           │           │   ├── Host.java
│           │           │   ├── Predicator.java
│           │           │   ├── StringEntity.java
│           │           │   ├── action/
│           │           │   │   ├── ActInfoUtil.java
│           │           │   │   ├── ActionStatis.java
│           │           │   │   ├── ActionStatisImpl.java
│           │           │   │   ├── ParamDescript.java
│           │           │   │   └── StatisItem.java
│           │           │   ├── expression/
│           │           │   │   ├── AndExpression.java
│           │           │   │   ├── Expressions.java
│           │           │   │   ├── HasKeyExpression.java
│           │           │   │   ├── MatchType.java
│           │           │   │   ├── NotEmptyExpression.java
│           │           │   │   ├── NotNullExpression.java
│           │           │   │   ├── OrExpression.java
│           │           │   │   └── SimpleExpression.java
│           │           │   ├── json/
│           │           │   │   ├── ByteArrayTypeAdapter.java
│           │           │   │   ├── GsonHelper.java
│           │           │   │   ├── GsonOperator.java
│           │           │   │   ├── JsonOperator.java
│           │           │   │   ├── JsonTypes.java
│           │           │   │   ├── ParamPojoTypeAdapter.java
│           │           │   │   ├── ParamPojoTypeAdapterFactory.java
│           │           │   │   └── ServerJsonExclusionStrategy.java
│           │           │   ├── listener/
│           │           │   │   ├── ConcurrentSumkListener.java
│           │           │   │   ├── EventBus.java
│           │           │   │   ├── EventBusFactory.java
│           │           │   │   └── SumkListener.java
│           │           │   ├── locale/
│           │           │   │   ├── I18n.java
│           │           │   │   ├── I18nBuilder.java
│           │           │   │   ├── I18nMessageProvider.java
│           │           │   │   └── I18nMessageProviderImpl.java
│           │           │   ├── lock/
│           │           │   │   ├── Lock.java
│           │           │   │   ├── Locked.java
│           │           │   │   ├── Locker.java
│           │           │   │   └── SLock.java
│           │           │   ├── monitor/
│           │           │   │   ├── MessageProvider.java
│           │           │   │   └── Monitors.java
│           │           │   ├── route/
│           │           │   │   ├── AbstractWeightedServer.java
│           │           │   │   ├── EmptyRouter.java
│           │           │   │   ├── Router.java
│           │           │   │   ├── Routes.java
│           │           │   │   ├── SingleRouter.java
│           │           │   │   ├── WeightedRouter.java
│           │           │   │   └── WeightedServer.java
│           │           │   ├── sequence/
│           │           │   │   ├── AbstractSeq.java
│           │           │   │   ├── LongTermSeqImpl.java
│           │           │   │   ├── Seq.java
│           │           │   │   ├── SeqCounter.java
│           │           │   │   ├── SeqHolder.java
│           │           │   │   ├── SeqImpl.java
│           │           │   │   └── SnowflakeCounter.java
│           │           │   ├── util/
│           │           │   │   ├── S.java
│           │           │   │   ├── SBuilder.java
│           │           │   │   ├── SeqUtil.java
│           │           │   │   ├── helper/
│           │           │   │   │   └── ArrayHelper.java
│           │           │   │   ├── kit/
│           │           │   │   │   ├── Asserts.java
│           │           │   │   │   ├── BeanConverter.java
│           │           │   │   │   ├── PriorityKits.java
│           │           │   │   │   └── TypeConverter.java
│           │           │   │   └── secury/
│           │           │   │       ├── AESEncryptor.java
│           │           │   │       ├── Base64.java
│           │           │   │       ├── Base64Impl.java
│           │           │   │       ├── CommonDigest.java
│           │           │   │       ├── Encryptor.java
│           │           │   │       └── Hasher.java
│           │           │   └── validate/
│           │           │       ├── AbstractParamInfo.java
│           │           │       ├── ComplexParamValidator.java
│           │           │       ├── FieldParameterHolder.java
│           │           │       ├── FieldParameterInfo.java
│           │           │       ├── InvalidParamException.java
│           │           │       ├── ManuParameterInfo.java
│           │           │       ├── ParamInfo.java
│           │           │       ├── ParameterInfo.java
│           │           │       ├── SimpleParamValidator.java
│           │           │       ├── Validator.java
│           │           │       └── Validators.java
│           │           ├── main/
│           │           │   ├── StartConstants.java
│           │           │   └── SumkServer.java
│           │           └── redis/
│           │               ├── Checkable.java
│           │               ├── Redis.java
│           │               ├── RedisChecker.java
│           │               ├── RedisConfig.java
│           │               ├── RedisCounter.java
│           │               ├── RedisFactory.java
│           │               ├── RedisLoader.java
│           │               ├── RedisPlugin.java
│           │               ├── RedisPool.java
│           │               ├── RedisSettings.java
│           │               ├── RedisType.java
│           │               ├── command/
│           │               │   ├── BinaryJedisCommand.java
│           │               │   ├── JedisCommand.java
│           │               │   ├── MultiKeyCommand.java
│           │               │   └── ScriptingCommand.java
│           │               └── v3/
│           │                   ├── AbstractJedisExecutor.java
│           │                   ├── AbstractRedis.java
│           │                   ├── JedisExecutor.java
│           │                   ├── Redis3Factory.java
│           │                   ├── Redis3Kit.java
│           │                   ├── Redis3x.java
│           │                   ├── RedisCluster.java
│           │                   ├── RedisImpl.java
│           │                   ├── SentinelJedisExecutor.java
│           │                   └── SingleJedisExecutor.java
│           └── resources/
│               └── META-INF/
│                   ├── lua_del
│                   └── sumk.factories
├── sumk-http/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   └── http/
│           │           │       ├── SumkFilter.java
│           │           │       ├── SumkServlet.java
│           │           │       ├── Upload.java
│           │           │       └── Web.java
│           │           └── http/
│           │               ├── HttpEncryptor.java
│           │               ├── HttpErrorCode.java
│           │               ├── HttpHeaderName.java
│           │               ├── HttpJson.java
│           │               ├── HttpPlugin.java
│           │               ├── MessageType.java
│           │               ├── Signer.java
│           │               ├── WebFilter.java
│           │               ├── WebUtil.java
│           │               ├── act/
│           │               │   ├── AbstractActionInfo.java
│           │               │   ├── ActNameResolver.java
│           │               │   ├── HttpActionInfo.java
│           │               │   ├── HttpActionNode.java
│           │               │   ├── HttpActions.java
│           │               │   ├── IgnoreNameActionInfo.java
│           │               │   └── PrefixMappingActionInfo.java
│           │               ├── handler/
│           │               │   ├── AbstractHttpHandler.java
│           │               │   ├── Base64DecodeHandler.java
│           │               │   ├── Base64EncodeHandler.java
│           │               │   ├── DecryptHandler.java
│           │               │   ├── EncryptHandler.java
│           │               │   ├── HttpHandler.java
│           │               │   ├── HttpHandlerChain.java
│           │               │   ├── InvokeHandler.java
│           │               │   ├── MultiItemImpl.java
│           │               │   ├── MultipartHandler.java
│           │               │   ├── MultipartHolder.java
│           │               │   ├── MultipartItem.java
│           │               │   ├── ReqDataHandler.java
│           │               │   ├── ReqSignValidateHandler.java
│           │               │   ├── ReqToStringHandler.java
│           │               │   ├── ReqUserHandler.java
│           │               │   ├── RespBodyHandler.java
│           │               │   ├── RespToStringHandler.java
│           │               │   ├── RestType.java
│           │               │   ├── ToBytesHandler.java
│           │               │   └── WebContext.java
│           │               ├── invoke/
│           │               │   ├── WebHandler.java
│           │               │   ├── WebVisitor.java
│           │               │   └── WebVisitorImpl.java
│           │               ├── kit/
│           │               │   ├── DefaultHttpEncryptor.java
│           │               │   ├── DefaultHttpKit.java
│           │               │   ├── HttpCiphers.java
│           │               │   ├── HttpKit.java
│           │               │   ├── HttpSettings.java
│           │               │   ├── InnerHttpUtil.java
│           │               │   └── LocalWebContext.java
│           │               ├── log/
│           │               │   ├── HttpLogHandler.java
│           │               │   ├── HttpLogs.java
│           │               │   └── PlainHttpLogHandler.java
│           │               ├── monitor/
│           │               │   └── HttpMonitors.java
│           │               ├── select/
│           │               │   ├── DefaultHttpActionSelector.java
│           │               │   └── HttpActionSelector.java
│           │               ├── server/
│           │               │   ├── AbstractActionServer.java
│           │               │   ├── AbstractCommonHttpServlet.java
│           │               │   ├── DocumentServlet.java
│           │               │   ├── HttpMethod.java
│           │               │   ├── MultipartServer.java
│           │               │   ├── RestServer.java
│           │               │   └── SumkMonitor.java
│           │               ├── spec/
│           │               │   ├── HttpSpecs.java
│           │               │   ├── SumkFilterSpec.java
│           │               │   ├── SumkServletSpec.java
│           │               │   ├── UploadSpec.java
│           │               │   └── WebSpec.java
│           │               ├── start/
│           │               │   ├── JettyHandlerSupplier.java
│           │               │   ├── JettyHttpsServer.java
│           │               │   ├── JettyServer.java
│           │               │   ├── JettyServerConnector.java
│           │               │   ├── SumkLoaderListener.java
│           │               │   └── WebAnnotationResolver.java
│           │               └── user/
│           │                   ├── AbstractLoginServlet.java
│           │                   ├── AbstractUserSession.java
│           │                   ├── CacheHelper.java
│           │                   ├── HttpLoginWrapper.java
│           │                   ├── HttpSessionFactory.java
│           │                   ├── LocalUserSession.java
│           │                   ├── LoginObject.java
│           │                   ├── LoginServlet.java
│           │                   ├── RemoteUserSession.java
│           │                   ├── SessionObject.java
│           │                   ├── TimedCachedObject.java
│           │                   ├── UserSession.java
│           │                   └── WebSessions.java
│           └── resources/
│               └── META-INF/
│                   ├── http/
│                   │   └── listeners
│                   └── sumk.factories
├── sumk-rpc/
│   ├── LICENSE
│   ├── pom.xml
│   ├── rpc.md
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   └── rpc/
│           │           │       ├── Soa.java
│           │           │       ├── SoaClass.java
│           │           │       └── SoaClientConfig.java
│           │           └── rpc/
│           │               ├── BusinessHandler.java
│           │               ├── Profile.java
│           │               ├── RpcErrorCode.java
│           │               ├── RpcJson.java
│           │               ├── RpcSettings.java
│           │               ├── RpcUtil.java
│           │               ├── client/
│           │               │   ├── AbstractRpcFuture.java
│           │               │   ├── AbstractTransportClient.java
│           │               │   ├── Client.java
│           │               │   ├── ClientHandler.java
│           │               │   ├── ErrorRpcFuture.java
│           │               │   ├── HostChecker.java
│           │               │   ├── LockHolder.java
│           │               │   ├── ParamType.java
│           │               │   ├── Req.java
│           │               │   ├── Rpc.java
│           │               │   ├── RpcCallInfo.java
│           │               │   ├── RpcFuture.java
│           │               │   ├── RpcFutureImpl.java
│           │               │   ├── RpcLocker.java
│           │               │   ├── RpcResult.java
│           │               │   ├── TransportClientHolder.java
│           │               │   └── intf/
│           │               │       ├── IntfClientHandler.java
│           │               │       ├── InvocationHandlerFactory.java
│           │               │       ├── SoaClientFactory.java
│           │               │       └── SoaClientPlugin.java
│           │               ├── codec/
│           │               │   ├── AbstractDataBuffer.java
│           │               │   ├── CodecKit.java
│           │               │   ├── DataStream.java
│           │               │   ├── Protocols.java
│           │               │   ├── ReqParamType.java
│           │               │   ├── Request.java
│           │               │   ├── StreamAble.java
│           │               │   ├── decoders/
│           │               │   │   ├── DataDecoder.java
│           │               │   │   ├── RequestDecoder.java
│           │               │   │   └── ResponseDecoder.java
│           │               │   └── encoders/
│           │               │       ├── AbstractEncoder.java
│           │               │       ├── DataEncoder.java
│           │               │       └── StreamAbleEncoder.java
│           │               ├── context/
│           │               │   ├── InnerRpcUtil.java
│           │               │   ├── RpcActionNode.java
│           │               │   └── RpcActions.java
│           │               ├── data/
│           │               │   ├── ApiProfile.java
│           │               │   ├── RouteDataOperator.java
│           │               │   ├── RouteDataOperatorImpl.java
│           │               │   ├── RouteDataOperators.java
│           │               │   ├── RouteInfo.java
│           │               │   └── RoutePathData.java
│           │               ├── log/
│           │               │   ├── PlainRpcLogHandler.java
│           │               │   ├── RpcLog.java
│           │               │   ├── RpcLogHandler.java
│           │               │   └── RpcLogs.java
│           │               ├── monitor/
│           │               │   ├── RpcActionProvider.java
│           │               │   └── RpcMonitor.java
│           │               ├── netty/
│           │               │   ├── DefaultChannelInitializerSupplier.java
│           │               │   ├── NettyChannel.java
│           │               │   ├── NettyClient.java
│           │               │   ├── NettyConfigSetter.java
│           │               │   ├── NettyDataBuffer.java
│           │               │   ├── NettyDecoder.java
│           │               │   ├── NettyEncoder.java
│           │               │   ├── NettyHandler.java
│           │               │   ├── NettyKit.java
│           │               │   ├── NettyServer.java
│           │               │   ├── NettyTransportFactory.java
│           │               │   └── NettyWriteFuture.java
│           │               ├── registry/
│           │               │   ├── RegistryConst.java
│           │               │   ├── RegistryFactory.java
│           │               │   ├── client/
│           │               │   │   ├── RegistryClient.java
│           │               │   │   ├── RouteEvent.java
│           │               │   │   ├── RouteEventType.java
│           │               │   │   ├── RouterHolder.java
│           │               │   │   ├── RpcRoutes.java
│           │               │   │   └── WeightedHost.java
│           │               │   ├── server/
│           │               │   │   ├── RegistryHelper.java
│           │               │   │   └── RegistryServer.java
│           │               │   └── zookeeper/
│           │               │       ├── SimpleZkSerializer.java
│           │               │       ├── ZKSystemConfig.java
│           │               │       ├── ZkClientHelper.java
│           │               │       ├── ZkRegistryClient.java
│           │               │       ├── ZkRegistryFactory.java
│           │               │       └── ZkRegistryServer.java
│           │               ├── server/
│           │               │   ├── LocalRequestHandler.java
│           │               │   ├── LocalRpcContext.java
│           │               │   ├── RequestHandler.java
│           │               │   ├── Response.java
│           │               │   ├── RpcContext.java
│           │               │   ├── RpcFilter.java
│           │               │   ├── ServerHandler.java
│           │               │   ├── SoaPlugin.java
│           │               │   ├── impl/
│           │               │   │   ├── JsonedParamReqHandler.java
│           │               │   │   ├── OrderedParamReqHandler.java
│           │               │   │   ├── RpcHandler.java
│           │               │   │   └── ServerExceptionHandler.java
│           │               │   └── start/
│           │               │       ├── SoaAnnotationResolver.java
│           │               │       ├── SoaClassResolver.java
│           │               │       ├── SoaClassResolverImpl.java
│           │               │       ├── SoaNameResolver.java
│           │               │       ├── SoaNameResolverImpl.java
│           │               │       └── SoaServer.java
│           │               ├── spec/
│           │               │   ├── RpcSpecs.java
│           │               │   ├── SoaClassSpec.java
│           │               │   ├── SoaClientConfigSpec.java
│           │               │   └── SoaSpec.java
│           │               └── transport/
│           │                   ├── DataBuffer.java
│           │                   ├── RpcWriteFuture.java
│           │                   ├── RpcWriteListener.java
│           │                   ├── TransportChannel.java
│           │                   ├── TransportClient.java
│           │                   ├── TransportFactory.java
│           │                   ├── TransportServer.java
│           │                   └── Transports.java
│           └── resources/
│               └── META-INF/
│                   └── sumk.factories
├── sumk-rpc-mina/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── yx/
│       │   │           └── rpc/
│       │   │               └── mina/
│       │   │                   ├── MinaChannel.java
│       │   │                   ├── MinaClient.java
│       │   │                   ├── MinaDataBuffer.java
│       │   │                   ├── MinaHandler.java
│       │   │                   ├── MinaKit.java
│       │   │                   ├── MinaProtocolDecoder.java
│       │   │                   ├── MinaProtocolEncoder.java
│       │   │                   ├── MinaServer.java
│       │   │                   ├── MinaTransportFactory.java
│       │   │                   └── MinaWriteFuture.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── sumk.factories
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── test/
│           │           ├── Main.java
│           │           ├── RpcPressTest.java
│           │           ├── RpcTest.java
│           │           ├── inner/
│           │           │   └── pojo/
│           │           │       ├── DemoUser.java
│           │           │       └── Multikey.java
│           │           └── soa/
│           │               ├── demo/
│           │               │   └── EchoAction.java
│           │               └── server/
│           │                   └── SOAServer.java
│           └── resources/
│               └── app.properties
└── sumk-test/
    ├── LICENSE
    ├── pom.xml
    ├── src/
    │   └── test/
    │       ├── java/
    │       │   └── org/
    │       │       └── test/
    │       │           ├── Main.java
    │       │           ├── client/
    │       │           │   ├── HttpAesClientTest.java
    │       │           │   ├── HttpPlainClientTest.java
    │       │           │   ├── HttpPressTest.java
    │       │           │   ├── RpcPressTest.java
    │       │           │   └── RpcTest.java
    │       │           ├── inner/
    │       │           │   ├── dao/
    │       │           │   │   ├── DemoUserDao.java
    │       │           │   │   ├── DemoUserDaoImpl.java
    │       │           │   │   ├── DemoUserMybatisDao.java
    │       │           │   │   ├── LocalSqlDao.java
    │       │           │   │   └── MultikeyDao.java
    │       │           │   ├── po/
    │       │           │   │   ├── DemoUser.java
    │       │           │   │   └── Multikey.java
    │       │           │   ├── soa/
    │       │           │   │   ├── demo/
    │       │           │   │   │   └── EchoAction.java
    │       │           │   │   └── server/
    │       │           │   │       └── SOAServer.java
    │       │           │   └── web/
    │       │           │       ├── client/
    │       │           │       │   └── Encrypt.java
    │       │           │       └── demo/
    │       │           │           ├── AesTestServer.java
    │       │           │           ├── DBDemo.java
    │       │           │           ├── DemoSessionObject.java
    │       │           │           ├── MyLoginServlet.java
    │       │           │           └── PlainServer.java
    │       │           ├── orm/
    │       │           │   ├── BaseOrmTest.java
    │       │           │   ├── MultiPrimaryTest.java
    │       │           │   ├── SinglePrimaryTest.java
    │       │           │   └── SqlTest.java
    │       │           └── token/
    │       │               ├── MapedSqlTokenParserTest.java
    │       │               └── StringTokenParserTest.java
    │       └── resources/
    │           ├── app.properties
    │           └── sql/
    │               ├── test.xml
    │               └── user/
    │                   └── demo.xml
    └── test.sql

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

================================================
FILE: CHANGELOG
================================================
v2.3.1
1、将JsonUtil改为S.json
2、sdb和mybatis的配置文件可以打包到jar中

v2.3.2
1、增加jetty端口被占用时的重试功能,默认重试将近2分钟。通过http.bind.retry=0可以关闭重试功能。
2、sdb的xml配置文件中,dtd不再通过网络获取。
3、去掉MD5Util和S.md5,增加S.hasher
4、去掉EncryUtil,增加S.encryptor

v2.3.3
1、增加redis的存活检测,在redis无法连接的时候,快速失败。
2、增加工具类S.beans的方法

v2.3.4
1、增加RedisConfig工具类
2、因为Observer接口从java9开始被标注为不推荐使用。所以AppInfo中使用Consumer代替Observer接口
3、增加SimpleLogger接口和SimpleLoggerHolder类。这个是配置等跟日志同级的模块使用的
4、允许soa和web使用自定义的线程池
5、重构主键生成的代码
6、支持在微服务中配置随机端口。端口值为0表示随机端口
7、修复鹰眼跟踪的bug
8、将分布式锁的入口改到S类中

v2.3.5
1、修复日志级别的一个bug
2、修改分布式锁的类名称

v2.3.6
1、修复orm事件的bug

v2.3.7
1、限制rest接口只支持get和post,其中get方法仅用于测试,它有可能使用浏览器缓存
2、将Base64Util改为S.base64,并且修改了工具类S中许多工具的名称
3、ThreadContext改名为ActionContext

v2.3.8
1、去掉对dbcp2连接池的硬编码依赖
2、几个名称微调
3、将日志的代码行参数默认值改为true

v2.3.9
1、AbstractSessionServlet改名为AbstractLoginServlet,并且添加了一个方法
2、整理日志的模块名
3、去掉Log.printStack(Throwable e)方法
4、Transaction的NORMAL改名为REQUIRED,EMBED改名为REQUIRES_NEW

v2.4.0
1、在配置文件中,soa开头的改为sumk.rpc开头。http开头的改为sumk.http开头
2、将RedisCallBack等单方法的接口改为java自带的接口
3、md5的结果从原来的大写方式改为小写方式

v2.4.1
1、将Class.newInstance()改为使用构造器初始化,这是因为java12开始,该方法被列为不推荐使用
2、http和微服务的名称支持逗号分隔
3、日志level的分隔符,从原来的逗号扩展到逗号和分号都可以

v2.4.2
1、S.base64增加2个小方法
2、SystemConfig.keys()的返回值,从Collection改为Set

v2.5.0
1、ORM去掉了withnull属性,改为自动判断。如果开发者传递的参数是pojo对象,会将pojo中null字段排除掉,如果传递的是map,其中的null字段会被保留。比如作为where条件,它将会作为IS NULL条件
2、ORM中的update去掉根据redis主键更新的方法
3、S.bean去掉无参的beanToMap方法。
4、Plugin接口的stop方法提供默认方法。
5、HttpUtil增加获取request和response的方法
6、优化字节码处理

v2.5.1
1、优化分布式session的存取性能
2、去掉http对redis的显式依赖
3、去掉session中对象的修改功能
4、去掉session根据不同客户端类型定制超时时间的功能

v2.5.2
1、去掉sumk.log.type参数,如果要切换日志类型需要手工调用api(这个是冷门需求)
2、将app.properties的获取机制简单化

v2.5.3
1、将HttpUtil改名为WebUtil
2、允许动态调整核心线程池的容量
3、去掉SimpleBizException类,将BizException的构造方法改为私有,改为使用create方法创建

v2.6.0
1、重构数据库连接的获取方式,增加读连接的升级功能
2、提供默认的微服务日志

v2.6.1
1、优化微服务的日志
2、数据库连接AutoCommit的控制从连接池改为框架内置控制
3、去掉了Cached注解及相关功能

v2.6.2
1、按参数顺序调用的Rpc接口,允许接口发布后再添加参数
2、限制日志body的长度,默认1000,后面用省略号替代

v2.6.3
1、SumkDate的毫秒时间,允许末尾的0省略掉(如果全是0,保留1个就行)
2、系统启动的时候,将原来一些同步启动的方法改为异步多线程启动,加快启动速度
3、改进本机ip的获取方式

v2.6.4
1、Select增加不等于比较符

v2.6.5
1、 select增加对IS NOT NULL的支持
2、修改web和rpc拦截器接口的定义
3、添加web是否支持get请求的开关
4、将后台任务线程改为正常模式,然后去除了SumkServer.main()的无限阻塞
5、添加web接口名是否大小写敏感的开关,默认铭感。

v2.6.6
1、优化http的日志功能

v2.6.7
1、http允许开发者指定默认接口,如果接口找不到就会进入该接口
2、允许通过sumk.redis.disconnect.null配置,指定在redis服务器异常的时候,是抛异常还是返回null
3、通过sumk.redis.conf.**来配置redis连接池的默认属性

v2.7.0
1、精简redis接口,并去掉与jedis包的直接耦合
2、修改redis的配置方式
3、优化日志级别判定的性能
4、对依赖包的版本做了一次集体升级

v2.7.1
1、修复sumk-log与spring boot、阿波罗配置中心一起使用时,spring日志的堆栈溢出问题

v2.7.2
1、在2.7.0中,将jedis升级到2.10.x后,之前版本的jedis需要手工构建JedisPool对象。现修复这个问题
2、@Box事务支持AutoCommit模式
3、只是Pojo使用byte[]和String映射Blob和Clob类型
4、修改@Column、@Param的一些属性名称

v2.7.3
1、增加工具类M,一般用于消息提示,通过与AppInfo的搭配,也可以实现国际化的目的
2、增加@RequestBody注解,用于支持http的流传输
3、去掉了http的客户类型功能(即@Web的type),因为这个功能感觉很鸡肋
4、增加类似dubbo那种,直接用接口注册和调用的微服务。目前对泛型返回值支持不好,如有需要,需借助JsonTypes工具


v2.7.5
1、可以统一对http服务的出错信息进行定制
2、当s.log.xxx的配置只有一个路径时,path:这个前缀可以省略
3、当web服务没有定义入参的时候,可以通过HttpServletRequest的InputStream来读取输入流

v.2.7.6
1、将工具类S的属性改为方法
2、AES默认加密方式改为CBC
3、默认的配置管理增加对System参数的读取,但不监听System中参数的变更

v2.7.7
1、新增@CreateTime注解,它的作用是新增记录的时候,会自动传入创建时间,并且与id保持一致
2、统一日志独立为特殊日志,并且有纯配置方式改为代码与配置相结合的方式
3、优化了日志输出的方式
4、优化了作业调度并提供Task类
5、redis支持原生cluster模式
6、去掉了groupId。appId使用分隔符方式可以起到groupId一样的效果

v2.7.8
1、增加慢sql的耗时日志

v2.7.9
1、SDB的xml增加items标签
2、SDB增加builder方法

v2.8.0
1、rpc的协议做了变更,不能与2.8之前的微服务进行交互
2、优化SumkDate性能
3、WebFileter和RpcFilter调用下一个Filter方法改为callNextFilter
4、Redis增加mute()方法,调用之后,如果发生异常,会用null来代替抛出异常

v2.8.1
1、文件上传改为基于servlet3的MultiPart模式,而不是commons-upload。同时去掉对commons-upload的依赖。相应的,WebUtil的getUploadFiles()改名为getMultiParts,UploadFile类改为MultipartItem
2、StreamUtil的extractData改名为readAllBytes

v2.8.2
1、@Web的requestEncrypt改为requestType,responseEncrypt改为responseType。对应的EncryptType类型改名为MessageType,NONE属性改名为PLAIN,AES改名为ENCRYPT
2、去掉@ErrorHandler,这个用法较冷门,通过WebFilter接口也能轻松实现
3、LoginObject的error方法改名为fail
4、提供加密接口的明文调试功能

v2.8.3
1、sumk.http.fusing支持头尾*匹配,并且放宽对接口书写格式的要求
2、移除CollectionUtil.unmodifyList()方法移除第二个参数
3、SDB的selectOne改名为queryOne
4、@CreateTime改名为@AutoCreateTime,并且无论是否主键是自动生成的,该注解都生效
5、Select的byPrimaryId方法改名为byDatabaseId
6、DBType和TransactionType改了下包名位置
7、web响应增加s-trace头部,它用于跟踪日志

v2.8.4
1、统一日志增加sumk.unionlog.exclude参数,并修复异常信息打印的问题
2、增加SumkExceptionCode接口,用于定义一些重要的框架异常码,方便开发者提示错误信息

v2.8.5
1、s.log.day等日志配置增加exclude过滤条件
2、@Param参数增加对空字符串的过滤

v2.9.0
1、zk和http方式的统一配置支持多节点模式
2、http错误码由原来的499改为550
3、个别地方性能优化

v2.9.1
1、DB部分更新支持字段为null
2、支持设置用户session最长的存活时间

v2.9.2
1、登录时的加密key改为通过header传递
2、修复Select中缓存跟数据库数据重复的bug
3、lock增加动态设置锁超时的功能
4、@Web添加tags属性 

v2.9.3
1、SumkDate支持在DB和SDB中使用,但不支持mbatis、hibernate等外置数据库操作
2、支持使用配置的方式替代@SoaClass注解
3、S.bean()支持日期类型、数字类型的模糊匹配
4、@Web添加method属性
5、SumkServer.main增加class参数,以支持sumk.jar和工程代码不在一个classloader里

v2.9.4
1、@Param支持pojo以及数组方式
2、BizException允许通过配置输出堆栈
3、WebUtil和RpcUtil提供所有参数组成的map,并且map的遍历顺序与参数顺序一致
4、通过sumk.db.default可以配置默认的数据库名称
5、修改SDB的包名

v2.9.5
1、SDB的count改为返回long
2、s.http.response.header.开头的配置会被添加到web的响应header中

v2.9.6
1、将@Web的requireLogin默认值改为true,但是默认禁用,要配置sumk.http.login.enable=1才能启用

v2.9.7
1、StreamUtil改名为IOUtil
2、@Inject去掉beanClz()和handler()
3、接口文档增加一级属性的模糊搜索功能,比如name用_name=XX来搜索
4、微服务增加发送失败自动重发的机制
5、修改StartConstants和StartContext的包名

v2.9.8
1、增加@ExcludeInParams和@ExcludeInResponse,它用来标识dto中非参数字段或不是用于返回的字段。在web和rpc中都有效
2、允许pojo中存在跟@SoftDelete同名的字段,以达到复用软删除标识位的目的。这种情况下,往往只有一种状态是标识删除,其它状态都是非删除的
3、去掉sumk.db.default参数,增加s.alias.db.{name}参数
4、BeanPropertiesWatcher接口改名为BeanInjectWatcher

v2.9.9
1、支持对配置中的redis密码进行加密
2、http接口支持名称相同,但是http方法不同的情况,并且支持接口的前缀匹配。对于前缀匹配的情况,WebUtil.getUrlLeft()可以获取剩下的url内容
3、SumkException的状态码全部改为负数,以跟BizException进行区分
4、将redis和数据库的初始化移到Plugin的prepare阶段,同时去掉Plugins类。修改之后,startAsyn阶段的数据库和redis都已经准备好了,不需要再用Plugins来判断

v2.9.10
1、对于常见的注解,使用相应Spec将它包装起来,以支持自定义注解。同时移除HttpActionNode的web()方法,upload()也改为返回UploadSpec

v2.9.11
1、接口方式的rpc调用,如果返回值是泛型,不再需要手工调用JsonTypes进行注册
2、去掉@Param的custom属性,但是保留ParamSpec的custom属性,开发者可以通过这里的custom进行扩展

v2.9.12
1、添加BootWatcher接口,该接口允许在IOC启动前做一些操作
2、DB添加commit和rollback两个hook
3、增加对数据源的操作统计

v2.10.0
1、使用字节码等方式替换原有的http、rpc入参解析方式,减少反射引起动态生成class类
2、CalleeNode中的部分以arg开头的方法,改名为param开头,去掉isEmptyArgument方法,增加paramLength方法
3、微服务支持sumk.zkurl不配置(服务端和客户端都支持),这时候的rpc只能调用本进程里的微服务接口
4、DB钩子(hook)增加ON_COMMIT和CLOSED两种,并且入参从Runable改为Consumer
5、增加sumk.db.name.lowercase参数,用于将默认的表名和字段名改为小写,自定义名称不受本参数影响。这个原先需要通过注入自定义的实现类来实现
6、数据库selec类增加in方法,并且允许同一种比较出现两次,比如: name != '张三' and name != '李四'

v2.10.1
1、Select增加notIn方法,用于sql中的not in()
2、简单的in查询、selectColumns指定查询列也都能使用缓存了
3、RecordRepository的包名改为org.yx.db.visit
4、除了默认的redis缓存外,还允许自定义缓存实现类
5、修改AbstractCachable的cacheEnable方法,这个只在自动生成的代码(sumk-codetool)里使用
6、@Bean增加辅助注解@ConditionOnPropert,支持组合关系:并且(用,或&&分隔)以及或者(用||分隔)。其中onMatch属性用来做取反操作
7、改进SumkDate转String的性能

v2.10.2
1、Select的offset、limit增加最大值1万的限制。可以通过代码突破这个限制。这意味着开发人员知道该语句比较耗性能
2、细节优化以提升性能或降低内存使用。比如用List或数组替代map,将一些计数器从Atomic类型改为普通类型等
3、提供监听器功能。监听器实现SumkListener接口,然后使用相应的EventBus发布事件。sumk-server-demo工程中InfoListener是它的使用例子
4、去掉DBEventListener接口,使用SumkListener改写数据库事件监听。sumk-server-demo工程中TableListener是它的使用例子
5、@Inject增加value属性,该属性强制指定注入bean的名称
6、去掉RedisUtil工具类(基本也用不到),增加Redis2接口

v3.0.0
1、Redis2接口改为Redis3x,并增加增加发布订阅方法。依赖的jedis从2.x升级到3.7.0
2、监听器增加异步功能,同时支持异步发布事件以及异步监听两种模式
3、配置文件的sumk.jetty开头的配置改为sumk.webserver开头
4、列表为基础的Map替代HashMap作为小Map使用,以压缩内存的的占用。从SBuilder.listMap()可以获取到
5、slf4j支持\\{}转义
6、除data外,其它http rest请求的paramter名称都在前面加_,比如sign改为_sign,这些参数不常用
7、重构rpc的序列化协议,并把mina改为netty。mina的支持移到sumk-rpc-mina项目中
8、升级了许多依赖包的版本,这些依赖包用原来的版本也是兼容的

与2.x不兼容的地方
1、两者的rpc协议不同,不能互相通信
2、http的sign、act、plainKey参数前面增加了_
3、Redis2接口改为Redis3x

v3.0.1
1、去掉Attachable接口,RpcUtil.attachments()改为RpcUtil

v3.1.0
最主要的是将rpc透传数据的最大长度从255提升到60K,这个造成微服务跟旧版不兼容(无透传时仍然可以调用)
1、@Inject增加allowMulti属性,允许存在多个bean的情况下,取第一个注入
2、Select增加and方法,可以处理or表达式,也可以处理自定义的比较表达式
3、去掉Select的addEquals方法(此方法意义不大,增加理解成本),开发者通过多次调用addEqual来实现
4、优化DB代码,减少中间过程内存的使用量,并优化sql语句中的空格。不等号统一改为<>

v3.1.1
1、UserSession的loadUserObject()改名为loadAndRefresh(),这个方法开发者一般也很少用到
2、增加Const.LISTENER_DB_MODIFY_ON_COMMIT类型监听器,它在事务提交前监听,能够操作数据库
3、ModifyEvent可以获取被影响条数,并且支持boolean类型的传参

v3.1.2
1、增加BeanProvider接口,IOC通过BeanProvider获取bean。方便与Spring等第三方IOC对接

v3.2.0
1、异常码从int类型改为String类型(int方式入参仍保留)。旧用户在客户端升级前,可通过sumk.http.interrorcode=1让返回值使用int方式
2、允许自定义数据库事务的实现
3、BizException的堆栈信息改为默认打印,可以通过sumk.bizexception.fullstack=0来关闭

v4.0.0
1、增加aop拦截器
2、将sumk工程拆分为base、framewrok、db、http、rpc五个工程,加上早就分出去的async-logger、sumk-rpc-mina,总共7个

v4.0.1
1、取消SumkException的code为负数的限制,并且将内置的负数改为正数

v4.0.2
1、新增对国际化的支持,主要类是I18n,并去掉工具类M。web和rpc对locale的解析和设置需要自己通过filter去实现
2、优化日志实现

v4.1.0
1、框架初始化改为多线程并行初始化,加快启动速度
2、支持自定义注册中心,内置注册中心还是zk
3、修改内置的分布式主键生成器,旧项目请在配置文件中添加sumk.seq.version=1

v4.2.0
1、添加sumk.factories,提供更加丰富的扩展支持
2、支持SumkServer.start(xx.class,xx)的方式扫描包路径,不需要显示配置sumk.ioc
3、zookeeper和jetty的依赖包版本升级
4、app.properties支持行尾\作为跨行连接符,这个跟Properties标准文件一致。它们最大的区别在于app.properties不支持转义字符

v4.2.1
1、slf4j支持2.x版本

================================================
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 youtongluan (\u6e38\u901a\u92ae\uff0c\u522b\u540d\uff1a\u6e38\u590f)

   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
================================================
# sumk

sumk是为互联网而生的,在性能、分布式、扩展性等方面考虑较多,互联网常见的特性很多都内置支持,比如数据库读写分离、调用链跟踪、统一日志等,与spring体系相比,sumk更轻量、性能更高、内存消耗更低。以下是主要工程介绍,具体功能参见[sumk的功能特性](https://p2nwdvhb36.feishu.cn/docx/LQxXdjwbdoWDrFxcyUTcNWTUnSh)

- sumk-base:配置管理和日志接口

- sumk-framework:核心框架,主要是IOC

- sumk-db:数据库功能,包括事务、ORM等

- sumk-http:mvc组件

- Sumk-rpc:微服务功能

- sumk-rpc-mina:可选组件,如果引入该组件,rpc底层就会使用mina替代netty

- async-logger(又名sumk-log):slf4j日志的实现,同时支持鹰眼跟踪和统一日志。
  
  

### 功能介绍

[sumk总体介绍](https://p2nwdvhb36.feishu.cn/docx/AEIhdF4M5oDXouxdfNLc0ya2nZb)

[sumk功能特性](https://p2nwdvhb36.feishu.cn/docx/LQxXdjwbdoWDrFxcyUTcNWTUnSh)

### 使用

[sumk框架入门](https://p2nwdvhb36.feishu.cn/docx/AOl0dhDqJoymnSxuWUhcTQ1SnMf)

[注解及接口及工具类](https://p2nwdvhb36.feishu.cn/docx/UuIPduSDuo6kSlxSOEDcGzdPnSh)

[sumk常用配置](https://p2nwdvhb36.feishu.cn/docx/RUBidOGQboZTkaxGJ8uc1Z93n8c)

[sumk-db使用介绍](https://p2nwdvhb36.feishu.cn/docx/TQnUdmM1YomahpxVIKMcxPdYnFc)

[接口文档及状态信息查看](https://p2nwdvhb36.feishu.cn/docx/ZvV3dCbLuog5wfxoSAgcV6frnvc)

### 示例工程

<https://github.com/youtongluan/sumk-server-demo>

### 

### 作者:游夏。QQ:3205207767


================================================
FILE: async-logger/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 youtongluan (\u6e38\u901a\u92ae\uff0c\u522b\u540d\uff1a\u6e38\u590f)

   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: async-logger/README.md
================================================
# sumk-log
&emsp;&emsp;async-logger是一款基于slf4j标准的日志系统。它的特点是高效、异步、支持配置中心统一配置,拥有鹰眼跟踪与统一日志等功能。它的前身名叫sumk-log

### 引入sumk-log.jar
```
<dependency>
    <groupId>com.github.youtongluan</groupId>
    <artifactId>async-logger</artifactId>
    <version>3.2.0</version>
</dependency>
```
最新版本请查看maven中央库。

### 配置说明(大多数配置都不需要重启系统):


#### sumk.log.level=info,XX:debug,X.X:error
前面表示名称,后面是日志级别。如果没有名称,就表示是全局的。默认级别是INFO

#### sumk.log.console=1 启用控制台输出

#### s.log.日志类型=path:日志存放路径;module:com.test,a.*;exclude:b.*
* 日志类型现有day、month、level三种,支持扩展。统一日志的配置不在这里。以day日志为例,它可以简化为s.log.day=/logs/app-#.log
* 日志存放路径中要有一个#,比如/log/daylog-#.log
* module指定该日志所对应的日志名。支持头尾出现*作为通配符。这个配置是可选的
* exclude用于过滤掉不需要输出的日志。支持头尾出现*作为通配符。这个配置是可选的
* level类型日志跟day类型相似,差异是level日志除了module外,还增加了个level属性,它可以设置只输出摸个级别以上的日志

### 统一日志
* 统一日志系统跟普通类型有点不同。它需要调用UnionLogs.start()来开启。
* 通过sumk.unionlog.module 配置统一日志允许打印的模块。
* 通过UnionLogs.getUnionLog().directOffer()方式输出的日志,不受module配置影响,无法关闭。这是因为统一日志需要具备审查的功能,不允许开发者随意关闭,所以采用代码和配置相结合的方式
* 统一日志默认也是输出到文件,可以自己定义输出位置。参见test目录下的UnionDemo

### 其它参数
* sumk.log.day.max day或level类型日志的日志文件保存个数,默认30
* sumk.log.month.max month类型的日志的日志文件保存个数,默认2
* 日志体达到某种大小后会被截短,这些参数的设置,参见[入门教程](https://github.com/youtongluan/sumk-server-demo)里的《sumk框架入门.docx》


#### 其它说明
* 将这个特性与统一配置相结合,就可以动态切换日志级别,也可以动态设置是否将某一类型日志发送到日志中心(统一日志)。
* sumk日志跟logback一个很大的不同在于,sumk日志的level是全局的,而logback的level是针对具体日志类型的。




================================================
FILE: async-logger/pom.xml
================================================
<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>
	<parent>
		<groupId>com.github.youtongluan</groupId>
		<artifactId>sumk</artifactId>
		<version>4.2.1</version>
	</parent>
	<artifactId>async-logger</artifactId>
	<name>com.github.youtongluan:sumk</name>
	<description>A quick developing framewort for internet company</description>
	<url>https://github.com/youtongluan/sumk</url>
	<licenses>
		<license>
			<name>The Apache License, Version 2.0</name>
			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
		</license>
	</licenses>
	<scm>
		<url>https://github.com/youtongluan/sumk</url>
		<connection>https://github.com/youtongluan/sumk.git</connection>
		<developerConnection>https://github.com/youtongluan/sumk</developerConnection>
	</scm>
	<distributionManagement>
	    <repository>
	        <id>ossrh</id>
	        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
	    </repository>
	    <snapshotRepository>
	        <id>ossrh</id>
	        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
	    </snapshotRepository>
	</distributionManagement>
	
	<developers>
		<developer>
			<name>youtongluan</name>
			<email>3205207767@qq.com</email>
			<url>https://www.oschina.net/p/sumk-log</url>
		</developer>
	</developers>
	
	<dependencies>
		<dependency>
			<groupId>com.github.youtongluan</groupId>
			<artifactId>sumk-base</artifactId>
			<version>${project.version}</version>
		</dependency>
		<dependency>
		    <groupId>org.slf4j</groupId>
		    <artifactId>slf4j-api</artifactId>
		</dependency>
		<!-- 用于log4j 2.x 到 slf4j的转化 -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-to-slf4j</artifactId>
		    <version>2.14.1</version>
		    <optional>true</optional>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		
	</dependencies>
</project>

================================================
FILE: async-logger/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.slf4j.impl;

import org.slf4j.ILoggerFactory;
import org.slf4j.spi.LoggerFactoryBinder;
import org.yx.log.impl.SumkLoggerFactory;

public class StaticLoggerBinder implements LoggerFactoryBinder {

	private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();

	public static final StaticLoggerBinder getSingleton() {
		return SINGLETON;
	}

	public static String REQUESTED_API_VERSION = "1.7.0";

	private final ILoggerFactory loggerFactory;

	private StaticLoggerBinder() {
		loggerFactory = new SumkLoggerFactory();
	}

	public ILoggerFactory getLoggerFactory() {
		return loggerFactory;
	}

	public String getLoggerFactoryClassStr() {
		return SumkLoggerFactory.class.getName();
	}
}


================================================
FILE: async-logger/src/main/java/org/slf4j/impl/StaticMDCBinder.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.slf4j.impl;

import org.slf4j.helpers.NOPMDCAdapter;
import org.slf4j.spi.MDCAdapter;

public class StaticMDCBinder {
	public static final StaticMDCBinder SINGLETON = new StaticMDCBinder();

	private StaticMDCBinder() {
	}

	public MDCAdapter getMDCA() {
		return new NOPMDCAdapter();
	}
}


================================================
FILE: async-logger/src/main/java/org/slf4j/v2/SumkServiceProvider.java
================================================
package org.slf4j.v2;

import org.slf4j.ILoggerFactory;
import org.slf4j.IMarkerFactory;
import org.slf4j.helpers.BasicMDCAdapter;
import org.slf4j.helpers.BasicMarkerFactory;
import org.slf4j.spi.MDCAdapter;
import org.slf4j.spi.SLF4JServiceProvider;
import org.yx.log.impl.SumkLoggerFactory;

public class SumkServiceProvider implements SLF4JServiceProvider {

	private ILoggerFactory loggerFactory;

	private IMarkerFactory markerFactory;

	private MDCAdapter mdcAdapter;

	@Override
	public ILoggerFactory getLoggerFactory() {
		return loggerFactory;
	}

	@Override
	public IMarkerFactory getMarkerFactory() {
		return markerFactory;
	}

	@Override
	public MDCAdapter getMDCAdapter() {
		return mdcAdapter;
	}

	@Override
	public String getRequestedApiVersion() {
		return "2.0.1";
	}

	@Override
	public void initialize() {
		this.loggerFactory = new SumkLoggerFactory();
		this.markerFactory = new BasicMarkerFactory();
		this.mdcAdapter = new BasicMDCAdapter();
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/CodeLine.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

public class CodeLine {
	final String className;
	final String methodName;
	final int lineNumber;

	public CodeLine(String className, String methodName, int lineNumber) {
		this.className = className;
		this.methodName = methodName;
		this.lineNumber = lineNumber;
	}

	public String getClassName() {
		return className;
	}

	public String getMethodName() {
		return methodName;
	}

	public int getLineNumber() {
		return lineNumber;
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/CodeLineKit.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Objects;
import java.util.function.BiFunction;

import org.slf4j.Marker;
import org.yx.log.CodeLineMarker;

public final class CodeLineKit {

	private static BiFunction<Marker, String, CodeLine> parser = (marker, logModule) -> {
		if (marker != null && marker.getClass() == CodeLineMarker.class) {
			return LogHelper.extractCodeLine(marker.getName());
		}
		return LogHelper.extractCodeLine("org.yx.log.");
	};

	public static BiFunction<Marker, String, CodeLine> getParser() {
		return parser;
	}

	public static void setParser(BiFunction<Marker, String, CodeLine> parser) {
		CodeLineKit.parser = Objects.requireNonNull(parser);
	}

	public static CodeLine parse(Marker marker, String name) {
		return parser.apply(marker, name);
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/DayRollingFileAppender.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.time.LocalDate;
import java.util.Objects;

import org.yx.conf.AppInfo;
import org.yx.util.SumkDate;

public class DayRollingFileAppender extends RollingFileAppender {

	public DayRollingFileAppender() {
		super("day");
	}

	public DayRollingFileAppender(String name) {
		super(Objects.requireNonNull(name));
	}

	@Override
	protected boolean shouldDelete(String fileName) {
		String c = LogHelper.realContext(fileName, filePattern, SLOT);
		if (c == null || c.length() != 10) {
			return false;
		}
		try {
			LocalDate logDate = LocalDate.parse(c);
			LocalDate now = LocalDate.now();
			return logDate.isBefore(now.minusDays(AppInfo.getInt("sumk.log.day.max", 30)));
		} catch (Exception e) {
			return false;
		}
	}

	@Override
	protected String formatDateString(SumkDate date) {
		return date.to_yyyy_MM_dd();
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/DefaultUnionLog.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

import org.yx.base.matcher.Matchers;
import org.yx.conf.AppInfo;
import org.yx.conf.SystemConfig;

public class DefaultUnionLog extends LogQueue implements UnionLog {

	private UnionLogDao dao;
	private boolean started;
	private Consumer<SystemConfig> observer;

	private Function<LogObject, UnionLogObject> logObjectSerializer;

	private Supplier<Predicate<String>> matcherSupplier;

	public DefaultUnionLog() {
		super("unionlog");
		this.dao = new LocalFileDao();
		this.matcherSupplier = () -> Matchers.includeAndExclude(AppInfo.get("sumk.unionlog.module", null),
				AppInfo.get("sumk.unionlog.exclude", null));
	}

	@Override
	protected void flush(boolean idle) throws Exception {
		this.dao.flush(idle);
	}

	@Override
	protected void output(List<LogObject> list) throws Exception {
		List<UnionLogObject> logs = new ArrayList<>(list.size());
		for (LogObject raw : list) {
			UnionLogObject log = this.logObjectSerializer.apply(raw);
			if (log == null) {
				continue;
			}
			logs.add(log);
		}
		if (logs.size() > 0) {
			this.dao.store(logs);
		}
	}

	@Override
	protected boolean onStart(Map<String, String> configMap) {
		if (this.logObjectSerializer == null) {
			this.logObjectSerializer = getLogObjectSerializer();
		}
		if (this.observer == null) {
			this.observer = c -> setMatcher(matcherSupplier.get());
			AppInfo.addObserver(this.observer);
		}
		this.started = true;
		return true;
	}

	@Override
	public synchronized void stop() throws Exception {
		this.started = false;
		super.stop();

	}

	@Override
	public boolean directOffer(LogObject logObject) {
		if (!this.started) {
			return false;
		}
		return this.queue.offer(logObject);
	}

	@Override
	public boolean offer(LogObject logObject) {
		if (!this.started) {
			return false;
		}
		return super.offer(logObject);
	}

	@Override
	public boolean isStarted() {
		return this.started;
	}

	public Supplier<Predicate<String>> getMatcherSupplier() {
		return matcherSupplier;
	}

	public void setMatcherSupplier(Supplier<Predicate<String>> matcherSupplier) {
		this.matcherSupplier = Objects.requireNonNull(matcherSupplier);
		this.setMatcher(this.matcherSupplier.get());
	}

	public Function<LogObject, UnionLogObject> getLogObjectSerializer() {
		return logObjectSerializer == null ? new UnionLogObjectSerializer() : this.logObjectSerializer;
	}

	public void setLogObjectSerializer(Function<LogObject, UnionLogObject> logObjectSerializer) {
		this.logObjectSerializer = Objects.requireNonNull(logObjectSerializer);
	}

	public UnionLogDao getDao() {
		return dao;
	}

	public void setDao(UnionLogDao dao) {
		this.dao = Objects.requireNonNull(dao);
	}

	public void removeObserver() {
		Consumer<SystemConfig> ob = this.observer;
		if (ob == null) {
			return;
		}
		AppInfo.removeObserver(ob);
		this.observer = null;
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LeveledDayRollingFileAppender.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Collections;
import java.util.Map;

import org.yx.log.ConsoleLog;
import org.yx.log.LogLevel;

public class LeveledDayRollingFileAppender extends DayRollingFileAppender {

	private LogLevel level = LogLevel.INFO;

	public LeveledDayRollingFileAppender() {
		this("level");
	}

	public LeveledDayRollingFileAppender(String name) {
		super(name);
	}

	@Override
	protected boolean accept(LogObject logObject) {
		return logObject.methodLevel.ordinal() >= level.ordinal() && super.accept(logObject);
	}

	@Override
	public void config(Map<String, String> configMap) {
		if (configMap == null) {
			configMap = Collections.emptyMap();
		}
		super.config(configMap);
		String lev = configMap.get("level");
		if (lev == null || lev.isEmpty()) {
			return;
		}
		try {
			this.level = LogLevel.valueOf(lev.toUpperCase());
		} catch (Exception e) {
			ConsoleLog.defaultLog.error("{} is not a valid level name", lev);
		}
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LocalFileDao.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;

import org.yx.conf.AppInfo;
import org.yx.log.ConsoleLog;
import org.yx.util.UUIDSeed;

public class LocalFileDao implements UnionLogDao {
	private static final String LINE_SPLIT = "\n";
	private final long MAX_FILE_LENGTH = AppInfo.getInt("sumk.log.union.max_file_length", 100 * 1024 * 1024);
	private final int MAX_RECORD_SIZE = AppInfo.getInt("sumk.log.union.max_record_size", 200);
	private int aliveTime = AppInfo.getInt("sumk.log.union.alive_time", 15000);

	private long createTime = -1;

	private int fileLength;
	private int recordSize;
	private List<byte[]> buffer;

	public LocalFileDao() {
		this.buffer = new ArrayList<>(MAX_RECORD_SIZE);
	}

	private File createLogingFile() {
		for (int i = 0; i < 5; i++) {
			try {
				String name = AppInfo.pid().concat("_").concat(UUIDSeed.seq18());
				File f = new File(getLogingPath(), name);
				if (!f.getParentFile().exists()) {
					File parent = f.getParentFile();
					if (!parent.mkdirs()) {
						ConsoleLog.defaultLog.error("create folder " + parent.getAbsolutePath() + " failed!!!");
						return null;
					}
				}
				if (!f.createNewFile()) {
					ConsoleLog.defaultLog.error("create file " + f.getAbsolutePath() + " failed!!!");
					return null;
				}
				return f;
			} catch (Exception e) {
				ConsoleLog.defaultLog.error(e.getMessage(), e);
			}
		}
		return null;
	}

	@Override
	public void store(List<UnionLogObject> logs) throws IOException {
		int logCount = logs.size();

		StringBuilder sb = new StringBuilder(600 * Math.min(10, logs.size()));
		for (UnionLogObject log : logs) {
			sb.append(log.log).append(LINE_SPLIT);
		}
		byte[] bs = sb.toString().getBytes(AppInfo.UTF8);
		sb = null;
		buffer.add(bs);
		this.recordSize += logCount;
		this.fileLength += bs.length;
		if (this.recordSize >= MAX_RECORD_SIZE || this.fileLength > MAX_FILE_LENGTH) {
			reset();
		}
	}

	@Override
	public void flush(boolean idle) {
		if (this.recordSize >= MAX_RECORD_SIZE || this.fileLength > MAX_FILE_LENGTH
				|| System.currentTimeMillis() - createTime >= aliveTime) {
			reset();
		}
	}

	public void reset() {
		List<byte[]> datas = this.buffer;
		if (datas.isEmpty()) {
			return;
		}
		this.buffer = new ArrayList<>();
		long size = 0;
		FileChannel channel = null;
		try {
			File logFile = createLogingFile();
			channel = FileChannel.open(logFile.toPath(), StandardOpenOption.APPEND);
			ByteBuffer[] bufs = new ByteBuffer[datas.size()];
			for (int i = 0; i < bufs.length; i++) {
				bufs[i] = ByteBuffer.wrap(datas.get(i));
				size += datas.get(i).length;
			}

			do {
				size -= channel.write(bufs);
			} while (size != 0);
			channel.force(true);
			channel.close();
			channel = null;
			move2Loged(logFile);
			this.fileLength = 0;
			this.recordSize = 0;
		} catch (Exception e) {
			ConsoleLog.defaultLog.error(e.toString(), e);
		} finally {
			if (channel != null) {
				try {
					channel.close();
				} catch (IOException e) {
					ConsoleLog.defaultLog.error(e.toString(), e);
				}
			}
		}
	}

	protected void move2Loged(File logFile) {
		UnionLogUtil.move2Loged(logFile);
	}

	protected File getLogingPath() {
		return UnionLogUtil.getLogingPath();
	}

	public void setAliveTime(int time) {
		this.aliveTime = time;
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogAppendObserver.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Consumer;

import org.yx.conf.AppInfo;
import org.yx.conf.SystemConfig;
import org.yx.log.ConsoleLog;
import org.yx.log.LogSettings;
import org.yx.util.CollectionUtil;
import org.yx.util.StringUtil;

public class LogAppendObserver implements Consumer<SystemConfig> {

	@Override
	public void accept(SystemConfig info) {
		LogSettings.updateSettings();
		LogObject.updateCodeLineOnOff();
		Map<String, String> newAppenders = AppInfo.subMap(LogAppenders.LOG_APPENDER);
		for (LogAppender append : LogAppenders.logAppenders) {
			String v = newAppenders.remove(append.name());
			if (v == null || v.isEmpty()) {
				try {
					append.stop();
				} catch (Exception e) {
					ConsoleLog.defaultLog.error(e.toString(), e);
				}
				continue;
			}
			v = StringUtil.toLatin(v);
			Map<String, String> map = CollectionUtil.loadMapFromText(v, ";", ":");
			append.config(map);
		}

		if (newAppenders.isEmpty()) {
			return;
		}
		List<LogAppender> appends = new ArrayList<>();
		for (LogAppender append : LogAppenders.logAppenders) {
			appends.add(append);
		}
		if (LogAppenders.isStarted()) {
			ConsoleLog.defaultLog.info("find new appends:{}", newAppenders);
		}
		for (Entry<String, String> entry : newAppenders.entrySet()) {
			String k = entry.getKey();
			String p = entry.getValue();
			LogAppender appender = LogAppenders.startAppender(k, p);
			if (appender != null) {
				appends.add(appender);
			}

		}
		LogAppenders.logAppenders = appends.toArray(new LogAppender[appends.size()]);
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogAppender.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Map;

public interface LogAppender {

	boolean start(Map<String, String> configMap);

	void stop() throws Exception;

	boolean offer(LogObject logObject);

	String name();

	void config(Map<String, String> configMap);
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogAppenderFactory.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.yx.log.ConsoleLog;

public final class LogAppenderFactory {

	private static final ConcurrentMap<String, LogAppender> map = new ConcurrentHashMap<>();

	static synchronized void init() throws Exception {
		Collection<LogAppender> appenders = Arrays.asList(new LeveledDayRollingFileAppender(),
				new MonthRollingFileAppender(), new DayRollingFileAppender());
		for (LogAppender append : appenders) {
			map.put(append.name(), append);
		}
	}

	static LogAppender start(String name, Map<String, String> configMap) throws Exception {
		LogAppender append = map.get(name);
		if (append == null) {
			ConsoleLog.defaultLog.error("{} cannot find appender", name);
			return null;
		}
		if (!append.start(configMap)) {
			ConsoleLog.defaultLog.error("{} started failed,value is {}", name, configMap);
			return null;
		}
		return append;
	}

	public static LogAppender registeAppender(LogAppender m) {
		Objects.requireNonNull(m);
		return map.put(m.name(), m);
	}

	public static void remove(String name) {
		if (name == null || name.isEmpty()) {
			return;
		}
		map.remove(name);
	}

	public static LogAppender getAppender(String name) {
		return map.get(name);
	}

	public static Set<String> appenderNames() {
		return Collections.unmodifiableSet(map.keySet());
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogAppenders.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import org.yx.conf.AppInfo;
import org.yx.util.CollectionUtil;
import org.yx.util.StringUtil;

public class LogAppenders {
	static final String LOG_APPENDER = "s.log.";
	public static final String MODULE = "module";
	public static final String PATH = "path";
	static LogAppender[] logAppenders = new LogAppender[0];
	private static boolean started;

	static LogAppender startAppender(String name, String value) {
		if (value == null || value.isEmpty()) {
			return null;
		}
		value = StringUtil.toLatin(value);
		try {
			return LogAppenderFactory.start(name, CollectionUtil.loadMapFromText(value, ";", ":"));
		} catch (Throwable e) {
			System.err.println("appender [" + name + "] = " + value + " create failed");
			e.printStackTrace();
			return null;
		}
	}

	static synchronized void init() {
		if (started) {
			return;
		}
		started = true;
		try {
			LogAppenderFactory.init();
			AppInfo.addObserver(new LogAppendObserver());
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static boolean offer(LogObject logObject) {
		boolean output = false;
		for (LogAppender log : logAppenders) {
			if (log.offer(logObject)) {
				output = true;
			}
		}
		if (UnionLogs.getUnionLog().offer(logObject)) {
			return true;
		}
		return output;
	}

	public static boolean isStarted() {
		return started;
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogHelper.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Objects;

import org.yx.log.ConsoleLog;

public class LogHelper {

	private static PlainOutput output = new PlainOutputImpl();

	public static void setOutput(PlainOutput output) {
		LogHelper.output = Objects.requireNonNull(output);
	}

	public static String plainMessage(LogObject logObject, boolean showAttachs) {
		return output.plainMessage(logObject, showAttachs);
	}

	public static void plainMessage(StringBuilder sb, LogObject logObject, boolean showAttachs) {
		output.plainMessage(sb, logObject, showAttachs);
	}

	public static CodeLine extractCodeLine(String pre) {
		if (pre == null || pre.isEmpty()) {
			return null;
		}
		StackTraceElement stack[] = (new Throwable()).getStackTrace();
		if (stack != null && stack.length > 2) {
			int i = stack.length - 1;

			for (; i > 0; i--) {
				if (stack[i].getClassName().startsWith(pre)) {
					i++;
					break;
				}
			}
			StackTraceElement s = stack[i];

			if (s.getClassName().contains(".sumkbox.") && (++i) < stack.length) {
				s = stack[i];
			}
			return new CodeLine(s.getClassName(), s.getMethodName(), s.getLineNumber());
		}
		return null;
	}

	public static String realContext(String text, String pattern, String slot) {
		String[] fs = pattern.split(slot, 2);
		if (fs.length != 2) {
			ConsoleLog.defaultLog.error("{} should contain and only contain one {}", pattern, slot);
			return null;
		}
		if (fs[0].length() + fs[1].length() > text.length()) {
			return null;
		}
		int end = text.length() - fs[1].length();
		if (!fs[0].equals(text.substring(0, fs[0].length())) || !fs[1].equals(text.substring(end))) {
			return null;
		}
		return text.substring(fs[0].length(), end);
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogObject.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Map;

import org.slf4j.Marker;
import org.yx.annotation.doc.NotNull;
import org.yx.base.context.ActionContext;
import org.yx.base.context.LogContext;
import org.yx.conf.AppInfo;
import org.yx.log.LogKits;
import org.yx.log.LogLevel;
import org.yx.log.LogSettings;
import org.yx.log.SumkLogger;
import org.yx.util.SumkDate;

public class LogObject {
	public static final char LN = '\n';
	public static final Charset CHARSET = StandardCharsets.UTF_8;
	private static boolean codelineEnable = true;

	@NotNull
	final SumkDate logDate;

	@NotNull
	final LogLevel methodLevel;

	final String body;

	@NotNull
	final String threadName;

	final Throwable exception;

	@NotNull
	final String loggerName;

	final CodeLine codeLine;

	final LogContext logContext;

	public static LogObject create(Marker marker, LogLevel methodLevel, String message, Throwable e,
			SumkLogger logger) {

		String loggerName = logger.getName();
		CodeLine codeLine = null;
		if (codelineEnable && (!loggerName.startsWith("sumk.") || marker != null)) {
			codeLine = CodeLineKit.parse(marker, loggerName);
		}
		return new LogObject(loggerName, SumkDate.now(), methodLevel,
				LogKits.shorterSubfix(message, LogSettings.maxBodyLength()), e, Thread.currentThread().getName(),
				ActionContext.current().logContext(), codeLine);
	}

	public LogObject(@NotNull String loggerName, @NotNull SumkDate logDate, @NotNull LogLevel methodLevel, String body,
			Throwable exception, @NotNull String threadName, LogContext logContext, CodeLine codeLine) {
		this.logDate = logDate;
		this.methodLevel = methodLevel;
		this.body = body;
		this.exception = exception;
		this.threadName = threadName;
		this.logContext = logContext != null ? logContext : LogContext.empty();
		this.loggerName = loggerName;
		this.codeLine = codeLine;
	}

	public String spanId() {
		return logContext.spanId;
	}

	public String traceId() {
		return logContext.traceId;
	}

	public String userId() {
		return logContext.userId;
	}

	public boolean isTest() {
		return logContext.test;
	}

	public Map<String, String> attachments() {
		return logContext.unmodifiedAttachs();
	}

	public SumkDate getLogDate() {
		return logDate;
	}

	public LogLevel getMethodLevel() {
		return methodLevel;
	}

	public String getBody() {
		return body;
	}

	public String getThreadName() {
		return threadName;
	}

	public Throwable getException() {
		return exception;
	}

	public String getLoggerName() {
		return this.loggerName;
	}

	public CodeLine getCodeLine() {
		return codeLine;
	}

	public LogContext getLogContext() {
		return logContext;
	}

	static void updateCodeLineOnOff() {
		codelineEnable = AppInfo.getBoolean("sumk.log.codeline", true);
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/LogQueue.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;

import org.yx.base.matcher.BooleanMatcher;
import org.yx.base.matcher.Matchers;
import org.yx.conf.AppInfo;
import org.yx.log.ConsoleLog;
import org.yx.util.SumkThreadPool;

public abstract class LogQueue implements Runnable {

	protected final String name;

	private int interval;

	private long handleLogCount;

	private boolean jobStarted;

	protected final BlockingQueue<LogObject> queue;

	private Predicate<String> matcher = BooleanMatcher.FALSE;

	public LogQueue(String name) {
		this.name = name;
		this.interval = AppInfo.getInt("sumk.log.interval." + name, 1000);
		this.queue = new LinkedBlockingQueue<>(Integer.getInteger("sumk.log.queue." + name, 2_0000));
	}

	protected boolean accept(LogObject logObject) {
		String module = logObject.getLoggerName();
		return this.matcher.test(module);
	}

	protected abstract void flush(boolean idle) throws Exception;

	public void config(Map<String, String> configMap) {
		if (configMap == null) {
			configMap = Collections.emptyMap();
		}
		String patterns = configMap.get(LogAppenders.MODULE);
		if (patterns == null || patterns.isEmpty()) {
			patterns = Matchers.WILDCARD;
		}
		this.matcher = Matchers.includeAndExclude(patterns, configMap.get("exclude"));
		ConsoleLog.defaultLog.debug("{} set matcher :{}", this.name, this.matcher);
	}

	public final String name() {
		return this.name;
	}

	public boolean offer(LogObject logObject) {
		if (!accept(logObject)) {
			return false;
		}
		return queue.offer(logObject);
	}

	protected abstract void output(List<LogObject> list) throws Exception;

	@Override
	public void run() {
		Thread.currentThread().setName("log-" + this.name);

		while (true) {
			try {
				this.flush(this.consume());
			} catch (Throwable e) {
				ConsoleLog.defaultLog.warn("日志消费失败," + e.toString(), e);

				if (Thread.currentThread().isInterrupted() || e.getClass() == InterruptedException.class) {
					ConsoleLog.defaultLog.warn("{}日志停止了", this.name);
					Thread.currentThread().interrupt();
					return;
				}
			}
		}

	}

	private boolean consume() throws Exception {
		LogObject message = queue.poll(interval, TimeUnit.MILLISECONDS);
		if (message == null) {
			return true;
		}
		int batch = Math.min(queue.size() + 10, 100);
		List<LogObject> list = new ArrayList<>(batch);
		list.add(message);
		queue.drainTo(list, batch - 1);

		while (list.size() > 0) {
			output(list);
			this.handleLogCount += list.size();
			list.clear();
			queue.drainTo(list, batch);
		}
		return false;
	}

	public synchronized boolean start(Map<String, String> map) {
		if (map == null) {
			map = Collections.emptyMap();
		}
		if (!onStart(map)) {
			return false;
		}
		ConsoleLog.defaultLog.debug("{} started by {}", this, map);
		if (!jobStarted) {
			startJob();
			this.jobStarted = true;
		}
		return jobStarted;
	}

	protected void startJob() {
		SumkThreadPool.executor().execute(this);
	}

	protected abstract boolean onStart(Map<String, String> configMap);

	public synchronized void stop() throws Exception {
		this.matcher = BooleanMatcher.FALSE;
		ConsoleLog.defaultLog.info("日志{} stoped", this.name);
	}

	public void setInterval(int interval) {
		if (interval > 0) {
			this.interval = interval;
		}
	}

	public long getHandleLogCount() {
		return handleLogCount;
	}

	protected Predicate<String> getMatcher() {
		return matcher;
	}

	protected void setMatcher(Predicate<String> matcher) {
		this.matcher = Objects.requireNonNull(matcher);
	}

	@Override
	public String toString() {
		return this.name + " [queue size:" + queue.size() + ",matcher:" + matcher + ",logCount:" + handleLogCount + "]";
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/MonthRollingFileAppender.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.time.LocalDate;
import java.util.Objects;

import org.yx.conf.AppInfo;
import org.yx.util.SumkDate;

public class MonthRollingFileAppender extends RollingFileAppender {

	public MonthRollingFileAppender() {
		super("month");
	}

	public MonthRollingFileAppender(String name) {
		super(Objects.requireNonNull(name));
	}

	@Override
	protected String formatDateString(SumkDate date) {
		return date.to_yyyy_MM();
	}

	@Override
	protected boolean shouldDelete(String fileName) {
		String c = LogHelper.realContext(fileName, filePattern, SLOT);
		if (c == null || c.length() != 7) {
			return false;
		}
		c += "-01";
		try {
			LocalDate logDate = LocalDate.parse(c);
			LocalDate now = LocalDate.now().withDayOfMonth(1);

			return logDate.isBefore(now.minusMonths(AppInfo.getInt("sumk.log.month.max", 2)));
		} catch (Exception e) {
			return false;
		}
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/PlainOutput.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

public interface PlainOutput {

	String plainMessage(LogObject logObject, boolean showAttachs);

	void plainMessage(StringBuilder sb, LogObject logObject, boolean showAttachs);

	void setShowSN(boolean showSN);

	void setShowThreadName(boolean showThreadName);
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/PlainOutputImpl.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Map;
import java.util.Objects;

import org.yx.base.context.ActionContext;
import org.yx.log.LogKits;
import org.yx.log.LogSettings;
import org.yx.util.ExceptionUtil;

public class PlainOutputImpl implements PlainOutput {
	private boolean showThreadName = true;
	private boolean showSN = true;

	@Override
	public void setShowThreadName(boolean showThreadName) {
		this.showThreadName = showThreadName;
	}

	@Override
	public void setShowSN(boolean showSN) {
		this.showSN = showSN;
	}

	public void plainMessage(StringBuilder sb, LogObject logObject, boolean showAttachs) {
		this.appendHeader(sb, logObject).append(logObject.methodLevel).append(' ');
		if (logObject.codeLine != null) {
			String clzShortName = LogKits.shorterPrefix(logObject.codeLine.className, LogSettings.maxLogNameLength());

			if (!Objects.equals(logObject.getLoggerName(), logObject.codeLine.className)) {
				sb.append('(').append(logObject.getLoggerName()).append(')');
			}
			sb.append(clzShortName).append(':').append(logObject.codeLine.lineNumber);
		} else {
			sb.append(logObject.getLoggerName());
		}
		Map<String, String> attachs = logObject.attachments();
		if (showAttachs && attachs != null) {
			sb.append(" #").append(attachs);
		}

		sb.append(" - ").append(logObject.body).append(LogObject.LN);
		if (logObject.exception != null) {
			ExceptionUtil.printStackTrace(sb, logObject.exception);
			sb.append(LogObject.LN);
		}
	}

	protected StringBuilder appendHeader(StringBuilder sb, LogObject logObject) {
		StringBuilder sn = new StringBuilder();
		if (logObject.userId() != null) {
			sn.append(logObject.userId());
		}
		if (logObject.traceId() != null) {
			if (sn.length() > 0) {
				sn.append('@');
			}
			sn.append(logObject.traceId());
			if (logObject.spanId() != null) {
				sn.append('-').append(logObject.spanId());
			}
		}
		sb.append(logObject.logDate.to_yyyy_MM_dd_HH_mm_ss_SSS());
		if (ActionContext.current().isTest()) {
			sb.append(" -TEST- ");
		}
		if (showThreadName) {
			sb.append(" [").append(logObject.threadName).append("] ");
		}
		if (showSN && sn.length() > 0) {
			sb.append(" {").append(sn).append("} ");
		}
		return sb;
	}

	@Override
	public String plainMessage(LogObject logObject, boolean showAttachs) {
		StringBuilder sb = new StringBuilder(64);
		this.plainMessage(sb, logObject, showAttachs);
		return sb.toString();
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/RollingFileAppender.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.Map;

import org.yx.base.matcher.BooleanMatcher;
import org.yx.conf.AppInfo;
import org.yx.log.ConsoleLog;
import org.yx.log.LogSettings;
import org.yx.util.StringUtil;
import org.yx.util.SumkDate;

public abstract class RollingFileAppender extends LogQueue implements LogAppender {

	public static final String SLOT = "#";
	private static final long DAY_MILS = 1000L * 3600 * 24;

	protected StringBuilder buffer;
	protected String currentDate;
	protected FileChannel channel;

	private boolean dirty;
	private int bufferSize = AppInfo.getInt("sumk.log.buffer.size", 2048);

	protected int syncInterval = AppInfo.getInt("sumk.log.sync.interval", 3000);

	private long lastDeleteTime;

	private long lastSyncTime;

	protected String filePattern;
	protected File dir;

	protected boolean setupFilePath(String fileName) {
		if (StringUtil.isEmpty(fileName)) {
			return false;
		}
		if (fileName.indexOf(SLOT) < 0) {
			ConsoleLog.defaultLog.error("{} should contain {}", fileName, SLOT);
			return false;
		}
		if (fileName.indexOf(SLOT) != fileName.lastIndexOf(SLOT)) {
			ConsoleLog.defaultLog.error("{} contain more than one {}", fileName, SLOT);
			return false;
		}
		File file = new File(fileName);
		this.filePattern = file.getName();
		if (!this.filePattern.contains(SLOT)) {
			ConsoleLog.defaultLog.error("{} should contain {}", this.filePattern, SLOT);
			return false;
		}
		this.dir = file.getParentFile();
		if (!this.dir.exists() && !this.dir.mkdirs()) {
			ConsoleLog.defaultLog.error("directory [{}{}] is not exists, and cannot create!!!",
					this.dir.getAbsolutePath(), File.pathSeparator);
			return false;
		}

		return true;
	}

	public RollingFileAppender(String name) {
		super(name);
	}

	@Override
	protected void flush(boolean idle) {

		if (this.buffer != null && this.buffer.length() > bufferSize) {
			this.buffer = null;
		}
		if (this.getMatcher() == BooleanMatcher.FALSE && this.channel != null) {
			this.sync();
			this.closeCurrentChannel();
		}
		long now = System.currentTimeMillis();
		if (this.dirty && (now - this.lastSyncTime >= this.syncInterval)) {
			this.lastSyncTime = now;
			this.sync();
		}

		if (now - this.lastDeleteTime >= DAY_MILS) {
			this.lastDeleteTime = now;
			this.deleteHisLog();
		}
	}

	protected void deleteHisLog() {
		String[] files = dir.list();
		if (files == null || files.length == 0) {
			return;
		}
		for (String f : files) {
			if (this.shouldDelete(f)) {
				try {
					File log = new File(dir, f);
					log.delete();
				} catch (Exception e) {
				}
			}
		}
	}

	@Override
	protected void output(List<LogObject> msgs) throws IOException {
		String date = this.formatDateString(msgs.get(0).logDate);
		int fromIndex = 0;
		for (int i = 1; i < msgs.size(); i++) {
			LogObject obj = msgs.get(i);
			String d2 = this.formatDateString(obj.logDate);
			if (!d2.equals(date)) {
				this.outputInSameDate(date, msgs.subList(fromIndex, i));
				date = d2;
				fromIndex = i;
			}
		}
		if (fromIndex == 0) {
			this.outputInSameDate(date, msgs);
			return;
		}

		this.outputInSameDate(date, msgs.subList(fromIndex, msgs.size()));
	}

	protected void outputInSameDate(String date, List<LogObject> msgs) throws IOException {
		if (!date.equals(this.currentDate)) {
			if (this.channel != null) {
				this.sync();
				this.closeCurrentChannel();
			}
			File file = new File(this.dir, filePattern.replace(SLOT, date));
			if (!file.exists() && !file.createNewFile()) {
				ConsoleLog.defaultLog.error("{} create fail ", file.getAbsolutePath());
				for (LogObject logObject : msgs) {
					System.err.print(LogHelper.plainMessage(logObject, LogSettings.showAttach()));
				}
				return;
			}
			this.channel = FileChannel.open(file.toPath(), StandardOpenOption.APPEND);
			this.currentDate = date;
		}

		long size = 0;
		ByteBuffer[] bufs = new ByteBuffer[msgs.size()];
		for (int i = 0; i < bufs.length; i++) {
			byte[] b = toBytes(msgs.get(i));
			bufs[i] = ByteBuffer.wrap(b);
			size += b.length;
		}

		do {
			size -= this.channel.write(bufs);
		} while (size != 0);
		this.dirty = true;
	}

	protected void sync() {
		try {
			this.channel.force(true);
			this.dirty = false;
			ConsoleLog.defaultLog.trace("{} finish sync to {}", this.name, this.currentDate);
		} catch (Exception e) {
			ConsoleLog.defaultLog.error(this.name + "刷新到磁盘失败[" + this.currentDate + "]", e);
		}
	}

	protected void closeCurrentChannel() {
		try {
			this.channel.close();
			this.channel = null;
			this.currentDate = null;
			ConsoleLog.defaultLog.debug("{} closed {}", this.name, this.currentDate);
		} catch (Exception e) {
			ConsoleLog.defaultLog.error(this.name + "关闭失败[" + this.currentDate + "]", e);
		}
	}

	protected abstract boolean shouldDelete(String fileName);

	protected byte[] toBytes(LogObject logObject) {
		if (this.buffer == null) {
			this.buffer = new StringBuilder(bufferSize);
		} else {
			this.buffer.setLength(0);
		}
		LogHelper.plainMessage(this.buffer, logObject, LogSettings.showAttach());
		return this.buffer.toString().getBytes(LogObject.CHARSET);
	}

	protected abstract String formatDateString(SumkDate date);

	protected String extractPath(Map<String, String> map) {
		String path = map.get(LogAppenders.PATH);
		if (path != null || map.size() != 1) {
			return path;
		}

		String p = map.keySet().iterator().next();
		String v = map.get(p);
		return StringUtil.isEmpty(v) ? p : String.join(":", p, v);
	}

	@Override
	protected boolean onStart(Map<String, String> map) {
		this.config(map);
		return this.dir != null && this.filePattern != null;
	}

	@Override
	public void config(Map<String, String> map) {
		String path = extractPath(map);
		if (!setupFilePath(path)) {
			return;
		}
		super.config(map);
	}

	public File getLogFile(SumkDate date) {
		String name = filePattern.replace(SLOT, formatDateString(date));
		return new File(dir, name);
	}

	public void setSyncInterval(int syncInterval) {
		this.syncInterval = syncInterval;
	}

	public int getBufferSize() {
		return bufferSize;
	}

	public void setBufferSize(int bufferSize) {
		this.bufferSize = Math.max(bufferSize, 100);
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/SumkLoggerFactory.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Objects;
import java.util.function.Function;

import org.slf4j.ILoggerFactory;
import org.slf4j.Logger;
import org.yx.log.LogLevel;
import org.yx.log.Loggers;
import org.yx.log.RawLog;
import org.yx.log.SumkLogger;

public final class SumkLoggerFactory implements ILoggerFactory {

	private static final Loggers loggers = Loggers.create("Slf4jLog");

	private static Function<String, SumkLogger> loggerFactory = SumkLoggerImpl::new;
	static {
		LogAppenders.init();
		RawLog.setLogger(RawLog.SLF4J_LOG);
	}

	public SumkLoggerFactory() {
		RawLog.info("org.slf4j.sumk", "sumk slf4j initialized");
	}

	public static Function<String, SumkLogger> getLoggerFactory() {
		return loggerFactory;
	}

	public static void setLoggerFactory(Function<String, SumkLogger> loggerFactory) {
		SumkLoggerFactory.loggerFactory = Objects.requireNonNull(loggerFactory);
	}

	public static void setDefaultLevel(LogLevel level) {
		if (level != null) {
			Loggers.setDefaultLevel(level);
		}
	}

	@Override
	public Logger getLogger(String name) {
		SumkLogger log = loggers.get(name);
		if (log != null) {
			return log;
		}
		log = loggerFactory.apply(name);
		SumkLogger oldInstance = loggers.putIfAbsent(name, log);
		return oldInstance == null ? log : oldInstance;
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/SumkLoggerImpl.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import org.slf4j.Marker;
import org.slf4j.event.LoggingEvent;
import org.slf4j.spi.LocationAwareLogger;
import org.yx.base.context.LogContext;
import org.yx.log.CodeLineMarker;
import org.yx.log.ConsoleLog;
import org.yx.log.LogKits;
import org.yx.log.LogLevel;
import org.yx.log.LogSettings;
import org.yx.log.SumkLogger;
import org.yx.util.SumkDate;

public class SumkLoggerImpl extends SumkLogger implements LocationAwareLogger {

	public SumkLoggerImpl(String module) {
		super(module);
	}

	@Override
	protected void output(Marker marker, LogLevel methodLevel, String format, Object... arguments) {
		try {
			String msg = LogKits.buildMessage(format, arguments);
			LogObject logObject = LogObject.create(marker, methodLevel, msg, null, this);

			if (!LogAppenders.offer(logObject) || LogSettings.consoleEnable()) {
				System.out.print(LogHelper.plainMessage(logObject, LogSettings.showAttach()));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	protected void output(Marker marker, LogLevel methodLevel, String msg, Throwable e) {
		try {
			LogObject logObject = LogObject.create(marker, methodLevel, msg, e, this);
			if (!LogAppenders.offer(logObject) || LogSettings.consoleEnable()) {
				System.err.print(LogHelper.plainMessage(logObject, LogSettings.showAttach()));
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}

	@Override
	public void log(Marker marker, String fqcn, int level, String message, Object[] argArray, Throwable t) {
		try {
			LogLevel methodLevel = LogKits.fromSlf4jLocationAwareLoggerInt(level);
			if (!this.isLogable(methodLevel)) {
				return;
			}
			String msg = LogKits.buildMessage(message, argArray);
			if (fqcn != null && !fqcn.equals(name)) {
				marker = new CodeLineMarker(fqcn);
			}
			LogObject logObject = LogObject.create(marker, methodLevel, msg, t, this);

			if (!LogAppenders.offer(logObject) || LogSettings.consoleEnable()) {
				System.out.print(LogHelper.plainMessage(logObject, LogSettings.showAttach()));
			}
		} catch (Exception e) {
			ConsoleLog.defaultLog.error("failed when append to log queue", e);
		}
	}

	public void log(LoggingEvent event) {
		LogLevel methodLevel = LogKits.fromSlf4jLocationAwareLoggerInt(event.getLevel().toInt());
		if (!this.isLogable(methodLevel)) {
			return;
		}
		try {
			String msg = "*** " + LogKits.buildMessage(event.getMessage(), event.getArgumentArray());
			LogObject logObject = new LogObject(name, SumkDate.of(event.getTimeStamp()), methodLevel, msg,
					event.getThrowable(), event.getThreadName(), LogContext.empty(), null);

			if (!LogAppenders.offer(logObject) || LogSettings.consoleEnable()) {
				System.out.print(LogHelper.plainMessage(logObject, LogSettings.showAttach()));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/UnionLog.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Map;

public interface UnionLog {

	boolean start(Map<String, String> configMap);

	boolean isStarted();

	void stop() throws Exception;

	boolean offer(LogObject logObject);

	boolean directOffer(LogObject logObject);

}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogDao.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.List;

public interface UnionLogDao {

	/**
	 * 一段时间触发,调用间隔一般不超过interval,但有可能接近0。有无日志都会调用
	 * 
	 * @param idle true表示本次任务没有日志
	 */
	void flush(boolean idle);

	/**
	 * 输出日志对象,有日志的时候都会调用
	 * 
	 * @param logs 日志对象列表,不为null,也不为空。里面的元素也都不为null
	 * @throws Exception 如果抛出异常,会导致本次要处理的日志丢失,不影响之后日志的消费
	 */
	void store(List<UnionLogObject> logs) throws Exception;
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogObject.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import org.yx.annotation.doc.NotNull;
import org.yx.util.SumkDate;

/**
 * 调用toLog()方法,可以获取到json化后的日志体。<BR>
 * 如果要减少中间态String的生成数量,可以调用getLogContext()获取CharSequence类型的日志体。
 */
public class UnionLogObject {
	@NotNull
	protected final String name;

	@NotNull
	protected final SumkDate date;

	@NotNull
	protected final String log;

	public UnionLogObject(@NotNull String name, @NotNull SumkDate date, @NotNull String log) {
		this.name = name;
		this.date = date;
		this.log = log;
	}

	/**
	 * @return 日志名称
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return 日志打印时的时间
	 */
	public SumkDate getDate() {
		return date;
	}

	/**
	 * 一般是json结构,并且里面字段的顺序一般也是固定的。 默认第一个前2个是name和date
	 * 
	 * @return 格式化后的日志
	 */
	public String getLog() {
		return this.log;
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogObjectSerializer.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.io.IOException;
import java.util.function.Function;

import org.yx.conf.AppInfo;
import org.yx.log.ConsoleLog;

public class UnionLogObjectSerializer implements Function<LogObject, UnionLogObject> {

	private final String appId;

	private int extraSize = 350;

	public UnionLogObjectSerializer() {
		this.appId = AppInfo.appId(null);
	}

	@Override
	public UnionLogObject apply(LogObject log) {
		int estimate = extraSize;
		if (log.body != null) {
			estimate += log.body.length();
		}
		StringBuilder sb = new StringBuilder(estimate);
		try {
			UnionLogUtil.appendLogObject(sb, log, appId);
			return new UnionLogObject(log.loggerName, log.logDate, sb.toString());
		} catch (IOException e) {
			ConsoleLog.defaultLog.error("数据解析出错", e);
			return null;
		}
	}

	public int getExtraSize() {
		return extraSize;
	}

	public void setExtraSize(int extraSize) {
		if (extraSize > 0) {
			this.extraSize = extraSize;
		}
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogUtil.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;

import org.yx.base.sumk.UnsafeStringWriter;
import org.yx.conf.AppInfo;
import org.yx.exception.CodeException;
import org.yx.log.ConsoleLog;
import org.yx.util.ExceptionUtil;

import com.google.gson.stream.JsonWriter;

public final class UnionLogUtil {

	private static File logRoot;

	private static String LOGING = System.getProperty("sumk.log.union.login", "loging");
	private static String LOGED = System.getProperty("sumk.log.union.loged", "loged");
	private static String ERROR = System.getProperty("sumk.log.union.error", "error");

	public static void move2Loged(File logging) {
		if (logging == null) {
			return;
		}
		File dest = new File(getLogedPath(), logging.getName());
		File p = dest.getParentFile();
		if (!p.exists()) {
			p.mkdirs();
		}
		if (!logging.renameTo(dest)) {
			ConsoleLog.defaultLog.error(logging.getName() + " move to loged folder failed");
		}
	}

	public static void move2Error(File loged) {
		if (loged == null) {
			return;
		}
		File dest = new File(getErrorPath(), loged.getName());
		File p = dest.getParentFile();
		if (!p.exists()) {
			p.mkdirs();
		}
		if (!loged.renameTo(dest)) {
			ConsoleLog.defaultLog.error(loged.getName() + " move to error path failed");
		}
	}

	public static File getErrorPath() {
		return new File(getLogRoot(), ERROR);
	}

	public static File getLogedPath() {
		return new File(getLogRoot(), LOGED);
	}

	public static File getLogingPath() {
		return new File(getLogRoot(), LOGING);
	}

	private static File getLogRoot() {
		if (logRoot != null) {
			return logRoot;
		}
		logRoot = getDefaultLoginPath();
		ConsoleLog.defaultLog.info("logRoot:" + logRoot.getAbsolutePath());
		return logRoot;
	}

	private static File getDefaultLoginPath() {
		String path = System.getProperty("sumk.log.union.path");
		if (path != null && path.length() > 2) {
			return new File(path);
		}
		if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
			File f = new File("D:");
			if (f.exists() && f.getFreeSpace() > 2000) {
				return new File(f, "log\\sumk");
			}
			return new File("C:\\log\\sumk");
		}
		return new File("/log/sumk");
	}

	public static void appendLogObject(StringBuilder sb, LogObject log, String appId) throws IOException {
		UnsafeStringWriter stringWriter = new UnsafeStringWriter(sb);
		JsonWriter writer = new JsonWriter(stringWriter);
		writer.setSerializeNulls(false);
		writer.beginObject();
		writer.name("name").value(log.loggerName);
		writer.name("date").value(log.logDate.to_yyyy_MM_dd_HH_mm_ss_SSS());
		writer.name("userId").value(log.userId());
		writer.name("traceId").value(log.traceId());
		writer.name("spanId").value(log.spanId());
		if (log.isTest()) {
			writer.name("test").value(1);
		}
		String body = log.body;
		writer.name("body").value(body);
		writer.name("threadName").value(log.threadName);
		writer.name("level").value(log.methodLevel.name());
		writer.name("host").value(AppInfo.getLocalIp());
		if (appId != null) {
			writer.name("appId").value(appId);
		}
		writer.name("pid").value(AppInfo.pid());
		if (log.exception != null) {
			writer.name("exception").value(log.exception.getClass().getName());
			StringBuilder sb2 = new StringBuilder(100);
			ExceptionUtil.printStackTrace(sb2, log.exception);
			writer.name("exceptiondetail").value(sb2.toString());
			if (log.exception instanceof CodeException) {
				writer.name("exceptioncode").value(((CodeException) log.exception).getCode());
			}
		}
		if (log.codeLine != null) {
			writer.name("className").value(log.codeLine.className);
			writer.name("methodName").value(log.codeLine.methodName);
			writer.name("lineNumber").value(log.codeLine.lineNumber);
		}
		Map<String, String> attachs = log.attachments();
		if (attachs != null) {
			for (Entry<String, String> en : attachs.entrySet()) {
				writer.name("u_" + en.getKey()).value(en.getValue());
			}
		}
		writer.endObject();
		writer.flush();
		writer.close();
	}
}


================================================
FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogs.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.log.impl;

import java.util.Collections;
import java.util.Objects;

public final class UnionLogs {
	private static UnionLog unionLog = new DefaultUnionLog();

	public static UnionLog getUnionLog() {
		return unionLog;
	}

	public static void setUnionLog(UnionLog unionLog) {
		UnionLogs.unionLog = Objects.requireNonNull(unionLog);
	}

	public static boolean start() {
		return unionLog.start(Collections.emptyMap());
	}

}


================================================
FILE: async-logger/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider
================================================
org.slf4j.v2.SumkServiceProvider

================================================
FILE: async-logger/src/test/java/org/test/ProxyLog.java
================================================
package org.test;

import org.slf4j.spi.LocationAwareLogger;
import org.yx.log.Log;

public class ProxyLog {

	private static LocationAwareLogger log=(LocationAwareLogger)Log.get("proxy-log");
	private static final String FQCN=ProxyLog.class.getName();
	public static void log(String msg,Object... params) {
		log.log(null, FQCN, LocationAwareLogger.INFO_INT, msg, params, null);
	}
	
	public static void error(String msg,Throwable t) {
		log.log(null, FQCN, LocationAwareLogger.ERROR_INT, msg, null, t);
	}
}


================================================
FILE: async-logger/src/test/java/org/test/Starter.java
================================================
package org.test;

import org.junit.Test;
import org.slf4j.spi.LocationAwareLogger;
import org.yx.log.Log;
import org.yx.util.SumkThreadPool;

public class Starter {

	@Test
	public void test() {
		Log.get(this.getClass()).info("{} 只是个测试类",this.getClass().getSimpleName());
		org.apache.log4j.Logger.getLogger(this.getClass()).info("这是log4j的测试类");
		org.apache.logging.log4j.LogManager.getLogger(this.getClass()).warn("这是log4j 2.x的测试类");
		org.apache.logging.log4j.LogManager.getLogger(this.getClass()).error("如果使用log4j 2,请引入log4j-to-slf4j");
		ProxyLog.log("{}是{}的测试类","这个",LocationAwareLogger.class);
		ProxyLog.error("异常消息",new Exception("用于测试的异常"));
		
		Log.get(this.getClass()).atWarn().addArgument("李四").addKeyValue("key1", "marker1")
			.setMessage("name:{}").log();
		SumkThreadPool.shutdown();
	}
	
}


================================================
FILE: async-logger/src/test/java/org/test/UnionDemo.java
================================================
package org.test;

import java.util.List;

import org.junit.Test;
import org.yx.log.Log;
import org.yx.log.impl.DefaultUnionLog;
import org.yx.log.impl.UnionLogDao;
import org.yx.log.impl.UnionLogObject;
import org.yx.log.impl.UnionLogs;

public class UnionDemo {

	@Test
	public void test() throws InterruptedException {
		DefaultUnionLog unionLog=(DefaultUnionLog) UnionLogs.getUnionLog();
		unionLog.setDao(new UnionLogDao(){

			@Override
			public void flush(boolean idle) {
			}

			@Override
			public void store(List<UnionLogObject> logs) throws Exception {
				for(UnionLogObject log:logs){
					System.out.println(log.getLog());
				}
			}
		});
		UnionLogs.start();//启动统一日志
		
//		app.propertis中配置了unionTest写入到统一日志
		Log.get("unionTest").info("abc");
		Log.get("unionTest").info("222");
		Thread.sleep(1000);
	}

}


================================================
FILE: async-logger/src/test/resources/app.properties
================================================

sumk.ioc=org.yx

#用,或;做分隔符
sumk.log.level=info,org.apache.zookeeper:warn
sumk.log.console=1

#kv之间用=做分隔符,kv对之间用;做分隔符
s.log.day=path:D:\log\day-#.log; module:*

#统一日志的配置
sumk.unionlog.module=unionTest


================================================
FILE: pom.xml
================================================
<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>com.github.youtongluan</groupId>
	<artifactId>sumk</artifactId>
	<version>4.2.1</version>
	<packaging>pom</packaging>

	<name>com.github.youtongluan:sumk</name>
	<description>A quick developing framewort for internet company</description>
	<url>https://github.com/youtongluan/sumk</url>
	<licenses>
		<license>
			<name>The Apache License, Version 2.0</name>
			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
		</license>
	</licenses>
	<scm>
		<url>https://github.com/youtongluan/sumk</url>
		<connection>https://github.com/youtongluan/sumk.git</connection>
		<developerConnection>https://github.com/youtongluan/sumk</developerConnection>
	</scm>
	<distributionManagement>
	    <repository>
	        <id>ossrh</id>
	        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
	    </repository>
	    <snapshotRepository>
	        <id>ossrh</id>
	        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
	    </snapshotRepository>
	</distributionManagement>
	<developers>
		<developer>
			<name>youtongluan</name>
			<email>3205207767@qq.com</email>
			<url>https://www.oschina.net/p/sumk</url>
		</developer>
	</developers>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.test.skip>true</maven.test.skip>
		<slf4j-version>2.0.17</slf4j-version>
	</properties>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.apache.commons</groupId>
				<artifactId>commons-dbcp2</artifactId>
				<version>2.9.0</version>
				<exclusions>
					<exclusion>
						<artifactId>commons-logging</artifactId>
						<groupId>commons-logging</groupId>
					</exclusion>
				</exclusions>
			</dependency>

			<dependency>
				<groupId>com.google.code.gson</groupId>
				<artifactId>gson</artifactId>
				<version>2.10.1</version>
			</dependency>
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>8.0.33</version>
			</dependency>
			<dependency>
				<groupId>org.ow2.asm</groupId>
				<artifactId>asm</artifactId>
				<version>9.2</version>
			</dependency>
			<dependency>
				<groupId>redis.clients</groupId>
				<artifactId>jedis</artifactId>
				<version>3.7.0</version>
			</dependency>

			<dependency>
		  <groupId>org.slf4j</groupId>
		  <artifactId>slf4j-api</artifactId>
		  <version>${slf4j-version}</version>
		</dependency>
		<!-- log4j 输出到 slf4j,日志级别设置也由slf4j的实现类决定 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>${slf4j-version}</version>
		</dependency>
		<!-- commons-logging 输出到 slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${slf4j-version}</version>
		</dependency>

			<!-- 如果不用mybatis,这个可以去掉 -->
			<dependency>
				<groupId>org.mybatis</groupId>
				<artifactId>mybatis</artifactId>
				<version>3.5.0</version>
			</dependency>


			<!-- rpc中使用,如果不用rpc,可以去掉 -->
			<dependency>
				<groupId>org.apache.zookeeper</groupId>
				<artifactId>zookeeper</artifactId>
				<version>3.9.3</version>
			</dependency>
			<dependency>
				<groupId>io.netty</groupId>
				<artifactId>netty-handler</artifactId>
				<version>4.1.107.Final</version>
			</dependency>
			<dependency>
				<groupId>com.101tec</groupId>
				<artifactId>zkclient</artifactId>
				<version>0.11</version>
			</dependency>
			<!-- rpc中使用结束 -->

			<!-- http中使用,如果不用jetty,可以去掉 -->
			<dependency>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-servlet</artifactId>
				<version>9.4.51.v20230217</version>
			</dependency>

			<dependency>
				<groupId>org.apache.httpcomponents</groupId>
				<artifactId>httpasyncclient</artifactId>
				<version>4.0.2</version>
			</dependency>
			<dependency>
				<groupId>org.apache.httpcomponents</groupId>
				<artifactId>httpmime</artifactId>
				<version>4.2</version>
			</dependency>
			<!-- http中使用结束 -->

			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>4.13.2</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<modules>
		<module>sumk-base</module>
		<module>sumk-framework</module>
		<module>sumk-db</module>
		<module>sumk-http</module>
		<module>sumk-rpc</module>
		<module>sumk-rpc-mina</module>
		<module>async-logger</module>
	</modules>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<inherited>true</inherited>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-resources-plugin</artifactId>
				<executions>
					<execution>
						<id>copy-license</id>
						<phase>process-sources</phase>
						<goals>
							<goal>copy-resources</goal>
						</goals>
						<configuration>
							<outputDirectory>${basedir}/target/classes/META-INF</outputDirectory>
							<resources>
								<resource>
									<directory>${basedir}</directory>
									<includes>
										<include>LICENSE</include>
									</includes>
								</resource>
							</resources>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<skipTests>true</skipTests>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-gpg-plugin</artifactId>
				<version>1.6</version>
				<executions>
					<execution>
						<id>sign-artifacts</id>
						<phase>verify</phase>
						<goals>
							<goal>sign</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<skip>false</skip>
				</configuration>
			</plugin>
			<plugin>
	          <groupId>org.sonatype.central</groupId>
	          <artifactId>central-publishing-maven-plugin</artifactId>
	          <version>0.8.0</version>
	          <extensions>true</extensions>
	          <configuration>
	            <publishingServerId>central</publishingServerId>
	          </configuration>
        	</plugin>
		</plugins>
	</build>
</project>

================================================
FILE: sql.dtd
================================================
<?xml version="1.0" encoding="UTF-8" ?>

<!ELEMENT sdb (sql+)>
<!ATTLIST sdb
namespace CDATA #IMPLIED
>

<!ELEMENT sql (#PCDATA|if|ifnot|items|foreach)*>
<!ATTLIST sql
id ID #REQUIRED
>

<!ELEMENT if (#PCDATA|if|ifnot|items|foreach)*>
<!ATTLIST if
test CDATA #REQUIRED
falseby (null|nokey|empty) #IMPLIED
>

<!ELEMENT ifnot (#PCDATA|if|ifnot|items|foreach)*>
<!ATTLIST ifnot
test CDATA #REQUIRED
falseby (null|nokey|empty) #IMPLIED
>

<!ELEMENT items (if|ifnot|items|foreach)+>
<!ATTLIST items
separator CDATA #REQUIRED
open CDATA #IMPLIED
close CDATA #IMPLIED
>

<!ELEMENT foreach (#PCDATA)>
<!ATTLIST foreach
collection CDATA #REQUIRED
separator CDATA #REQUIRED
item CDATA #IMPLIED
open CDATA #IMPLIED
close CDATA #IMPLIED
>


================================================
FILE: sumk-base/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 youtongluan (\u6e38\u901a\u92ae\uff0c\u522b\u540d\uff1a\u6e38\u590f)

   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: sumk-base/pom.xml
================================================
<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>
	<parent>
		<groupId>com.github.youtongluan</groupId>
		<artifactId>sumk</artifactId>
		<version>4.2.1</version>
	</parent>
	<artifactId>sumk-base</artifactId>
	<name>com.github.youtongluan:sumk</name>
	<description>A quick developing framewort for internet company</description>
	<url>https://github.com/youtongluan/sumk</url>
	<licenses>
		<license>
			<name>The Apache License, Version 2.0</name>
			<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
		</license>
	</licenses>
	<scm>
		<url>https://github.com/youtongluan/sumk</url>
		<connection>https://github.com/youtongluan/sumk.git</connection>
		<developerConnection>https://github.com/youtongluan/sumk</developerConnection>
	</scm>
	<distributionManagement>
	    <repository>
	        <id>ossrh</id>
	        <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
	    </repository>
	    <snapshotRepository>
	        <id>ossrh</id>
	        <url>https://oss.sonatype.org/content/repositories/snapshots</url>
	    </snapshotRepository>
	</distributionManagement>
	<developers>
		<developer>
			<name>youtongluan</name>
			<email>3205207767@qq.com</email>
			<url>https://www.oschina.net/p/sumk</url>
		</developer>
	</developers>
	<dependencies>
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
		</dependency>
		<dependency>
		  <groupId>org.slf4j</groupId>
		  <artifactId>slf4j-api</artifactId>
		</dependency>
		<!-- log4j 输出到 slf4j,日志级别设置也由slf4j的实现类决定 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
		</dependency>
		<!-- commons-logging 输出到 slf4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

================================================
FILE: sumk-base/src/main/java/org/yx/annotation/doc/Comment.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.annotation.doc;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 备注信息。目前可用于@Web、@Soa、@Table、@Column
 *
 */
@Target({ ElementType.METHOD, ElementType.TYPE, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Comment {

	String value();

}


================================================
FILE: sumk-base/src/main/java/org/yx/annotation/doc/NotNull.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.annotation.doc;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 本注解是一种规范,约定该字段或者参数不为null。<BR>
 * 比如某个参数不能为null,而内部的方法,可能为了性能考虑,并没有做非空判断
 *
 */
@Target({ ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD, ElementType.LOCAL_VARIABLE })
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface NotNull {

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/Executable.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base;

/**
 * Runnable的替代品
 */
public interface Executable {
	void run() throws Throwable;
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/ItemJoiner.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base;

public final class ItemJoiner {

	public static ItemJoiner create(CharSequence delimiter, CharSequence pre, CharSequence suf) {
		return new ItemJoiner(delimiter, pre, suf);
	}

	private StringBuilder sb = new StringBuilder();
	private final CharSequence delimiter;
	private final CharSequence prefix;
	private final CharSequence suffix;
	private boolean hasDelimiter;

	public ItemJoiner(CharSequence delimiter, CharSequence pre, CharSequence suf) {
		this.delimiter = delimiter;
		this.prefix = pre;
		this.suffix = suf;
	}

	public ItemJoiner(CharSequence delimiter) {
		this(delimiter, null, null);
	}

	public ItemJoiner item() {
		if (sb.length() > 0) {
			sb.append(this.delimiter);
			hasDelimiter = true;
		}
		return this;
	}

	public ItemJoiner append(CharSequence v) {
		sb.append(v);
		return this;
	}

	public ItemJoiner append(char v) {
		sb.append(v);
		return this;
	}

	public ItemJoiner append(Object v) {
		sb.append(v);
		return this;
	}

	public ItemJoiner append(ItemJoiner item, CharSequence pre, CharSequence sub) {
		if (item == null) {
			return this;
		}
		if (item.hasDelimiter && pre != null) {
			sb.append(pre);
		}
		sb.append(item.toCharSequence());
		if (item.hasDelimiter && sub != null) {
			sb.append(sub);
		}
		return this;
	}

	public CharSequence toCharSequence() {
		return this.toCharSequence(false);
	}

	public CharSequence toCharSequence(boolean forcePreAndSubFix) {
		if (sb == null || sb.length() == 0) {
			return null;
		}
		if (!forcePreAndSubFix && !hasDelimiter) {
			return sb;
		}
		int len = sb.length();
		if (this.prefix != null) {
			len += this.prefix.length();
		}
		if (this.suffix != null) {
			len += this.suffix.length();
		}
		StringBuilder ret = new StringBuilder(len);
		if (this.prefix != null) {
			ret.append(this.prefix);
		}
		ret.append(sb);
		if (this.suffix != null) {
			ret.append(this.suffix);
		}
		return ret;
	}

	public boolean isEmpty() {
		return sb == null || sb.length() == 0;
	}

	@Override
	public String toString() {
		return String.valueOf(this.toCharSequence());
	}

	public ItemJoiner appendNotEmptyItem(CharSequence item) {
		if (item == null || item.length() == 0) {
			return this;
		}
		this.item().append(item);
		return this;
	}

	public void append(long v) {
		this.append(String.valueOf(v));
	}

	public void append(int v) {
		this.append(String.valueOf(v));
	}

	public ItemJoiner copy() {
		return new ItemJoiner(delimiter, prefix, suffix);
	}
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/Lifecycle.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base;

public interface Lifecycle {

	/**
	 * 如果抛出异常,会导致启动失败
	 */
	void start();

	void stop();
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/Ordered.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base;

public interface Ordered extends Comparable<Ordered> {

	public static int DEFAULT_ORDER = 100;

	/**
	 * 升序,值越大,优先级越低。一般不采用负数
	 * 
	 * @return 索引值
	 */
	default int order() {
		return DEFAULT_ORDER;
	}

	@Override
	default int compareTo(Ordered o) {
		return Integer.compare(this.order(), o.order());
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/StartOnceLifecycle.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base;

public abstract class StartOnceLifecycle implements Lifecycle {

	protected boolean started;

	@Override
	public final synchronized void start() {
		if (started) {
			return;
		}
		started = true;
		this.onStart();
	}

	protected abstract void onStart();

	@Override
	public void stop() {
		this.started = false;
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/context/ActionContext.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.context;

import java.util.Map;

import org.yx.base.Executable;
import org.yx.base.sumk.map.ListMap;
import org.yx.exception.SumkException;
import org.yx.log.Log;

public final class ActionContext implements Cloneable {

	private LogContext logContext;

	/**
	 * 用来做自增长的
	 */
	private int spanSeed;

	public boolean isTest() {
		return logContext.test;
	}

	ActionContext(LogContext logContext) {
		this.logContext = logContext;
	}

	public String act() {
		return logContext.act;
	}

	public String traceId() {
		return logContext.traceId;
	}

	public String spanId() {
		return logContext.spanId;
	}

	private static final ThreadLocal<ActionContext> holder = new ThreadLocal<ActionContext>() {

		@Override
		protected ActionContext initialValue() {

			return new ActionContext(LogContext.EMPTY);
		}

	};

	public static ActionContext newContext(String act, String traceId, boolean test) {
		return newContext(act, traceId, null, null, test, null);
	}

	public static ActionContext newContext(String act, String traceId, String spanId, String userId, boolean isTest,
			Map<String, String> attachments) {
		LogContext logContext = LogContext.create(act, traceId, spanId, userId, isTest && AppContext.inst().isTest(),
				attachments);
		return newContext(logContext);
	}

	public static ActionContext newContext(LogContext logContext) {
		ActionContext c = new ActionContext(logContext);
		holder.set(c);
		return c;
	}

	public static Runnable wrap(Runnable r) {
		ActionContext ac = ActionContext.current();
		return () -> {
			ActionContext.store(ac);
			try {
				r.run();
			} finally {
				ActionContext.remove();
			}
		};
	}

	public static Runnable wrapExecutable(Executable r) {
		ActionContext ac = ActionContext.current();
		return () -> {
			ActionContext.store(ac);
			try {
				r.run();
			} catch (Throwable e) {
				Log.get("sumk.execute").error(r + "异步执行出错," + e.getLocalizedMessage(), e);
			} finally {
				ActionContext.remove();
			}
		};
	}

	public static void store(ActionContext c) {
		holder.set(c);
	}

	public static ActionContext current() {
		return holder.get();
	}

	public static void remove() {
		holder.remove();
	}

	public void setTraceIdIfAbsent(String traceId) {
		LogContext lc = this.logContext;
		if (lc.traceId != null) {
			return;
		}
		this.logContext = LogContext.create(lc.act, traceId, lc.spanId, lc.userId, lc.test, lc.attachments);
	}

	public String userId() {
		return logContext.userId;
	}

	public void userId(String userId) {
		LogContext lc = this.logContext;
		this.logContext = LogContext.create(lc.act, lc.traceId, lc.spanId, userId, lc.test, lc.attachments);
	}

	public Map<String, String> attachmentView() {
		return logContext.attachments;
	}

	/**
	 * 设置上下文的附加属性
	 * 
	 * @param key   序列化后的长度要在255以内
	 * @param value 序列化后的长度要在60K以内。如果value为null,就相当于remove
	 */
	public void setAttachment(String key, String value) {
		if (value == null) {
			if (this.logContext.attachments != null) {
				Map<String, String> attachments = new ListMap<>(this.logContext.attachments);
				attachments.remove(key);
				this.logContext = LogContext.create(this.logContext, attachments);
			}
			return;
		}
		Map<String, String> attachments = this.logContext.attachments;
		attachments = attachments == null ? new ListMap<>() : new ListMap<>(attachments, 1);
		attachments.put(key, value);
		this.logContext = LogContext.create(this.logContext, attachments);
	}

	public String getAttachment(String key) {
		Map<String, String> attachments = this.logContext.attachments;
		if (attachments == null) {
			return null;
		}
		return attachments.get(key);
	}

	public String nextSpanId() {
		LogContext lc = this.logContext;
		if (lc.traceId == null) {
			return "1";
		}
		int seed;
		synchronized (this) {
			seed = ++this.spanSeed;
		}
		String sp = lc.spanId;
		if (sp == null) {
			return String.valueOf(seed);
		}
		return new StringBuilder().append(lc.spanId).append('.').append(seed).toString();
	}

	public LogContext logContext() {
		return this.logContext;
	}

	@Override
	public ActionContext clone() {
		try {
			return (ActionContext) super.clone();
		} catch (CloneNotSupportedException e) {
			throw new SumkException(8234235, "clone not supported");
		}
	}
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/context/AppContext.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.context;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.yx.conf.AppInfo;

/**
 * 这个只在系统启动的时候才能使用
 */
public final class AppContext {

	private static AppContext inst = new AppContext();
	private volatile boolean started;
	private volatile boolean destoryed;
	private boolean test;

	public static AppContext inst() {
		return inst;
	}

	private AppContext() {

	}

	private final ConcurrentMap<String, Object> map = new ConcurrentHashMap<>();

	public void put(String key, Object obj) {
		map.put(key, obj);
	}

	public void put(Class<?> clz, Object obj) {
		map.put(clz.getName(), obj);
	}

	public Object get(String key) {
		return map.get(key);
	}

	public Object get(Class<?> clz) {
		return map.get(clz.getName());
	}

	public <T> T get(Class<T> clz, T defaultObject) {
		String key = clz.getName();
		Object old = map.get(key);
		return clz.isInstance(old) ? clz.cast(old) : defaultObject;
	}

	public static void clear() {
		inst = new AppContext();
	}

	public static void startFailed() {
		if (AppInfo.getBoolean("sumk.exitIfStartFail", true)) {
			System.exit(1);
		}
	}

	public String getAppInfo(String key, String defaultV) {
		Object v = map.get(key);

		if (v instanceof String) {
			return (String) v;
		}
		return AppInfo.get(key, defaultV);
	}

	public boolean isStarted() {
		return started;
	}

	public boolean isDestoryed() {
		return destoryed;
	}

	public void resetStatus() {
		started = false;
		destoryed = false;
	}

	public void setStatusToStarted() {
		started = true;
		destoryed = false;
	}

	public void setStatusToDestoryed() {
		started = false;
		destoryed = true;
	}

	public boolean isTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/context/LogContext.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.context;

import java.util.Map;

import org.yx.util.CollectionUtil;
import org.yx.util.StringUtil;

public final class LogContext {
	static final LogContext EMPTY = new LogContext(null, null, null, null, false, null);

	public final String act;

	public final String traceId;

	public final String spanId;

	public final String userId;

	public final boolean test;

	final Map<String, String> attachments;

	public static LogContext create(String act, String traceId, String spanId, String userId, boolean test,
			Map<String, String> attachments) {
		if (attachments != null && attachments.size() > 0) {
			return new LogContext(act, traceId, spanId, userId, test, attachments);
		}

		if (act == null && traceId == null && spanId == null && userId == null && !test) {
			return EMPTY;
		}
		return new LogContext(act, traceId, spanId, userId, test, null);
	}

	public static LogContext create(LogContext lc, Map<String, String> attachments) {
		return create(lc.act, lc.traceId, lc.spanId, lc.userId, lc.test, attachments);
	}

	private LogContext(String act, String traceId, String spanId, String userId, boolean test,
			Map<String, String> attachments) {
		this.act = act;
		this.traceId = StringUtil.isEmpty(traceId) ? null : traceId;
		this.spanId = spanId;
		this.userId = userId;
		this.test = test;
		this.attachments = attachments == null ? null : CollectionUtil.unmodifyMap(attachments);
	}

	public static LogContext empty() {
		return EMPTY;
	}

	public Map<String, String> unmodifiedAttachs() {
		return this.attachments;
	}

	public String getAct() {
		return act;
	}

	public String getTraceId() {
		return traceId;
	}

	public String getSpanId() {
		return spanId;
	}

	public String getUserId() {
		return userId;
	}

	public boolean isTest() {
		return test;
	}
}

================================================
FILE: sumk-base/src/main/java/org/yx/base/date/DateAdapters.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

import org.yx.util.SumkDate;

import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

public final class DateAdapters {

	public static void registerAll(GsonBuilder builder) {
		builder.registerTypeAdapter(LocalDateTime.class, localDateTimeAdapter);
		builder.registerTypeAdapter(LocalDate.class, localDateAdapter);
		builder.registerTypeAdapter(LocalTime.class, localTimeAdapter);
		builder.registerTypeAdapter(SumkDate.class, sumkDateAdapter);
		builder.registerTypeAdapter(java.sql.Date.class, sqlDateAdapter);
	}

	public static final TypeAdapter<LocalDateTime> localDateTimeAdapter = new TypeAdapter<LocalDateTime>() {

		@Override
		public void write(JsonWriter out, LocalDateTime value) throws IOException {
			if (value == null) {
				out.nullValue();
				return;
			}
			out.value(SumkDate.of(value).to_yyyy_MM_dd_HH_mm_ss_SSS());
		}

		@Override
		public LocalDateTime read(JsonReader in) throws IOException {
			if (in.peek() == JsonToken.NULL) {
				in.nextNull();
				return null;
			}
			String v = in.nextString();
			return SumkDate.of(v).toLocalDateTime();
		}
	};

	public static final TypeAdapter<LocalDate> localDateAdapter = new TypeAdapter<LocalDate>() {

		@Override
		public void write(JsonWriter out, LocalDate value) throws IOException {
			if (value == null) {
				out.nullValue();
				return;
			}
			out.value(SumkDate.of(value, null).to_yyyy_MM_dd());
		}

		@Override
		public LocalDate read(JsonReader in) throws IOException {
			if (in.peek() == JsonToken.NULL) {
				in.nextNull();
				return null;
			}
			String v = in.nextString();
			return SumkDate.of(v, SumkDate.yyyy_MM_dd).toLocalDate();
		}
	};

	public static final TypeAdapter<LocalTime> localTimeAdapter = new TypeAdapter<LocalTime>() {

		@Override
		public void write(JsonWriter out, LocalTime value) throws IOException {
			if (value == null) {
				out.nullValue();
				return;
			}
			out.value(SumkDate.of(null, value).to_HH_mm_ss_SSS());
		}

		@Override
		public LocalTime read(JsonReader in) throws IOException {
			if (in.peek() == JsonToken.NULL) {
				in.nextNull();
				return null;
			}
			String v = in.nextString();
			return SumkDate.of(v, SumkDate.HH_mm_ss_SSS).toLocalTime();
		}
	};

	public static final TypeAdapter<SumkDate> sumkDateAdapter = new TypeAdapter<SumkDate>() {

		@Override
		public void write(JsonWriter out, SumkDate sd) throws IOException {
			if (sd == null) {
				out.nullValue();
				return;
			}
			out.value(sd.to_yyyy_MM_dd_HH_mm_ss_SSS());
		}

		@Override
		public SumkDate read(JsonReader in) throws IOException {
			if (in.peek() == JsonToken.NULL) {
				in.nextNull();
				return null;
			}
			String v = in.nextString();
			try {
				return SumkDate.of(v);
			} catch (Exception e) {
				String num = v;
				if (num.contains(".")) {
					num = num.substring(0, num.indexOf('.'));
				}
				return SumkDate.of(Long.parseLong(num));
			}
		}
	};

	public static final TypeAdapter<java.sql.Date> sqlDateAdapter = new TypeAdapter<java.sql.Date>() {

		@Override
		public void write(JsonWriter out, java.sql.Date d) throws IOException {
			if (d == null) {
				out.nullValue();
				return;
			}
			out.value(SumkDate.of(d).to_yyyy_MM_dd());
		}

		@Override
		public java.sql.Date read(JsonReader in) throws IOException {
			if (in.peek() == JsonToken.NULL) {
				in.nextNull();
				return null;
			}
			String v = in.nextString();
			return TimeUtil.toType(SumkDate.of(v, SumkDate.yyyy_MM_dd), java.sql.Date.class, true);
		}
	};
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/DateFormater.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import org.yx.util.SumkDate;

/**
 * yyyy-MM-dd
 */
public final class DateFormater implements SumkDateFormater {

	public static final DateFormater inst = new DateFormater();

	@Override
	public int order() {
		return 50;
	}

	@Override
	public SumkDate parse(String text) {
		int firstIndex = text.length() - 6;
		int year = Integer.parseInt(text.substring(0, firstIndex));
		int month = Integer.parseInt(text.substring(firstIndex + 1, firstIndex + 3));
		int day = Integer.parseInt(text.substring(firstIndex + 4));
		return SumkDate.of(year, month, day, 0, 0, 0, 0);
	}

	@Override
	public boolean accept(String format) {
		return format.length() == 10 && format.regionMatches(0, "yyyy", 0, 4) && format.regionMatches(5, "MM", 0, 2)
				&& format.endsWith("dd");
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/DateTimeFormater.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import org.yx.util.SumkDate;

/**
 * yyyy-MM-dd HH:mm:ss
 */
public final class DateTimeFormater implements SumkDateFormater {

	public static final DateTimeFormater inst = new DateTimeFormater();

	private DateTimeFormater() {

	}

	@Override
	public int order() {
		return 20;
	}

	@Override
	public SumkDate parse(String text) {
		int firstIndex = text.length() - 15;
		int year = Integer.parseInt(text.substring(0, firstIndex));
		int month = Integer.parseInt(text.substring(firstIndex + 1, firstIndex + 3));
		int day = Integer.parseInt(text.substring(firstIndex + 4, firstIndex + 6));
		int hour = Integer.parseInt(text.substring(firstIndex + 7, firstIndex + 9));
		int minute = Integer.parseInt(text.substring(firstIndex + 10, firstIndex + 12));
		int second = Integer.parseInt(text.substring(firstIndex + 13));
		return SumkDate.of(year, month, day, hour, minute, second, 0);
	}

	@Override
	public boolean accept(String format) {
		return format.length() == 19 && format.regionMatches(0, "yyyy", 0, 4) && format.regionMatches(5, "MM", 0, 2)
				&& format.regionMatches(8, "dd", 0, 2) && format.regionMatches(11, "HH", 0, 2)
				&& format.regionMatches(14, "mm", 0, 2) && format.endsWith("ss");
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/DateTimeTypeAdapter.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import java.io.IOException;
import java.util.Date;

import org.yx.util.StringUtil;
import org.yx.util.SumkDate;

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

public final class DateTimeTypeAdapter extends TypeAdapter<Date> {

	private String dateFormat = SumkDate.yyyy_MM_dd_HH_mm_ss_SSS;

	public void setDateFormat(String format) {
		if (StringUtil.isEmpty(format)) {
			this.dateFormat = null;
		}
		this.dateFormat = format;
	}

	@Override
	public Date read(JsonReader in) throws IOException {
		if (in.peek() == JsonToken.NULL) {
			in.nextNull();
			return null;
		}
		return deserializeToDate(in.nextString());
	}

	private Date deserializeToDate(final String text) throws IOException {
		try {
			return SumkDate.of(text).toDate();
		} catch (Exception e) {
		}
		String num = text;
		if (num.contains(".")) {

			num = num.substring(0, num.indexOf('.'));
		}
		return new Date(Long.parseLong(num));
	}

	@Override
	public void write(JsonWriter out, Date value) throws IOException {
		if (value == null) {
			out.nullValue();
			return;
		}
		if (this.dateFormat == null) {
			out.value(value.getTime());
			return;
		}
		out.value(SumkDate.format(value, this.dateFormat));
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/FullDateTimeFormater.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import org.yx.util.StringUtil;
import org.yx.util.SumkDate;

public final class FullDateTimeFormater implements SumkDateFormater {
	public static final FullDateTimeFormater inst = new FullDateTimeFormater();

	private FullDateTimeFormater() {

	}

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

	@Override
	public SumkDate parse(String text) {
		int dotIndex = text.length() - 1;
		for (; dotIndex > 15; dotIndex--) {
			char c = text.charAt(dotIndex);
			if (!StringUtil.isNumber(c)) {
				break;
			}
		}
		String textMil = text.substring(dotIndex + 1);
		int mils = Integer.parseInt(textMil);
		if (textMil.length() == 1) {
			mils *= 100;
		} else if (textMil.length() == 2) {
			mils *= 10;
		}
		int second = Integer.parseInt(text.substring(dotIndex - 2, dotIndex));
		int minute = Integer.parseInt(text.substring(dotIndex - 5, dotIndex - 3));
		int hour = Integer.parseInt(text.substring(dotIndex - 8, dotIndex - 6));
		int day = Integer.parseInt(text.substring(dotIndex - 11, dotIndex - 9));
		int month = Integer.parseInt(text.substring(dotIndex - 14, dotIndex - 12));
		int year = Integer.parseInt(text.substring(0, dotIndex - 15));
		return SumkDate.of(year, month, day, hour, minute, second, mils);
	}

	@Override
	public boolean accept(String format) {
		return format.length() == 23 && format.regionMatches(0, "yyyy", 0, 4) && format.regionMatches(5, "MM", 0, 2)
				&& format.regionMatches(8, "dd", 0, 2) && format.regionMatches(11, "HH", 0, 2)
				&& format.regionMatches(14, "mm", 0, 2) && format.regionMatches(17, "ss", 0, 2)
				&& format.endsWith("SSS");
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/SumkDateFormater.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import org.yx.base.Ordered;
import org.yx.util.SumkDate;

public interface SumkDateFormater extends Ordered {
	SumkDate parse(String text);

	boolean accept(String format);
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/SumkDateQuery.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalQueries;
import java.time.temporal.TemporalQuery;

import org.yx.util.SumkDate;

public class SumkDateQuery implements TemporalQuery<SumkDate> {
	public static final SumkDateQuery inst = new SumkDateQuery();

	@Override
	public SumkDate queryFrom(TemporalAccessor temporal) {
		if (temporal instanceof LocalDateTime) {
			return SumkDate.of((LocalDateTime) temporal);
		} else if (temporal instanceof ZonedDateTime) {
			LocalDateTime dt = ((ZonedDateTime) temporal).toLocalDateTime();
			return SumkDate.of(dt);
		} else if (temporal instanceof OffsetDateTime) {
			LocalDateTime dt = ((OffsetDateTime) temporal).toLocalDateTime();
			return SumkDate.of(dt);
		}
		LocalDate date = temporal.query(TemporalQueries.localDate());
		LocalTime time = temporal.query(TemporalQueries.localTime());
		if (date == null && time == null) {
			return null;
		}
		return SumkDate.of(date, time);
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/date/TimeUtil.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.date;

import java.sql.Time;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;

import org.yx.exception.SumkException;
import org.yx.util.SumkDate;

public class TimeUtil {

	public static final int DATETIME_CONVERT = 912753916;

	public static boolean isGenericDate(Class<?> type) {
		return type == Date.class || type == java.sql.Date.class || type == Time.class || type == Timestamp.class
				|| type == LocalDate.class || type == LocalTime.class || type == LocalDateTime.class
				|| type == SumkDate.class;
	}

	@SuppressWarnings("unchecked")
	public static <T> T toType(Object v, Class<?> type, boolean failIfNotSupport) {
		if (v.getClass() == type) {
			return (T) v;
		}
		if (type == SumkDate.class) {
			return toSumkDate(v, failIfNotSupport);
		}
		if (v instanceof Date) {
			return toType((Date) v, type, failIfNotSupport);
		}
		Class<?> sourceClz = v.getClass();
		if (LocalDateTime.class == sourceClz) {
			return toType((LocalDateTime) v, type, failIfNotSupport);
		}

		if (LocalDate.class == sourceClz) {
			return toType((LocalDate) v, type, failIfNotSupport);
		}

		if (LocalTime.class == sourceClz) {
			return toType((LocalTime) v, type, failIfNotSupport);
		}
		if (SumkDate.class == sourceClz) {
			return toType((SumkDate) v, type, failIfNotSupport);
		}

		if (failIfNotSupport || !isGenericDate(type)) {
			throw new SumkException(1234345, type.getClass().getName() + " cannot convert to " + type.getName());
		}
		return (T) v;
	}

	@SuppressWarnings("unchecked")
	private static <T> T toSumkDate(Object v, boolean failIfNotSupport) {
		if (v instanceof Date) {
			return (T) SumkDate.of((Date) v);
		}
		if (v instanceof LocalDateTime) {
			return (T) SumkDate.of((LocalDateTime) v);
		}
		if (v instanceof LocalDate) {
			return (T) SumkDate.of((LocalDate) v, null);
		}
		if (v instanceof LocalTime) {
			return (T) SumkDate.of(null, (LocalTime) v);
		}
		if (failIfNotSupport) {
			throw new SumkException(63414353, v.getClass().getName() + "is not supported Date type");
		}
		return (T) v;
	}

	@SuppressWarnings({ "unchecked", "deprecation" })
	private static <T> T toType(SumkDate v, Class<?> type, boolean failIfNotSupport) {
		if (Date.class == type) {
			return (T) v.toDate();
		}
		if (java.sql.Date.class == type) {
			return (T) java.sql.Date.valueOf(v.toLocalDate());
		}

		if (Timestamp.class == type) {
			return (T) v.toTimestamp();
		}

		if (Time.class == type) {
			return (T) new Time(v.getHour(), v.getMinute(), v.getSecond());
		}

		if (LocalDate.class == type) {
			return (T) v.toLocalDate();
		}

		if (LocalDateTime.class == type) {
			return (T) v.toLocalDateTime();
		}

		if (LocalTime.class == type) {
			return (T) v.toLocalTime();
		}
		if (failIfNotSupport || !isGenericDate(type)) {
			throw new SumkException(63414353, type.getClass().getName() + "is not supported Date type");
		}
		return (T) v;
	}

	@SuppressWarnings({ "unchecked", "deprecation" })
	private static <T> T toType(Date v, Class<?> type, boolean failIfNotSupport) {
		long time = v.getTime();
		if (Date.class == type) {
			return (T) new Date(time);
		}
		if (java.sql.Date.class == type) {
			if (Time.class == v.getClass()) {
				throw new SumkException(DATETIME_CONVERT, "Time cannot convert to java.sql.Date");
			}
			return (T) new java.sql.Date(v.getYear(), v.getMonth(), v.getDate());
		}

		if (Timestamp.class == type) {
			return (T) new Timestamp(time);
		}

		if (Time.class == type) {
			if (java.sql.Date.class == v.getClass()) {
				throw new SumkException(DATETIME_CONVERT, "java.sql.Date cannot convert to Time");
			}
			return (T) new Time(v.getHours(), v.getMinutes(), v.getSeconds());
		}
		SumkDate sumk = SumkDate.of(v);

		if (LocalDate.class == type) {
			if (Time.class == v.getClass()) {
				throw new SumkException(DATETIME_CONVERT, "Time cannot convert to LocalDate");
			}
			return (T) sumk.toLocalDate();
		}

		if (LocalDateTime.class == type) {
			return (T) sumk.toLocalDateTime();
		}

		if (LocalTime.class == type) {
			if (java.sql.Date.class == v.getClass()) {
				throw new SumkException(DATETIME_CONVERT, "java.sql.Date cannot convert to LocalTime");
			}
			return (T) sumk.toLocalTime();
		}
		if (failIfNotSupport || !isGenericDate(type)) {
			throw new SumkException(63414353, type.getClass().getName() + "is not supported Date type");
		}
		return (T) v;
	}

	@SuppressWarnings("unchecked")
	private static <T> T toType(LocalDateTime v, Class<?> type, boolean failIfNotSupport) {
		if (Date.class == type) {
			return (T) Date.from(v.atZone(ZoneId.systemDefault()).toInstant());
		}
		if (java.sql.Date.class == type) {
			return (T) java.sql.Date.valueOf(v.toLocalDate());
		}

		if (Timestamp.class == type) {
			return (T) Timestamp.valueOf(v);
		}

		if (Time.class == type) {
			return (T) Time.valueOf(v.toLocalTime());
		}

		if (LocalDate.class == type) {
			return (T) v.toLocalDate();
		}

		if (LocalTime.class == type) {
			return (T) v.toLocalTime();
		}

		if (failIfNotSupport || !isGenericDate(type)) {
			throw new SumkException(DATETIME_CONVERT, type.getClass().getName() + "is not a supported Date type");
		}
		return (T) v;
	}

	@SuppressWarnings({ "unchecked", "deprecation" })
	private static <T> T toType(LocalDate v, Class<?> type, boolean failIfNotSupport) {
		if (Date.class == type) {
			return (T) new Date(v.getYear() - 1900, v.getMonthValue() - 1, v.getDayOfMonth());
		}
		if (java.sql.Date.class == type) {
			return (T) java.sql.Date.valueOf(v);
		}

		if (Timestamp.class == type) {
			LocalDateTime dt = LocalDateTime.of(v, LocalTime.of(0, 0));
			return (T) Timestamp.valueOf(dt);
		}

		if (Time.class == type) {
			throw new SumkException(DATETIME_CONVERT, "LocalDate cannot convert to Time");
		}

		if (LocalDateTime.class == type) {
			return (T) LocalDateTime.of(v, LocalTime.of(0, 0));
		}

		if (LocalTime.class == type) {
			throw new SumkException(DATETIME_CONVERT, "LocalDate cannot convert to LocalTime");
		}

		if (failIfNotSupport || !isGenericDate(type)) {
			throw new SumkException(DATETIME_CONVERT, type.getClass().getName() + "is not a supported Date type");
		}
		return (T) v;
	}

	@SuppressWarnings("unchecked")
	private static <T> T toType(LocalTime v, Class<?> type, boolean failIfNotSupport) {
		if (Date.class == type) {
			return (T) new Date(Time.valueOf(v).getTime());
		}
		if (java.sql.Date.class == type) {
			throw new SumkException(DATETIME_CONVERT, "LocalTime cannot convert to java.sql.Date");
		}

		if (Timestamp.class == type) {
			return (T) new Timestamp(Time.valueOf(v).getTime());
		}

		if (Time.class == type) {
			return (T) Time.valueOf(v);
		}

		if (LocalDateTime.class == type) {
			return (T) LocalDateTime.of(LocalDate.ofEpochDay(0), v);
		}

		if (LocalDate.class == type) {
			throw new SumkException(DATETIME_CONVERT, "LocalTime cannot convert to LocalDate");
		}

		if (failIfNotSupport || !isGenericDate(type)) {
			throw new SumkException(DATETIME_CONVERT, type.getClass().getName() + "is not a supported Date type");
		}
		return (T) v;
	}
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/matcher/BooleanMatcher.java
================================================
package org.yx.base.matcher;

import java.util.function.Predicate;

public enum BooleanMatcher implements Predicate<String> {

	FALSE(false), TRUE(true);

	private final boolean matched;

	private BooleanMatcher(boolean matched) {
		this.matched = matched;
	}

	@Override
	public boolean test(String text) {
		return matched;
	}

	@Override
	public Predicate<String> negate() {
		return this.matched ? FALSE : TRUE;
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/matcher/InOutMatcher.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.matcher;

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

public class InOutMatcher implements Predicate<String> {

	private final Predicate<String> include;
	private final Predicate<String> exclude;

	InOutMatcher(Predicate<String> include, Predicate<String> exclude) {
		this.include = Objects.requireNonNull(include);
		this.exclude = Objects.requireNonNull(exclude);
	}

	@Override
	public boolean test(String t) {
		if (exclude.test(t)) {
			return false;
		}
		return include.test(t);
	}

	@Override
	public String toString() {
		return "[include: " + include + ", exclude: " + exclude + "]";
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/matcher/Matchers.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.matcher;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Predicate;

import org.yx.base.matcher.WildcardMatcher.HeadAndTail;
import org.yx.log.RawLog;
import org.yx.util.CollectionUtil;
import org.yx.util.StringUtil;

public class Matchers {

	/**
	 * 表达式的分隔符
	 */
	public static final String SPLIT = ",";

	public static final String WILDCARD = "*";

	public static Predicate<String> createWildcardMatcher(String patterns) {
		return createWildcardMatcher(patterns, 1);
	}

	public static Predicate<String> createWildcardMatcher(String patterns, int minPatternLength) {
		if (patterns == null || patterns.isEmpty()) {
			return BooleanMatcher.FALSE;
		}
		String[] array = StringUtil.toLatin(patterns).split(SPLIT);
		return createWildcardMatcher(CollectionUtil.unmodifyList(array), minPatternLength);
	}

	/**
	 * 创建表达式。这里的表达式不做全角半角处理,也不对逗号做分割,但允许包含null
	 * 
	 * @param patterns         表达式字符串列表,支持为null。这里的每一个都是最小的表达式,不支持内部再含有逗号
	 * @param minPatternLength 最小长度,会忽略pattern长度小于这个最小长度的
	 * @return 表达式判断器
	 */
	public static Predicate<String> createWildcardMatcher(Collection<String> patterns, int minPatternLength) {
		if (patterns == null || patterns.isEmpty()) {
			return BooleanMatcher.FALSE;
		}
		Set<String> exact = new HashSet<>();
		Set<String> matchStart = new HashSet<>();
		Set<String> matchEnd = new HashSet<>();
		Set<String> matchContain = new HashSet<>();
		Set<HeadAndTail> headAndTailMatch = new HashSet<>();
		final String doubleWild = WILDCARD + WILDCARD;
		for (String s : patterns) {
			if (s == null || (s = s.trim()).isEmpty()) {
				continue;
			}
			if (s.length() < minPatternLength) {
				RawLog.warn("sumk.conf", "[" + s + "]的长度太短,被忽略.最小长度为:" + minPatternLength);
				continue;
			}

			if (WILDCARD.equals(s) || doubleWild.equals(s)) {
				return BooleanMatcher.TRUE;
			}

			int wildCount = s.length() - s.replace(WILDCARD, "").length();
			if (wildCount > 2) {
				RawLog.warn("sumk.conf", "[" + s + "]的*出现次数超过2次,将被忽略");

			}
			if (wildCount == 0) {
				exact.add(s);
				continue;
			}
			int firstIndex = s.indexOf(WILDCARD);
			if (wildCount == 1) {
				if (firstIndex == 0) {
					matchEnd.add(s.substring(1));
					continue;
				}
				if (firstIndex == s.length() - 1) {
					matchStart.add(s.substring(0, firstIndex));
					continue;
				}
				HeadAndTail h = new HeadAndTail(s.substring(0, firstIndex), s.substring(firstIndex + 1));
				headAndTailMatch.add(h);
			}
			if (wildCount == 2) {
				if (firstIndex == 0 && s.endsWith(WILDCARD)) {
					matchContain.add(s.substring(1, s.length() - 1));
					continue;
				}
				RawLog.warn("sumk.conf", "[" + s + "]的*不出现了2次,但不在头尾,将被忽略");
				continue;
			}

		}

		if (exact.isEmpty() && matchStart.isEmpty() && matchEnd.isEmpty() && matchContain.isEmpty()
				&& headAndTailMatch.isEmpty()) {
			return BooleanMatcher.FALSE;
		}

		return new WildcardMatcher(exact, matchStart, matchEnd, matchContain, headAndTailMatch);
	}

	/**
	 * 创建InOutMatcher、BooleanMatcher或其它Matcher
	 * 
	 * @param include 可以匹配的Predicate,不能为null
	 * @param exclude 被排除的Predicate,不能为null
	 * @return 返回值有可能是InOutMatcher类型,也有可能是BooleanMatcher
	 */
	public static Predicate<String> includeAndExclude(Predicate<String> include, Predicate<String> exclude) {
		if (exclude == BooleanMatcher.FALSE) {
			return include;
		}
		if (include == BooleanMatcher.FALSE || exclude == BooleanMatcher.TRUE) {
			return BooleanMatcher.FALSE;
		}
		return new InOutMatcher(include, exclude);
	}

	public static Predicate<String> includeAndExclude(String include, String exclude) {
		return includeAndExclude(createWildcardMatcher(include), createWildcardMatcher(exclude));
	}
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/matcher/WildcardMatcher.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.matcher;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.function.Predicate;

import org.yx.base.ItemJoiner;
import org.yx.util.CollectionUtil;

/**
 * 或类型的匹配,只要能匹配中一个条件,就认为匹配成功
 *
 */
public class WildcardMatcher implements Predicate<String> {

	private final Set<String> exacts;

	private final String[] matchStarts;

	private final String[] matchEnds;

	private final String[] contains;

	private final HeadAndTail[] headTails;

	WildcardMatcher(Set<String> exacts, Set<String> matchStart, Set<String> matchEnd, Set<String> matchContain,
			Set<HeadAndTail> headAndTailMatch) {
		this.exacts = CollectionUtil.isEmpty(exacts) ? null : new HashSet<>(exacts);
		this.matchStarts = toArray(matchStart);
		this.matchEnds = toArray(matchEnd);
		this.contains = toArray(matchContain);
		this.headTails = CollectionUtil.isEmpty(headAndTailMatch) ? null
				: headAndTailMatch.toArray(new HeadAndTail[headAndTailMatch.size()]);
	}

	private String[] toArray(Collection<String> src) {
		if (CollectionUtil.isEmpty(src)) {
			return null;
		}
		return src.toArray(new String[src.size()]);
	}

	@Override
	public boolean test(String text) {

		if (this.exacts != null && this.exacts.contains(text)) {

			return true;
		}

		if (this.matchStarts != null) {
			for (String start : this.matchStarts) {
				if (text.startsWith(start)) {

					return true;
				}
			}
		}

		if (this.matchEnds != null) {
			for (String end : this.matchEnds) {
				if (text.endsWith(end)) {

					return true;
				}
			}
		}

		if (this.contains != null) {
			for (String c : this.contains) {
				if (text.contains(c)) {
					return true;
				}
			}
		}

		if (this.headTails != null) {
			for (HeadAndTail ht : this.headTails) {
				if (ht.test(text)) {
					return true;
				}
			}
		}
		return false;
	}

	public Collection<String> exacts() {
		return exacts == null ? null : Collections.unmodifiableSet(exacts);
	}

	public List<String> matchStarts() {
		return CollectionUtil.unmodifyList(matchStarts);
	}

	public List<String> matchEnds() {
		return CollectionUtil.unmodifyList(matchEnds);
	}

	public List<String> contains() {
		return CollectionUtil.unmodifyList(contains);
	}

	@Override
	public String toString() {
		ItemJoiner join = new ItemJoiner(",");
		if (exacts != null) {
			join.item().append("exacts:").append(exacts);
		}
		if (matchStarts != null) {
			join.item().append("matchStarts:").append(Arrays.toString(matchStarts));
		}
		if (matchEnds != null) {
			join.item().append("matchEnds:").append(Arrays.toString(matchEnds));
		}
		if (contains != null) {
			join.item().append("contains:").append(Arrays.toString(contains));
		}
		if (headTails != null) {
			join.item().append("headTails:").append(Arrays.toString(headTails));
		}
		return join.toString();
	}

	public static final class HeadAndTail implements Predicate<String> {
		final String head;
		final String tail;

		public HeadAndTail(String head, String tail) {
			this.head = Objects.requireNonNull(head);
			this.tail = Objects.requireNonNull(tail);
		}

		@Override
		public boolean test(String text) {
			if (text.length() < head.length() + tail.length()) {
				return false;
			}
			return text.startsWith(head) && text.endsWith(tail);
		}

		@Override
		public String toString() {
			return "HeadAndTail [head=" + head + ", tail=" + tail + "]";
		}
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/scaner/ClassScaner.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.scaner;

import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;

import org.yx.util.Loader;

public final class ClassScaner {

	private static Function<Collection<String>, Collection<String>> scaner = new FileNameScaner(".class");

	public static Function<Collection<String>, Collection<String>> getScaner() {
		return scaner;
	}

	public static void setScaner(Function<Collection<String>, Collection<String>> scaner) {
		ClassScaner.scaner = Objects.requireNonNull(scaner);
	}

	public static <T> Set<Class<? extends T>> subClassesInSameOrSubPackage(Class<T> baseClz)
			throws ClassNotFoundException {
		return list(baseClz.getPackage().getName(), baseClz);
	}

	@SuppressWarnings("unchecked")
	public static <T> Set<Class<? extends T>> list(String packageName, Class<T> baseClz) throws ClassNotFoundException {
		Collection<String> clzNames = listClasses(Collections.singletonList(packageName));
		if (clzNames == null || clzNames.isEmpty()) {
			return Collections.emptySet();
		}
		Set<String> names = new HashSet<>(clzNames);
		Set<Class<? extends T>> set = new HashSet<>();
		for (String className : names) {
			Class<?> clz = Loader.loadClass(className);
			if (baseClz.isAssignableFrom(clz) && (!clz.isInterface())
					&& ((clz.getModifiers() & Modifier.ABSTRACT) == 0)) {
				set.add((Class<? extends T>) clz);
			}
		}
		return set;
	}

	public static Collection<String> listClasses(Collection<String> packageNames) {
		return scaner.apply(packageNames);
	}
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/scaner/FileNameScaner.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.scaner;

import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.slf4j.Logger;
import org.yx.exception.SumkException;
import org.yx.log.Logs;
import org.yx.util.Loader;
import org.yx.util.StringUtil;

public final class FileNameScaner implements Function<Collection<String>, Collection<String>> {
	private final String subfix;

	public FileNameScaner(String subfix) {
		this.subfix = Objects.requireNonNull(subfix);
	}

	@Override
	public Collection<String> apply(Collection<String> packageNames) {
		Logger log = Logs.system();
		Set<String> classNameSet = new HashSet<>(240);
		if (packageNames == null || packageNames.isEmpty()) {
			return classNameSet;
		}
		String packagePath;
		File file;
		URL url;
		Enumeration<URL> eUrl;
		for (String packageName : packageNames) {
			packagePath = StringUtil.toLatin(packageName).trim().replace('.', '/');
			if (packagePath.isEmpty()) {
				continue;
			}
			if (!packagePath.endsWith("/")) {
				packagePath += "/";
			}
			try {
				eUrl = Loader.getResources(packagePath);
				while (eUrl.hasMoreElements()) {
					url = eUrl.nextElement();
					log.debug("find {}", url.getFile());
					if (JarFileUtil.URL_PROTOCOL_JAR.equals(url.getProtocol())
							|| JarFileUtil.URL_PROTOCOL_ZIP.equals(url.getProtocol())) {
						this.findClassInJar(classNameSet, url, packagePath);
						continue;
					}
					file = new File(url.toURI());
					if (!file.exists()) {
						throw new SumkException(9723423, file.getAbsolutePath() + " is not a file");
					}
					this.parseFile(classNameSet, file, packagePath);
				}
			} catch (Exception ex) {
				log.error("parse " + packageName + "failed", ex);
				throw new SumkException(23423, ex.getMessage(), ex);
			}
		}
		return classNameSet;
	}

	private void parseFile(Collection<String> classNameCol, final File root, final String packagePath) {
		File[] subFiles = root.listFiles();
		if (subFiles == null || subFiles.length == 0) {
			return;
		}
		for (File file : subFiles) {
			if (file.isDirectory()) {
				this.parseFile(classNameCol, file, packagePath);
			} else if (file.getName().endsWith(subfix)) {
				String absolutePath = file.getAbsolutePath().replace('\\', '/');
				int index = absolutePath.indexOf('/' + packagePath) + 1;
				if (index < 1) {
					Logs.system().error(absolutePath + " donot contain " + packagePath);
					continue;
				}
				addClz(classNameCol, absolutePath.substring(index));
			}
		}
	}

	private void addClz(Collection<String> classNameList, String classPath) {
		Logger log = Logs.system();
		if (!classPath.endsWith(subfix) || classPath.contains("$")) {
			if (log.isTraceEnabled()) {
				log.trace("文件{}不满足条件", classPath);
			}
			return;
		}
		String className = classPath.substring(0, classPath.length() - this.subfix.length()).replace('/', '.');
		if (!classNameList.contains(className)) {
			classNameList.add(className);
		}
	}

	private void findClassInJar(Collection<String> classNameList, URL url, String packagePath) throws IOException {
		Logger log = Logs.system();
		JarFile jarFile = null;
		try {

			URLConnection conn = url.openConnection();
			if (!JarURLConnection.class.isInstance(conn)) {
				log.error("the connection of {} is {}", url.getPath(), conn.getClass().getName());
				throw new SumkException(25345643, conn.getClass().getName() + " is not JarURLConnection");
			}
			jarFile = ((JarURLConnection) conn).getJarFile();
			Enumeration<JarEntry> jarEntryEnum = jarFile.entries();
			while (jarEntryEnum.hasMoreElements()) {
				String entityName = jarEntryEnum.nextElement().getName();
				if (entityName.startsWith("/")) {
					entityName = entityName.substring(1);
				}
				if (entityName.startsWith(packagePath)) {
					addClz(classNameList, entityName);
				} else {
					if (log.isTraceEnabled()) {
						log.trace("{}不满足条件", entityName);
					}
				}
			}
		} finally {
			if (jarFile != null) {
				jarFile.close();
			}
		}
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/scaner/JarFileUtil.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.scaner;

import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import org.yx.util.IOUtil;

public class JarFileUtil {
	public static final String URL_PROTOCOL_JAR = "jar";

	public static final String URL_PROTOCOL_ZIP = "zip";

	public static final String JAR_URL_SEPARATOR = "!/";

	public static boolean isJarURL(URL url) {
		String protocol = url.getProtocol();
		return URL_PROTOCOL_JAR.equals(protocol) || URL_PROTOCOL_ZIP.equals(protocol);
	}

	public static Map<String, byte[]> exactResourcesInJar(URL url, Predicate<String> tester) throws IOException {
		Map<String, byte[]> map = new HashMap<>();
		JarFile jarFile = null;
		try {
			String prefix = "";
			String urlPath = url.getPath();
			int separatorIndex = urlPath.lastIndexOf(JAR_URL_SEPARATOR);
			if (separatorIndex != -1 && separatorIndex + JAR_URL_SEPARATOR.length() < urlPath.length()) {
				prefix = urlPath.substring(separatorIndex + JAR_URL_SEPARATOR.length());
				if (!prefix.endsWith("/")) {
					prefix += "/";
				}
			}

			jarFile = ((JarURLConnection) url.openConnection()).getJarFile();
			Enumeration<JarEntry> jarEntryEnum = jarFile.entries();
			while (jarEntryEnum.hasMoreElements()) {
				JarEntry entry = jarEntryEnum.nextElement();
				String entityName = entry.getName();
				if (entry.isDirectory() || !entityName.startsWith(prefix)) {
					continue;
				}
				if (tester != null && !tester.test(entityName)) {
					continue;
				}
				byte[] bs = IOUtil.readAllBytes(jarFile.getInputStream(entry), true);
				map.put(entityName, bs);
			}
		} finally {
			if (jarFile != null) {
				jarFile.close();
			}
		}
		return map;
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/sumk/UnmodifiableArrayList.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.yx.base.sumk;

import java.io.Serializable;
import java.util.AbstractList;
import java.util.Collection;
import java.util.Comparator;
import java.util.Objects;
import java.util.RandomAccess;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;

public final class UnmodifiableArrayList<E> extends AbstractList<E> implements RandomAccess, Serializable {

	private static final long serialVersionUID = 1L;

	private final Object[] elements;

	public UnmodifiableArrayList(E[] array) {
		elements = Objects.requireNonNull(array);
	}

	public UnmodifiableArrayList(Collection<E> col) {

		this.elements = col.toArray();
	}

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

	@Override
	public Object[] toArray() {
		return elements.clone();
	}

	@Override
	public <T> T[] toArray(T[] a) {
		System.arraycopy(this.elements, 0, a, 0, size());
		return a;
	}

	@SuppressWarnings("unchecked")
	@Override
	public E get(int index) {
		return (E) elements[index];
	}

	@Override
	public int indexOf(Object o) {
		Object[] a = this.elements;
		if (o == null) {
			for (int i = 0; i < a.length; i++)
				if (a[i] == null)
					return i;
		} else {
			for (int i = 0; i < a.length; i++)
				if (o.equals(a[i]))
					return i;
		}
		return -1;
	}

	@Override
	public boolean contains(Object o) {
		return indexOf(o) != -1;
	}

	@Override
	public Spliterator<E> spliterator() {
		return Spliterators.spliterator(elements, Spliterator.ORDERED);
	}

	@SuppressWarnings("unchecked")
	@Override
	public void forEach(Consumer<? super E> action) {
		Objects.requireNonNull(action);
		for (Object e : elements) {
			action.accept((E) e);
		}
	}

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

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/sumk/UnsafeByteArrayOutputStream.java
================================================
package org.yx.base.sumk;

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class UnsafeByteArrayOutputStream extends OutputStream {

	private byte[] buf;

	private int count;

	public UnsafeByteArrayOutputStream(int size) {
		if (size < 0) {
			throw new IllegalArgumentException("Negative initial size: " + size);
		}
		buf = new byte[size];
	}

	private void ensureCapacity(int minCapacity) {
		if (minCapacity - buf.length > 0)
			grow(minCapacity);
	}

	private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

	private void grow(int minCapacity) {
		int oldCapacity = buf.length;
		int newCapacity = oldCapacity << 1;
		if (newCapacity - minCapacity < 0)
			newCapacity = minCapacity;
		if (newCapacity - MAX_ARRAY_SIZE > 0)
			newCapacity = hugeCapacity(minCapacity);
		buf = Arrays.copyOf(buf, newCapacity);
	}

	private static int hugeCapacity(int minCapacity) {
		if (minCapacity < 0)
			throw new OutOfMemoryError();
		return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
	}

	public void write(int b) {
		ensureCapacity(count + 1);
		buf[count] = (byte) b;
		count += 1;
	}

	public void write(byte b[], int off, int len) {
		if ((off < 0) || (off > b.length) || (len < 0) || ((off + len) - b.length > 0)) {
			throw new IndexOutOfBoundsException();
		}
		ensureCapacity(count + len);
		System.arraycopy(b, off, buf, count, len);
		count += len;
	}

	public void writeTo(OutputStream out) throws IOException {
		out.write(buf, 0, count);
	}

	public void reset() {
		count = 0;
	}

	public byte[] toByteArray() {
		return Arrays.copyOf(buf, count);
	}

	public int size() {
		return count;
	}

	public String toString() {
		return new String(buf, 0, count);
	}

	public String toString(String charsetName) throws UnsupportedEncodingException {
		return new String(buf, 0, count, charsetName);
	}

	public byte[] extractHttpBodyData() {
		int dataLength = this.count;
		if (dataLength == 0) {
			return new byte[0];
		}
		byte[] bs = this.buf;

		if (dataLength > 4 && bs[0] == 100 && bs[1] == 97 && bs[2] == 116 && bs[3] == 97 && bs[4] == 61) {
			byte[] temp = new byte[dataLength - 5];
			System.arraycopy(bs, 5, temp, 0, temp.length);
			return temp;
		}

		return dataLength == bs.length ? bs : Arrays.copyOf(bs, dataLength);
	}
}


================================================
FILE: sumk-base/src/main/java/org/yx/base/sumk/UnsafeStringWriter.java
================================================
package org.yx.base.sumk;

import java.io.IOException;
import java.io.Writer;

public class UnsafeStringWriter extends Writer {

	private final StringBuilder buf;

	public UnsafeStringWriter() {
		this(32);
	}

	public UnsafeStringWriter(int initialSize) {
		if (initialSize < 0) {
			throw new IllegalArgumentException("Negative buffer size");
		}
		buf = new StringBuilder(initialSize);
		lock = buf;
	}

	public UnsafeStringWriter(StringBuilder sb) {
		this.buf = sb;
		this.lock = buf;
	}

	public void write(int c) {
		buf.append((char) c);
	}

	public void write(char cbuf[], int off, int len) {
		if ((off < 0) || (off > cbuf.length) || (len < 0) || ((off + len) > cbuf.length) || ((off + len) < 0)) {
			throw new IndexOutOfBoundsException();
		} else if (len == 0) {
			return;
		}
		buf.append(cbuf, off, len);
	}

	public void write(String str) {
		buf.append(str);
	}

	public void write(String str, int off, int len) {
		buf.append(str.substring(off, off + len));
	}

	public UnsafeStringWriter append(CharSequence csq) {
		if (csq == null) {
			write("null");
		} else {
			buf.append(csq);
		}
		return this;
	}

	public UnsafeStringWriter append(CharSequence csq, int start, int end) {
		CharSequence cs = (csq == null ? "null" : csq);
		write(cs.subSequence(start, end).toString());
		return this;
	}

	public UnsafeStringWriter append(char c) {
		write(c);
		return this;
	}

	public String toString() {
		return buf.toString();
	}

	public StringBuilder getBuffer() {
		return buf;
	}

	public void flush() {
	}

	/**
	 * 空方法,close后不影响使用
	 */
	public void close() throws IOException {
	}

}


================================================
FILE: sumk-base/src/main/java/org/yx/base/sumk/map/ListEntrySet.java
================================================
/**
 * Copyright (C) 2016 - 2030 youtongluan.
 *
 * 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 an
Download .txt
gitextract_rcvshosm/

├── CHANGELOG
├── LICENSE
├── README.md
├── async-logger/
│   ├── LICENSE
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       ├── slf4j/
│       │   │       │   ├── impl/
│       │   │       │   │   ├── StaticLoggerBinder.java
│       │   │       │   │   └── StaticMDCBinder.java
│       │   │       │   └── v2/
│       │   │       │       └── SumkServiceProvider.java
│       │   │       └── yx/
│       │   │           └── log/
│       │   │               └── impl/
│       │   │                   ├── CodeLine.java
│       │   │                   ├── CodeLineKit.java
│       │   │                   ├── DayRollingFileAppender.java
│       │   │                   ├── DefaultUnionLog.java
│       │   │                   ├── LeveledDayRollingFileAppender.java
│       │   │                   ├── LocalFileDao.java
│       │   │                   ├── LogAppendObserver.java
│       │   │                   ├── LogAppender.java
│       │   │                   ├── LogAppenderFactory.java
│       │   │                   ├── LogAppenders.java
│       │   │                   ├── LogHelper.java
│       │   │                   ├── LogObject.java
│       │   │                   ├── LogQueue.java
│       │   │                   ├── MonthRollingFileAppender.java
│       │   │                   ├── PlainOutput.java
│       │   │                   ├── PlainOutputImpl.java
│       │   │                   ├── RollingFileAppender.java
│       │   │                   ├── SumkLoggerFactory.java
│       │   │                   ├── SumkLoggerImpl.java
│       │   │                   ├── UnionLog.java
│       │   │                   ├── UnionLogDao.java
│       │   │                   ├── UnionLogObject.java
│       │   │                   ├── UnionLogObjectSerializer.java
│       │   │                   ├── UnionLogUtil.java
│       │   │                   └── UnionLogs.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── services/
│       │               └── org.slf4j.spi.SLF4JServiceProvider
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── test/
│           │           ├── ProxyLog.java
│           │           ├── Starter.java
│           │           └── UnionDemo.java
│           └── resources/
│               └── app.properties
├── pom.xml
├── sql.dtd
├── sumk-base/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── org/
│                   └── yx/
│                       ├── annotation/
│                       │   └── doc/
│                       │       ├── Comment.java
│                       │       └── NotNull.java
│                       ├── base/
│                       │   ├── Executable.java
│                       │   ├── ItemJoiner.java
│                       │   ├── Lifecycle.java
│                       │   ├── Ordered.java
│                       │   ├── StartOnceLifecycle.java
│                       │   ├── context/
│                       │   │   ├── ActionContext.java
│                       │   │   ├── AppContext.java
│                       │   │   └── LogContext.java
│                       │   ├── date/
│                       │   │   ├── DateAdapters.java
│                       │   │   ├── DateFormater.java
│                       │   │   ├── DateTimeFormater.java
│                       │   │   ├── DateTimeTypeAdapter.java
│                       │   │   ├── FullDateTimeFormater.java
│                       │   │   ├── SumkDateFormater.java
│                       │   │   ├── SumkDateQuery.java
│                       │   │   └── TimeUtil.java
│                       │   ├── matcher/
│                       │   │   ├── BooleanMatcher.java
│                       │   │   ├── InOutMatcher.java
│                       │   │   ├── Matchers.java
│                       │   │   └── WildcardMatcher.java
│                       │   ├── scaner/
│                       │   │   ├── ClassScaner.java
│                       │   │   ├── FileNameScaner.java
│                       │   │   └── JarFileUtil.java
│                       │   ├── sumk/
│                       │   │   ├── UnmodifiableArrayList.java
│                       │   │   ├── UnsafeByteArrayOutputStream.java
│                       │   │   ├── UnsafeStringWriter.java
│                       │   │   └── map/
│                       │   │       ├── ListEntrySet.java
│                       │   │       ├── ListMap.java
│                       │   │       └── UnmodifiableListMap.java
│                       │   └── thread/
│                       │       ├── PriorityRunnable.java
│                       │       ├── SumkExecutorService.java
│                       │       ├── ThreadPools.java
│                       │       └── ThresholdExecutor.java
│                       ├── conf/
│                       │   ├── AbsoluteXmlFilesLoader.java
│                       │   ├── AbstractFilesLoader.java
│                       │   ├── AbstractRefreshableSystemConfig.java
│                       │   ├── AppConfig.java
│                       │   ├── AppInfo.java
│                       │   ├── ClassPathXmlFilesLoader.java
│                       │   ├── ComposedConfig.java
│                       │   ├── Const.java
│                       │   ├── FileModifyTime.java
│                       │   ├── LocalMultiResourceLoaderSupplier.java
│                       │   ├── LocalhostUtil.java
│                       │   ├── MapConfig.java
│                       │   ├── MultiNodeConfig.java
│                       │   ├── MultiResourceLoader.java
│                       │   ├── RefreshableSystemConfig.java
│                       │   ├── SimpleBeanUtil.java
│                       │   ├── SystemConfig.java
│                       │   ├── SystemConfigHolder.java
│                       │   └── UrlSystemConfig.java
│                       ├── exception/
│                       │   ├── BizException.java
│                       │   ├── CodeException.java
│                       │   ├── SimpleSumkException.java
│                       │   ├── SoaException.java
│                       │   ├── SumkException.java
│                       │   └── SumkExceptionCode.java
│                       ├── log/
│                       │   ├── CodeLineMarker.java
│                       │   ├── ConsoleLog.java
│                       │   ├── DelegateLogger.java
│                       │   ├── Log.java
│                       │   ├── LogKits.java
│                       │   ├── LogLevel.java
│                       │   ├── LogSettings.java
│                       │   ├── Loggers.java
│                       │   ├── Logs.java
│                       │   ├── RawLog.java
│                       │   ├── SimpleLogger.java
│                       │   └── SumkLogger.java
│                       └── util/
│                           ├── BitUtil.java
│                           ├── CollectionUtil.java
│                           ├── ExceptionUtil.java
│                           ├── FileUtil.java
│                           ├── IOUtil.java
│                           ├── Loader.java
│                           ├── StringUtil.java
│                           ├── SumkDate.java
│                           ├── SumkThreadPool.java
│                           ├── Task.java
│                           └── UUIDSeed.java
├── sumk-db/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   └── db/
│           │           │       ├── AutoCreateTime.java
│           │           │       ├── Box.java
│           │           │       ├── Column.java
│           │           │       ├── SoftDelete.java
│           │           │       └── Table.java
│           │           └── db/
│           │               ├── DB.java
│           │               ├── DBJson.java
│           │               ├── SDB.java
│           │               ├── conn/
│           │               │   ├── CommonConfigFactory.java
│           │               │   ├── ConnectionPool.java
│           │               │   ├── DBCPDataSourceFactory.java
│           │               │   ├── DBConfig.java
│           │               │   ├── DBConfigFactory.java
│           │               │   ├── DSFactory.java
│           │               │   ├── DataSourceFactory.java
│           │               │   ├── DataSourceManager.java
│           │               │   ├── DataSourceManagerImpl.java
│           │               │   ├── DataSourceManagerSelector.java
│           │               │   ├── DataSources.java
│           │               │   ├── DefaultManagerSelector.java
│           │               │   ├── HookContext.java
│           │               │   ├── RouterFactory.java
│           │               │   ├── SqlSessionHook.java
│           │               │   ├── SumkConnection.java
│           │               │   ├── SumkDataSource.java
│           │               │   ├── WeightedDataSource.java
│           │               │   └── WeightedRouterFactory.java
│           │               ├── dao/
│           │               │   ├── AbstractCachable.java
│           │               │   └── CountedResult.java
│           │               ├── enums/
│           │               │   ├── CacheType.java
│           │               │   ├── ColumnType.java
│           │               │   ├── DBType.java
│           │               │   ├── TransactionType.java
│           │               │   ├── TxHook.java
│           │               │   └── ValidRecord.java
│           │               ├── event/
│           │               │   ├── DBEvent.java
│           │               │   ├── DBEventPublisher.java
│           │               │   ├── DeleteEvent.java
│           │               │   ├── EventLane.java
│           │               │   ├── InsertEvent.java
│           │               │   ├── ModifyEvent.java
│           │               │   ├── QueryEvent.java
│           │               │   └── UpdateEvent.java
│           │               ├── exec/
│           │               │   ├── BoxAopExecutorSupplier.java
│           │               │   ├── DBExecutor.java
│           │               │   ├── DBSource.java
│           │               │   ├── DBSources.java
│           │               │   ├── DBTransaction.java
│           │               │   └── DefaultDBSource.java
│           │               ├── kit/
│           │               │   ├── DBKits.java
│           │               │   └── SDBuilder.java
│           │               ├── listener/
│           │               │   ├── DeleteListener.java
│           │               │   ├── InsertListener.java
│           │               │   ├── SelectListener.java
│           │               │   └── UpdateListener.java
│           │               ├── log/
│           │               │   └── SimpleSqlLogImpl.java
│           │               ├── mapper/
│           │               │   ├── DBPlugin.java
│           │               │   ├── ForeachParser.java
│           │               │   ├── IFParser.java
│           │               │   ├── ItemsParser.java
│           │               │   ├── JoinerFactory.java
│           │               │   ├── NamedExecutor.java
│           │               │   ├── PureStringParser.java
│           │               │   ├── RawExecutor.java
│           │               │   ├── SqlHolder.java
│           │               │   ├── SqlParser.java
│           │               │   ├── SqlParsers.java
│           │               │   ├── SqlXmlBuilderFactory.java
│           │               │   └── SqlXmlParser.java
│           │               ├── monitor/
│           │               │   └── DBMonitor.java
│           │               ├── spec/
│           │               │   ├── BoxSpec.java
│           │               │   ├── ColumnSpec.java
│           │               │   ├── DBSpecs.java
│           │               │   └── TableSpec.java
│           │               ├── sql/
│           │               │   ├── AbstractOperationGroup.java
│           │               │   ├── AbstractSqlBuilder.java
│           │               │   ├── ColumnMeta.java
│           │               │   ├── ColumnOperation.java
│           │               │   ├── CompareOperation.java
│           │               │   ├── Count.java
│           │               │   ├── DBFactory.java
│           │               │   ├── DBFlag.java
│           │               │   ├── DBNameResolvers.java
│           │               │   ├── DBSettings.java
│           │               │   ├── DBSupplier.java
│           │               │   ├── DBSupplierImpl.java
│           │               │   ├── Delete.java
│           │               │   ├── EstimateVisitCounter.java
│           │               │   ├── GroupAND.java
│           │               │   ├── GroupOR.java
│           │               │   ├── InnerDelete.java
│           │               │   ├── Insert.java
│           │               │   ├── InsertResult.java
│           │               │   ├── MapedSql.java
│           │               │   ├── MapedSqlBuilder.java
│           │               │   ├── ModifySqlBuilder.java
│           │               │   ├── Operation.java
│           │               │   ├── PojoMeta.java
│           │               │   ├── PojoMetaHolder.java
│           │               │   ├── RawSqlBuilder.java
│           │               │   ├── Select.java
│           │               │   ├── SelectBuilder.java
│           │               │   ├── SoftDeleteMeta.java
│           │               │   ├── SoftDeleteParser.java
│           │               │   ├── SoftDeleteParserImpl.java
│           │               │   ├── SqlBuilder.java
│           │               │   ├── SqlLog.java
│           │               │   ├── TableBootWatcher.java
│           │               │   ├── Update.java
│           │               │   ├── VisitCounter.java
│           │               │   └── token/
│           │               │       ├── MapValueHandler.java
│           │               │       ├── MapedSqlTokenParser.java
│           │               │       ├── ReplaceTokenHandler.java
│           │               │       ├── StringTokenParser.java
│           │               │       └── VariableTokenHandler.java
│           │               ├── sumk/
│           │               │   └── batis/
│           │               │       ├── ConfigurationFactory.java
│           │               │       ├── ProxySession.java
│           │               │       ├── SqlSessionFactory.java
│           │               │       └── SqlSessionHolder.java
│           │               └── visit/
│           │                   ├── Exchange.java
│           │                   ├── MapResultHandler.java
│           │                   ├── PojoResultHandler.java
│           │                   ├── RecordAccess.java
│           │                   ├── RecordRepository.java
│           │                   ├── RedisAccess.java
│           │                   ├── ResultHandler.java
│           │                   ├── ResultSetUtils.java
│           │                   ├── SumkDbVisitor.java
│           │                   ├── SumkStatement.java
│           │                   └── Visitors.java
│           └── resources/
│               └── META-INF/
│                   ├── sql.dtd
│                   └── sumk.factories
├── sumk-framework/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   ├── Bean.java
│           │           │   ├── ConditionOnProperty.java
│           │           │   ├── Exclude.java
│           │           │   ├── ExcludeFromParams.java
│           │           │   ├── ExcludeFromResponse.java
│           │           │   ├── Inject.java
│           │           │   ├── Param.java
│           │           │   ├── Priority.java
│           │           │   └── spec/
│           │           │       ├── BeanSpec.java
│           │           │       ├── BuiltInParsers.java
│           │           │       ├── InjectSpec.java
│           │           │       ├── ParamSpec.java
│           │           │       ├── SpecParsers.java
│           │           │       └── Specs.java
│           │           ├── bean/
│           │           │   ├── BeanAssemblerBootWatcher.java
│           │           │   ├── BeanFieldFinder.java
│           │           │   ├── BeanKit.java
│           │           │   ├── BeanPool.java
│           │           │   ├── BeanProvider.java
│           │           │   ├── BeanRegistry.java
│           │           │   ├── Booter.java
│           │           │   ├── Boxed.java
│           │           │   ├── ComplexBean.java
│           │           │   ├── DefaultBeanFieldFinder.java
│           │           │   ├── FactoryBean.java
│           │           │   ├── IOC.java
│           │           │   ├── InnerIOC.java
│           │           │   ├── InnerProvider.java
│           │           │   ├── InterfaceBean.java
│           │           │   ├── NameSlot.java
│           │           │   ├── NamedBean.java
│           │           │   ├── ParallelBootWatcher.java
│           │           │   ├── Plugin.java
│           │           │   ├── PluginBooter.java
│           │           │   ├── aop/
│           │           │   │   ├── AopContext.java
│           │           │   │   ├── AopExecutor.java
│           │           │   │   ├── AopExecutorChain.java
│           │           │   │   ├── AopExecutorManager.java
│           │           │   │   ├── AopExecutorSupplier.java
│           │           │   │   ├── asm/
│           │           │   │   │   ├── AsmUtils.java
│           │           │   │   │   ├── MethodInfoClassVisitor.java
│           │           │   │   │   ├── MethodParamInfo.java
│           │           │   │   │   ├── MethodPojo.java
│           │           │   │   │   ├── ParamPojo.java
│           │           │   │   │   ├── ParamPojoClassFactory.java
│           │           │   │   │   ├── ParamPojos.java
│           │           │   │   │   ├── ParseParamsMethodVisitor.java
│           │           │   │   │   ├── ProxyClassLoader.java
│           │           │   │   │   ├── ProxyClassVistor.java
│           │           │   │   │   ├── ProxyMethodWritor.java
│           │           │   │   │   └── WriterHelper.java
│           │           │   │   └── context/
│           │           │   │       ├── CalleeNode.java
│           │           │   │       └── NodeContext.java
│           │           │   └── watcher/
│           │           │       ├── BeanCreateWatcher.java
│           │           │       ├── BeanInjectWatcher.java
│           │           │       └── BootWatcher.java
│           │           ├── common/
│           │           │   ├── Host.java
│           │           │   ├── Predicator.java
│           │           │   ├── StringEntity.java
│           │           │   ├── action/
│           │           │   │   ├── ActInfoUtil.java
│           │           │   │   ├── ActionStatis.java
│           │           │   │   ├── ActionStatisImpl.java
│           │           │   │   ├── ParamDescript.java
│           │           │   │   └── StatisItem.java
│           │           │   ├── expression/
│           │           │   │   ├── AndExpression.java
│           │           │   │   ├── Expressions.java
│           │           │   │   ├── HasKeyExpression.java
│           │           │   │   ├── MatchType.java
│           │           │   │   ├── NotEmptyExpression.java
│           │           │   │   ├── NotNullExpression.java
│           │           │   │   ├── OrExpression.java
│           │           │   │   └── SimpleExpression.java
│           │           │   ├── json/
│           │           │   │   ├── ByteArrayTypeAdapter.java
│           │           │   │   ├── GsonHelper.java
│           │           │   │   ├── GsonOperator.java
│           │           │   │   ├── JsonOperator.java
│           │           │   │   ├── JsonTypes.java
│           │           │   │   ├── ParamPojoTypeAdapter.java
│           │           │   │   ├── ParamPojoTypeAdapterFactory.java
│           │           │   │   └── ServerJsonExclusionStrategy.java
│           │           │   ├── listener/
│           │           │   │   ├── ConcurrentSumkListener.java
│           │           │   │   ├── EventBus.java
│           │           │   │   ├── EventBusFactory.java
│           │           │   │   └── SumkListener.java
│           │           │   ├── locale/
│           │           │   │   ├── I18n.java
│           │           │   │   ├── I18nBuilder.java
│           │           │   │   ├── I18nMessageProvider.java
│           │           │   │   └── I18nMessageProviderImpl.java
│           │           │   ├── lock/
│           │           │   │   ├── Lock.java
│           │           │   │   ├── Locked.java
│           │           │   │   ├── Locker.java
│           │           │   │   └── SLock.java
│           │           │   ├── monitor/
│           │           │   │   ├── MessageProvider.java
│           │           │   │   └── Monitors.java
│           │           │   ├── route/
│           │           │   │   ├── AbstractWeightedServer.java
│           │           │   │   ├── EmptyRouter.java
│           │           │   │   ├── Router.java
│           │           │   │   ├── Routes.java
│           │           │   │   ├── SingleRouter.java
│           │           │   │   ├── WeightedRouter.java
│           │           │   │   └── WeightedServer.java
│           │           │   ├── sequence/
│           │           │   │   ├── AbstractSeq.java
│           │           │   │   ├── LongTermSeqImpl.java
│           │           │   │   ├── Seq.java
│           │           │   │   ├── SeqCounter.java
│           │           │   │   ├── SeqHolder.java
│           │           │   │   ├── SeqImpl.java
│           │           │   │   └── SnowflakeCounter.java
│           │           │   ├── util/
│           │           │   │   ├── S.java
│           │           │   │   ├── SBuilder.java
│           │           │   │   ├── SeqUtil.java
│           │           │   │   ├── helper/
│           │           │   │   │   └── ArrayHelper.java
│           │           │   │   ├── kit/
│           │           │   │   │   ├── Asserts.java
│           │           │   │   │   ├── BeanConverter.java
│           │           │   │   │   ├── PriorityKits.java
│           │           │   │   │   └── TypeConverter.java
│           │           │   │   └── secury/
│           │           │   │       ├── AESEncryptor.java
│           │           │   │       ├── Base64.java
│           │           │   │       ├── Base64Impl.java
│           │           │   │       ├── CommonDigest.java
│           │           │   │       ├── Encryptor.java
│           │           │   │       └── Hasher.java
│           │           │   └── validate/
│           │           │       ├── AbstractParamInfo.java
│           │           │       ├── ComplexParamValidator.java
│           │           │       ├── FieldParameterHolder.java
│           │           │       ├── FieldParameterInfo.java
│           │           │       ├── InvalidParamException.java
│           │           │       ├── ManuParameterInfo.java
│           │           │       ├── ParamInfo.java
│           │           │       ├── ParameterInfo.java
│           │           │       ├── SimpleParamValidator.java
│           │           │       ├── Validator.java
│           │           │       └── Validators.java
│           │           ├── main/
│           │           │   ├── StartConstants.java
│           │           │   └── SumkServer.java
│           │           └── redis/
│           │               ├── Checkable.java
│           │               ├── Redis.java
│           │               ├── RedisChecker.java
│           │               ├── RedisConfig.java
│           │               ├── RedisCounter.java
│           │               ├── RedisFactory.java
│           │               ├── RedisLoader.java
│           │               ├── RedisPlugin.java
│           │               ├── RedisPool.java
│           │               ├── RedisSettings.java
│           │               ├── RedisType.java
│           │               ├── command/
│           │               │   ├── BinaryJedisCommand.java
│           │               │   ├── JedisCommand.java
│           │               │   ├── MultiKeyCommand.java
│           │               │   └── ScriptingCommand.java
│           │               └── v3/
│           │                   ├── AbstractJedisExecutor.java
│           │                   ├── AbstractRedis.java
│           │                   ├── JedisExecutor.java
│           │                   ├── Redis3Factory.java
│           │                   ├── Redis3Kit.java
│           │                   ├── Redis3x.java
│           │                   ├── RedisCluster.java
│           │                   ├── RedisImpl.java
│           │                   ├── SentinelJedisExecutor.java
│           │                   └── SingleJedisExecutor.java
│           └── resources/
│               └── META-INF/
│                   ├── lua_del
│                   └── sumk.factories
├── sumk-http/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   └── http/
│           │           │       ├── SumkFilter.java
│           │           │       ├── SumkServlet.java
│           │           │       ├── Upload.java
│           │           │       └── Web.java
│           │           └── http/
│           │               ├── HttpEncryptor.java
│           │               ├── HttpErrorCode.java
│           │               ├── HttpHeaderName.java
│           │               ├── HttpJson.java
│           │               ├── HttpPlugin.java
│           │               ├── MessageType.java
│           │               ├── Signer.java
│           │               ├── WebFilter.java
│           │               ├── WebUtil.java
│           │               ├── act/
│           │               │   ├── AbstractActionInfo.java
│           │               │   ├── ActNameResolver.java
│           │               │   ├── HttpActionInfo.java
│           │               │   ├── HttpActionNode.java
│           │               │   ├── HttpActions.java
│           │               │   ├── IgnoreNameActionInfo.java
│           │               │   └── PrefixMappingActionInfo.java
│           │               ├── handler/
│           │               │   ├── AbstractHttpHandler.java
│           │               │   ├── Base64DecodeHandler.java
│           │               │   ├── Base64EncodeHandler.java
│           │               │   ├── DecryptHandler.java
│           │               │   ├── EncryptHandler.java
│           │               │   ├── HttpHandler.java
│           │               │   ├── HttpHandlerChain.java
│           │               │   ├── InvokeHandler.java
│           │               │   ├── MultiItemImpl.java
│           │               │   ├── MultipartHandler.java
│           │               │   ├── MultipartHolder.java
│           │               │   ├── MultipartItem.java
│           │               │   ├── ReqDataHandler.java
│           │               │   ├── ReqSignValidateHandler.java
│           │               │   ├── ReqToStringHandler.java
│           │               │   ├── ReqUserHandler.java
│           │               │   ├── RespBodyHandler.java
│           │               │   ├── RespToStringHandler.java
│           │               │   ├── RestType.java
│           │               │   ├── ToBytesHandler.java
│           │               │   └── WebContext.java
│           │               ├── invoke/
│           │               │   ├── WebHandler.java
│           │               │   ├── WebVisitor.java
│           │               │   └── WebVisitorImpl.java
│           │               ├── kit/
│           │               │   ├── DefaultHttpEncryptor.java
│           │               │   ├── DefaultHttpKit.java
│           │               │   ├── HttpCiphers.java
│           │               │   ├── HttpKit.java
│           │               │   ├── HttpSettings.java
│           │               │   ├── InnerHttpUtil.java
│           │               │   └── LocalWebContext.java
│           │               ├── log/
│           │               │   ├── HttpLogHandler.java
│           │               │   ├── HttpLogs.java
│           │               │   └── PlainHttpLogHandler.java
│           │               ├── monitor/
│           │               │   └── HttpMonitors.java
│           │               ├── select/
│           │               │   ├── DefaultHttpActionSelector.java
│           │               │   └── HttpActionSelector.java
│           │               ├── server/
│           │               │   ├── AbstractActionServer.java
│           │               │   ├── AbstractCommonHttpServlet.java
│           │               │   ├── DocumentServlet.java
│           │               │   ├── HttpMethod.java
│           │               │   ├── MultipartServer.java
│           │               │   ├── RestServer.java
│           │               │   └── SumkMonitor.java
│           │               ├── spec/
│           │               │   ├── HttpSpecs.java
│           │               │   ├── SumkFilterSpec.java
│           │               │   ├── SumkServletSpec.java
│           │               │   ├── UploadSpec.java
│           │               │   └── WebSpec.java
│           │               ├── start/
│           │               │   ├── JettyHandlerSupplier.java
│           │               │   ├── JettyHttpsServer.java
│           │               │   ├── JettyServer.java
│           │               │   ├── JettyServerConnector.java
│           │               │   ├── SumkLoaderListener.java
│           │               │   └── WebAnnotationResolver.java
│           │               └── user/
│           │                   ├── AbstractLoginServlet.java
│           │                   ├── AbstractUserSession.java
│           │                   ├── CacheHelper.java
│           │                   ├── HttpLoginWrapper.java
│           │                   ├── HttpSessionFactory.java
│           │                   ├── LocalUserSession.java
│           │                   ├── LoginObject.java
│           │                   ├── LoginServlet.java
│           │                   ├── RemoteUserSession.java
│           │                   ├── SessionObject.java
│           │                   ├── TimedCachedObject.java
│           │                   ├── UserSession.java
│           │                   └── WebSessions.java
│           └── resources/
│               └── META-INF/
│                   ├── http/
│                   │   └── listeners
│                   └── sumk.factories
├── sumk-rpc/
│   ├── LICENSE
│   ├── pom.xml
│   ├── rpc.md
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── yx/
│           │           ├── annotation/
│           │           │   └── rpc/
│           │           │       ├── Soa.java
│           │           │       ├── SoaClass.java
│           │           │       └── SoaClientConfig.java
│           │           └── rpc/
│           │               ├── BusinessHandler.java
│           │               ├── Profile.java
│           │               ├── RpcErrorCode.java
│           │               ├── RpcJson.java
│           │               ├── RpcSettings.java
│           │               ├── RpcUtil.java
│           │               ├── client/
│           │               │   ├── AbstractRpcFuture.java
│           │               │   ├── AbstractTransportClient.java
│           │               │   ├── Client.java
│           │               │   ├── ClientHandler.java
│           │               │   ├── ErrorRpcFuture.java
│           │               │   ├── HostChecker.java
│           │               │   ├── LockHolder.java
│           │               │   ├── ParamType.java
│           │               │   ├── Req.java
│           │               │   ├── Rpc.java
│           │               │   ├── RpcCallInfo.java
│           │               │   ├── RpcFuture.java
│           │               │   ├── RpcFutureImpl.java
│           │               │   ├── RpcLocker.java
│           │               │   ├── RpcResult.java
│           │               │   ├── TransportClientHolder.java
│           │               │   └── intf/
│           │               │       ├── IntfClientHandler.java
│           │               │       ├── InvocationHandlerFactory.java
│           │               │       ├── SoaClientFactory.java
│           │               │       └── SoaClientPlugin.java
│           │               ├── codec/
│           │               │   ├── AbstractDataBuffer.java
│           │               │   ├── CodecKit.java
│           │               │   ├── DataStream.java
│           │               │   ├── Protocols.java
│           │               │   ├── ReqParamType.java
│           │               │   ├── Request.java
│           │               │   ├── StreamAble.java
│           │               │   ├── decoders/
│           │               │   │   ├── DataDecoder.java
│           │               │   │   ├── RequestDecoder.java
│           │               │   │   └── ResponseDecoder.java
│           │               │   └── encoders/
│           │               │       ├── AbstractEncoder.java
│           │               │       ├── DataEncoder.java
│           │               │       └── StreamAbleEncoder.java
│           │               ├── context/
│           │               │   ├── InnerRpcUtil.java
│           │               │   ├── RpcActionNode.java
│           │               │   └── RpcActions.java
│           │               ├── data/
│           │               │   ├── ApiProfile.java
│           │               │   ├── RouteDataOperator.java
│           │               │   ├── RouteDataOperatorImpl.java
│           │               │   ├── RouteDataOperators.java
│           │               │   ├── RouteInfo.java
│           │               │   └── RoutePathData.java
│           │               ├── log/
│           │               │   ├── PlainRpcLogHandler.java
│           │               │   ├── RpcLog.java
│           │               │   ├── RpcLogHandler.java
│           │               │   └── RpcLogs.java
│           │               ├── monitor/
│           │               │   ├── RpcActionProvider.java
│           │               │   └── RpcMonitor.java
│           │               ├── netty/
│           │               │   ├── DefaultChannelInitializerSupplier.java
│           │               │   ├── NettyChannel.java
│           │               │   ├── NettyClient.java
│           │               │   ├── NettyConfigSetter.java
│           │               │   ├── NettyDataBuffer.java
│           │               │   ├── NettyDecoder.java
│           │               │   ├── NettyEncoder.java
│           │               │   ├── NettyHandler.java
│           │               │   ├── NettyKit.java
│           │               │   ├── NettyServer.java
│           │               │   ├── NettyTransportFactory.java
│           │               │   └── NettyWriteFuture.java
│           │               ├── registry/
│           │               │   ├── RegistryConst.java
│           │               │   ├── RegistryFactory.java
│           │               │   ├── client/
│           │               │   │   ├── RegistryClient.java
│           │               │   │   ├── RouteEvent.java
│           │               │   │   ├── RouteEventType.java
│           │               │   │   ├── RouterHolder.java
│           │               │   │   ├── RpcRoutes.java
│           │               │   │   └── WeightedHost.java
│           │               │   ├── server/
│           │               │   │   ├── RegistryHelper.java
│           │               │   │   └── RegistryServer.java
│           │               │   └── zookeeper/
│           │               │       ├── SimpleZkSerializer.java
│           │               │       ├── ZKSystemConfig.java
│           │               │       ├── ZkClientHelper.java
│           │               │       ├── ZkRegistryClient.java
│           │               │       ├── ZkRegistryFactory.java
│           │               │       └── ZkRegistryServer.java
│           │               ├── server/
│           │               │   ├── LocalRequestHandler.java
│           │               │   ├── LocalRpcContext.java
│           │               │   ├── RequestHandler.java
│           │               │   ├── Response.java
│           │               │   ├── RpcContext.java
│           │               │   ├── RpcFilter.java
│           │               │   ├── ServerHandler.java
│           │               │   ├── SoaPlugin.java
│           │               │   ├── impl/
│           │               │   │   ├── JsonedParamReqHandler.java
│           │               │   │   ├── OrderedParamReqHandler.java
│           │               │   │   ├── RpcHandler.java
│           │               │   │   └── ServerExceptionHandler.java
│           │               │   └── start/
│           │               │       ├── SoaAnnotationResolver.java
│           │               │       ├── SoaClassResolver.java
│           │               │       ├── SoaClassResolverImpl.java
│           │               │       ├── SoaNameResolver.java
│           │               │       ├── SoaNameResolverImpl.java
│           │               │       └── SoaServer.java
│           │               ├── spec/
│           │               │   ├── RpcSpecs.java
│           │               │   ├── SoaClassSpec.java
│           │               │   ├── SoaClientConfigSpec.java
│           │               │   └── SoaSpec.java
│           │               └── transport/
│           │                   ├── DataBuffer.java
│           │                   ├── RpcWriteFuture.java
│           │                   ├── RpcWriteListener.java
│           │                   ├── TransportChannel.java
│           │                   ├── TransportClient.java
│           │                   ├── TransportFactory.java
│           │                   ├── TransportServer.java
│           │                   └── Transports.java
│           └── resources/
│               └── META-INF/
│                   └── sumk.factories
├── sumk-rpc-mina/
│   ├── LICENSE
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── yx/
│       │   │           └── rpc/
│       │   │               └── mina/
│       │   │                   ├── MinaChannel.java
│       │   │                   ├── MinaClient.java
│       │   │                   ├── MinaDataBuffer.java
│       │   │                   ├── MinaHandler.java
│       │   │                   ├── MinaKit.java
│       │   │                   ├── MinaProtocolDecoder.java
│       │   │                   ├── MinaProtocolEncoder.java
│       │   │                   ├── MinaServer.java
│       │   │                   ├── MinaTransportFactory.java
│       │   │                   └── MinaWriteFuture.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── sumk.factories
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── test/
│           │           ├── Main.java
│           │           ├── RpcPressTest.java
│           │           ├── RpcTest.java
│           │           ├── inner/
│           │           │   └── pojo/
│           │           │       ├── DemoUser.java
│           │           │       └── Multikey.java
│           │           └── soa/
│           │               ├── demo/
│           │               │   └── EchoAction.java
│           │               └── server/
│           │                   └── SOAServer.java
│           └── resources/
│               └── app.properties
└── sumk-test/
    ├── LICENSE
    ├── pom.xml
    ├── src/
    │   └── test/
    │       ├── java/
    │       │   └── org/
    │       │       └── test/
    │       │           ├── Main.java
    │       │           ├── client/
    │       │           │   ├── HttpAesClientTest.java
    │       │           │   ├── HttpPlainClientTest.java
    │       │           │   ├── HttpPressTest.java
    │       │           │   ├── RpcPressTest.java
    │       │           │   └── RpcTest.java
    │       │           ├── inner/
    │       │           │   ├── dao/
    │       │           │   │   ├── DemoUserDao.java
    │       │           │   │   ├── DemoUserDaoImpl.java
    │       │           │   │   ├── DemoUserMybatisDao.java
    │       │           │   │   ├── LocalSqlDao.java
    │       │           │   │   └── MultikeyDao.java
    │       │           │   ├── po/
    │       │           │   │   ├── DemoUser.java
    │       │           │   │   └── Multikey.java
    │       │           │   ├── soa/
    │       │           │   │   ├── demo/
    │       │           │   │   │   └── EchoAction.java
    │       │           │   │   └── server/
    │       │           │   │       └── SOAServer.java
    │       │           │   └── web/
    │       │           │       ├── client/
    │       │           │       │   └── Encrypt.java
    │       │           │       └── demo/
    │       │           │           ├── AesTestServer.java
    │       │           │           ├── DBDemo.java
    │       │           │           ├── DemoSessionObject.java
    │       │           │           ├── MyLoginServlet.java
    │       │           │           └── PlainServer.java
    │       │           ├── orm/
    │       │           │   ├── BaseOrmTest.java
    │       │           │   ├── MultiPrimaryTest.java
    │       │           │   ├── SinglePrimaryTest.java
    │       │           │   └── SqlTest.java
    │       │           └── token/
    │       │               ├── MapedSqlTokenParserTest.java
    │       │               └── StringTokenParserTest.java
    │       └── resources/
    │           ├── app.properties
    │           └── sql/
    │               ├── test.xml
    │               └── user/
    │                   └── demo.xml
    └── test.sql
Download .txt
Showing preview only (382K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4794 symbols across 630 files)

FILE: async-logger/src/main/java/org/slf4j/impl/StaticLoggerBinder.java
  class StaticLoggerBinder (line 22) | public class StaticLoggerBinder implements LoggerFactoryBinder {
    method getSingleton (line 26) | public static final StaticLoggerBinder getSingleton() {
    method StaticLoggerBinder (line 34) | private StaticLoggerBinder() {
    method getLoggerFactory (line 38) | public ILoggerFactory getLoggerFactory() {
    method getLoggerFactoryClassStr (line 42) | public String getLoggerFactoryClassStr() {

FILE: async-logger/src/main/java/org/slf4j/impl/StaticMDCBinder.java
  class StaticMDCBinder (line 21) | public class StaticMDCBinder {
    method StaticMDCBinder (line 24) | private StaticMDCBinder() {
    method getMDCA (line 27) | public MDCAdapter getMDCA() {

FILE: async-logger/src/main/java/org/slf4j/v2/SumkServiceProvider.java
  class SumkServiceProvider (line 11) | public class SumkServiceProvider implements SLF4JServiceProvider {
    method getLoggerFactory (line 19) | @Override
    method getMarkerFactory (line 24) | @Override
    method getMDCAdapter (line 29) | @Override
    method getRequestedApiVersion (line 34) | @Override
    method initialize (line 39) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/CodeLine.java
  class CodeLine (line 18) | public class CodeLine {
    method CodeLine (line 23) | public CodeLine(String className, String methodName, int lineNumber) {
    method getClassName (line 29) | public String getClassName() {
    method getMethodName (line 33) | public String getMethodName() {
    method getLineNumber (line 37) | public int getLineNumber() {

FILE: async-logger/src/main/java/org/yx/log/impl/CodeLineKit.java
  class CodeLineKit (line 24) | public final class CodeLineKit {
    method getParser (line 33) | public static BiFunction<Marker, String, CodeLine> getParser() {
    method setParser (line 37) | public static void setParser(BiFunction<Marker, String, CodeLine> pars...
    method parse (line 41) | public static CodeLine parse(Marker marker, String name) {

FILE: async-logger/src/main/java/org/yx/log/impl/DayRollingFileAppender.java
  class DayRollingFileAppender (line 24) | public class DayRollingFileAppender extends RollingFileAppender {
    method DayRollingFileAppender (line 26) | public DayRollingFileAppender() {
    method DayRollingFileAppender (line 30) | public DayRollingFileAppender(String name) {
    method shouldDelete (line 34) | @Override
    method formatDateString (line 49) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/DefaultUnionLog.java
  class DefaultUnionLog (line 31) | public class DefaultUnionLog extends LogQueue implements UnionLog {
    method DefaultUnionLog (line 41) | public DefaultUnionLog() {
    method flush (line 48) | @Override
    method output (line 53) | @Override
    method onStart (line 68) | @Override
    method stop (line 81) | @Override
    method directOffer (line 88) | @Override
    method offer (line 96) | @Override
    method isStarted (line 104) | @Override
    method getMatcherSupplier (line 109) | public Supplier<Predicate<String>> getMatcherSupplier() {
    method setMatcherSupplier (line 113) | public void setMatcherSupplier(Supplier<Predicate<String>> matcherSupp...
    method getLogObjectSerializer (line 118) | public Function<LogObject, UnionLogObject> getLogObjectSerializer() {
    method setLogObjectSerializer (line 122) | public void setLogObjectSerializer(Function<LogObject, UnionLogObject>...
    method getDao (line 126) | public UnionLogDao getDao() {
    method setDao (line 130) | public void setDao(UnionLogDao dao) {
    method removeObserver (line 134) | public void removeObserver() {

FILE: async-logger/src/main/java/org/yx/log/impl/LeveledDayRollingFileAppender.java
  class LeveledDayRollingFileAppender (line 24) | public class LeveledDayRollingFileAppender extends DayRollingFileAppender {
    method LeveledDayRollingFileAppender (line 28) | public LeveledDayRollingFileAppender() {
    method LeveledDayRollingFileAppender (line 32) | public LeveledDayRollingFileAppender(String name) {
    method accept (line 36) | @Override
    method config (line 41) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/LocalFileDao.java
  class LocalFileDao (line 30) | public class LocalFileDao implements UnionLogDao {
    method LocalFileDao (line 42) | public LocalFileDao() {
    method createLogingFile (line 46) | private File createLogingFile() {
    method store (line 70) | @Override
    method flush (line 88) | @Override
    method reset (line 96) | public void reset() {
    method move2Loged (line 135) | protected void move2Loged(File logFile) {
    method getLogingPath (line 139) | protected File getLogingPath() {
    method setAliveTime (line 143) | public void setAliveTime(int time) {

FILE: async-logger/src/main/java/org/yx/log/impl/LogAppendObserver.java
  class LogAppendObserver (line 31) | public class LogAppendObserver implements Consumer<SystemConfig> {
    method accept (line 33) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/LogAppender.java
  type LogAppender (line 20) | public interface LogAppender {
    method start (line 22) | boolean start(Map<String, String> configMap);
    method stop (line 24) | void stop() throws Exception;
    method offer (line 26) | boolean offer(LogObject logObject);
    method name (line 28) | String name();
    method config (line 30) | void config(Map<String, String> configMap);

FILE: async-logger/src/main/java/org/yx/log/impl/LogAppenderFactory.java
  class LogAppenderFactory (line 29) | public final class LogAppenderFactory {
    method init (line 33) | static synchronized void init() throws Exception {
    method start (line 41) | static LogAppender start(String name, Map<String, String> configMap) t...
    method registeAppender (line 54) | public static LogAppender registeAppender(LogAppender m) {
    method remove (line 59) | public static void remove(String name) {
    method getAppender (line 66) | public static LogAppender getAppender(String name) {
    method appenderNames (line 70) | public static Set<String> appenderNames() {

FILE: async-logger/src/main/java/org/yx/log/impl/LogAppenders.java
  class LogAppenders (line 22) | public class LogAppenders {
    method startAppender (line 29) | static LogAppender startAppender(String name, String value) {
    method init (line 43) | static synchronized void init() {
    method offer (line 57) | public static boolean offer(LogObject logObject) {
    method isStarted (line 70) | public static boolean isStarted() {

FILE: async-logger/src/main/java/org/yx/log/impl/LogHelper.java
  class LogHelper (line 22) | public class LogHelper {
    method setOutput (line 26) | public static void setOutput(PlainOutput output) {
    method plainMessage (line 30) | public static String plainMessage(LogObject logObject, boolean showAtt...
    method plainMessage (line 34) | public static void plainMessage(StringBuilder sb, LogObject logObject,...
    method extractCodeLine (line 38) | public static CodeLine extractCodeLine(String pre) {
    method realContext (line 62) | public static String realContext(String text, String pattern, String s...

FILE: async-logger/src/main/java/org/yx/log/impl/LogObject.java
  class LogObject (line 33) | public class LogObject {
    method create (line 58) | public static LogObject create(Marker marker, LogLevel methodLevel, St...
    method LogObject (line 71) | public LogObject(@NotNull String loggerName, @NotNull SumkDate logDate...
    method spanId (line 83) | public String spanId() {
    method traceId (line 87) | public String traceId() {
    method userId (line 91) | public String userId() {
    method isTest (line 95) | public boolean isTest() {
    method attachments (line 99) | public Map<String, String> attachments() {
    method getLogDate (line 103) | public SumkDate getLogDate() {
    method getMethodLevel (line 107) | public LogLevel getMethodLevel() {
    method getBody (line 111) | public String getBody() {
    method getThreadName (line 115) | public String getThreadName() {
    method getException (line 119) | public Throwable getException() {
    method getLoggerName (line 123) | public String getLoggerName() {
    method getCodeLine (line 127) | public CodeLine getCodeLine() {
    method getLogContext (line 131) | public LogContext getLogContext() {
    method updateCodeLineOnOff (line 135) | static void updateCodeLineOnOff() {

FILE: async-logger/src/main/java/org/yx/log/impl/LogQueue.java
  class LogQueue (line 34) | public abstract class LogQueue implements Runnable {
    method LogQueue (line 48) | public LogQueue(String name) {
    method accept (line 54) | protected boolean accept(LogObject logObject) {
    method flush (line 59) | protected abstract void flush(boolean idle) throws Exception;
    method config (line 61) | public void config(Map<String, String> configMap) {
    method name (line 73) | public final String name() {
    method offer (line 77) | public boolean offer(LogObject logObject) {
    method output (line 84) | protected abstract void output(List<LogObject> list) throws Exception;
    method run (line 86) | @Override
    method consume (line 106) | private boolean consume() throws Exception {
    method start (line 125) | public synchronized boolean start(Map<String, String> map) {
    method startJob (line 140) | protected void startJob() {
    method onStart (line 144) | protected abstract boolean onStart(Map<String, String> configMap);
    method stop (line 146) | public synchronized void stop() throws Exception {
    method setInterval (line 151) | public void setInterval(int interval) {
    method getHandleLogCount (line 157) | public long getHandleLogCount() {
    method getMatcher (line 161) | protected Predicate<String> getMatcher() {
    method setMatcher (line 165) | protected void setMatcher(Predicate<String> matcher) {
    method toString (line 169) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/MonthRollingFileAppender.java
  class MonthRollingFileAppender (line 24) | public class MonthRollingFileAppender extends RollingFileAppender {
    method MonthRollingFileAppender (line 26) | public MonthRollingFileAppender() {
    method MonthRollingFileAppender (line 30) | public MonthRollingFileAppender(String name) {
    method formatDateString (line 34) | @Override
    method shouldDelete (line 39) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/PlainOutput.java
  type PlainOutput (line 18) | public interface PlainOutput {
    method plainMessage (line 20) | String plainMessage(LogObject logObject, boolean showAttachs);
    method plainMessage (line 22) | void plainMessage(StringBuilder sb, LogObject logObject, boolean showA...
    method setShowSN (line 24) | void setShowSN(boolean showSN);
    method setShowThreadName (line 26) | void setShowThreadName(boolean showThreadName);

FILE: async-logger/src/main/java/org/yx/log/impl/PlainOutputImpl.java
  class PlainOutputImpl (line 26) | public class PlainOutputImpl implements PlainOutput {
    method setShowThreadName (line 30) | @Override
    method setShowSN (line 35) | @Override
    method plainMessage (line 40) | public void plainMessage(StringBuilder sb, LogObject logObject, boolea...
    method appendHeader (line 64) | protected StringBuilder appendHeader(StringBuilder sb, LogObject logOb...
    method plainMessage (line 91) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/RollingFileAppender.java
  class RollingFileAppender (line 33) | public abstract class RollingFileAppender extends LogQueue implements Lo...
    method setupFilePath (line 54) | protected boolean setupFilePath(String fileName) {
    method RollingFileAppender (line 82) | public RollingFileAppender(String name) {
    method flush (line 86) | @Override
    method deleteHisLog (line 108) | protected void deleteHisLog() {
    method output (line 124) | @Override
    method outputInSameDate (line 145) | protected void outputInSameDate(String date, List<LogObject> msgs) thr...
    method sync (line 177) | protected void sync() {
    method closeCurrentChannel (line 187) | protected void closeCurrentChannel() {
    method shouldDelete (line 198) | protected abstract boolean shouldDelete(String fileName);
    method toBytes (line 200) | protected byte[] toBytes(LogObject logObject) {
    method formatDateString (line 210) | protected abstract String formatDateString(SumkDate date);
    method extractPath (line 212) | protected String extractPath(Map<String, String> map) {
    method onStart (line 223) | @Override
    method config (line 229) | @Override
    method getLogFile (line 238) | public File getLogFile(SumkDate date) {
    method setSyncInterval (line 243) | public void setSyncInterval(int syncInterval) {
    method getBufferSize (line 247) | public int getBufferSize() {
    method setBufferSize (line 251) | public void setBufferSize(int bufferSize) {

FILE: async-logger/src/main/java/org/yx/log/impl/SumkLoggerFactory.java
  class SumkLoggerFactory (line 28) | public final class SumkLoggerFactory implements ILoggerFactory {
    method SumkLoggerFactory (line 38) | public SumkLoggerFactory() {
    method getLoggerFactory (line 42) | public static Function<String, SumkLogger> getLoggerFactory() {
    method setLoggerFactory (line 46) | public static void setLoggerFactory(Function<String, SumkLogger> logge...
    method setDefaultLevel (line 50) | public static void setDefaultLevel(LogLevel level) {
    method getLogger (line 56) | @Override

FILE: async-logger/src/main/java/org/yx/log/impl/SumkLoggerImpl.java
  class SumkLoggerImpl (line 30) | public class SumkLoggerImpl extends SumkLogger implements LocationAwareL...
    method SumkLoggerImpl (line 32) | public SumkLoggerImpl(String module) {
    method output (line 36) | @Override
    method output (line 50) | @Override
    method log (line 62) | @Override
    method log (line 83) | public void log(LoggingEvent event) {

FILE: async-logger/src/main/java/org/yx/log/impl/UnionLog.java
  type UnionLog (line 20) | public interface UnionLog {
    method start (line 22) | boolean start(Map<String, String> configMap);
    method isStarted (line 24) | boolean isStarted();
    method stop (line 26) | void stop() throws Exception;
    method offer (line 28) | boolean offer(LogObject logObject);
    method directOffer (line 30) | boolean directOffer(LogObject logObject);

FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogDao.java
  type UnionLogDao (line 20) | public interface UnionLogDao {
    method flush (line 27) | void flush(boolean idle);
    method store (line 35) | void store(List<UnionLogObject> logs) throws Exception;

FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogObject.java
  class UnionLogObject (line 25) | public class UnionLogObject {
    method UnionLogObject (line 35) | public UnionLogObject(@NotNull String name, @NotNull SumkDate date, @N...
    method getName (line 44) | public String getName() {
    method getDate (line 51) | public SumkDate getDate() {
    method getLog (line 60) | public String getLog() {

FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogObjectSerializer.java
  class UnionLogObjectSerializer (line 24) | public class UnionLogObjectSerializer implements Function<LogObject, Uni...
    method UnionLogObjectSerializer (line 30) | public UnionLogObjectSerializer() {
    method apply (line 34) | @Override
    method getExtraSize (line 50) | public int getExtraSize() {
    method setExtraSize (line 54) | public void setExtraSize(int extraSize) {

FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogUtil.java
  class UnionLogUtil (line 31) | public final class UnionLogUtil {
    method move2Loged (line 39) | public static void move2Loged(File logging) {
    method move2Error (line 53) | public static void move2Error(File loged) {
    method getErrorPath (line 67) | public static File getErrorPath() {
    method getLogedPath (line 71) | public static File getLogedPath() {
    method getLogingPath (line 75) | public static File getLogingPath() {
    method getLogRoot (line 79) | private static File getLogRoot() {
    method getDefaultLoginPath (line 88) | private static File getDefaultLoginPath() {
    method appendLogObject (line 103) | public static void appendLogObject(StringBuilder sb, LogObject log, St...

FILE: async-logger/src/main/java/org/yx/log/impl/UnionLogs.java
  class UnionLogs (line 21) | public final class UnionLogs {
    method getUnionLog (line 24) | public static UnionLog getUnionLog() {
    method setUnionLog (line 28) | public static void setUnionLog(UnionLog unionLog) {
    method start (line 32) | public static boolean start() {

FILE: async-logger/src/test/java/org/test/ProxyLog.java
  class ProxyLog (line 6) | public class ProxyLog {
    method log (line 10) | public static void log(String msg,Object... params) {
    method error (line 14) | public static void error(String msg,Throwable t) {

FILE: async-logger/src/test/java/org/test/Starter.java
  class Starter (line 8) | public class Starter {
    method test (line 10) | @Test

FILE: async-logger/src/test/java/org/test/UnionDemo.java
  class UnionDemo (line 12) | public class UnionDemo {
    method test (line 14) | @Test

FILE: sumk-base/src/main/java/org/yx/base/Executable.java
  type Executable (line 21) | public interface Executable {
    method run (line 22) | void run() throws Throwable;

FILE: sumk-base/src/main/java/org/yx/base/ItemJoiner.java
  class ItemJoiner (line 18) | public final class ItemJoiner {
    method create (line 20) | public static ItemJoiner create(CharSequence delimiter, CharSequence p...
    method ItemJoiner (line 30) | public ItemJoiner(CharSequence delimiter, CharSequence pre, CharSequen...
    method ItemJoiner (line 36) | public ItemJoiner(CharSequence delimiter) {
    method item (line 40) | public ItemJoiner item() {
    method append (line 48) | public ItemJoiner append(CharSequence v) {
    method append (line 53) | public ItemJoiner append(char v) {
    method append (line 58) | public ItemJoiner append(Object v) {
    method append (line 63) | public ItemJoiner append(ItemJoiner item, CharSequence pre, CharSequen...
    method toCharSequence (line 77) | public CharSequence toCharSequence() {
    method toCharSequence (line 81) | public CharSequence toCharSequence(boolean forcePreAndSubFix) {
    method isEmpty (line 106) | public boolean isEmpty() {
    method toString (line 110) | @Override
    method appendNotEmptyItem (line 115) | public ItemJoiner appendNotEmptyItem(CharSequence item) {
    method append (line 123) | public void append(long v) {
    method append (line 127) | public void append(int v) {
    method copy (line 131) | public ItemJoiner copy() {

FILE: sumk-base/src/main/java/org/yx/base/Lifecycle.java
  type Lifecycle (line 18) | public interface Lifecycle {
    method start (line 23) | void start();
    method stop (line 25) | void stop();

FILE: sumk-base/src/main/java/org/yx/base/Ordered.java
  type Ordered (line 18) | public interface Ordered extends Comparable<Ordered> {
    method order (line 27) | default int order() {
    method compareTo (line 31) | @Override

FILE: sumk-base/src/main/java/org/yx/base/StartOnceLifecycle.java
  class StartOnceLifecycle (line 18) | public abstract class StartOnceLifecycle implements Lifecycle {
    method start (line 22) | @Override
    method onStart (line 31) | protected abstract void onStart();
    method stop (line 33) | @Override

FILE: sumk-base/src/main/java/org/yx/base/context/ActionContext.java
  class ActionContext (line 25) | public final class ActionContext implements Cloneable {
    method isTest (line 34) | public boolean isTest() {
    method ActionContext (line 38) | ActionContext(LogContext logContext) {
    method act (line 42) | public String act() {
    method traceId (line 46) | public String traceId() {
    method spanId (line 50) | public String spanId() {
    method initialValue (line 56) | @Override
    method newContext (line 64) | public static ActionContext newContext(String act, String traceId, boo...
    method newContext (line 68) | public static ActionContext newContext(String act, String traceId, Str...
    method newContext (line 75) | public static ActionContext newContext(LogContext logContext) {
    method wrap (line 81) | public static Runnable wrap(Runnable r) {
    method wrapExecutable (line 93) | public static Runnable wrapExecutable(Executable r) {
    method store (line 107) | public static void store(ActionContext c) {
    method current (line 111) | public static ActionContext current() {
    method remove (line 115) | public static void remove() {
    method setTraceIdIfAbsent (line 119) | public void setTraceIdIfAbsent(String traceId) {
    method userId (line 127) | public String userId() {
    method userId (line 131) | public void userId(String userId) {
    method attachmentView (line 136) | public Map<String, String> attachmentView() {
    method setAttachment (line 146) | public void setAttachment(String key, String value) {
    method getAttachment (line 161) | public String getAttachment(String key) {
    method nextSpanId (line 169) | public String nextSpanId() {
    method logContext (line 185) | public LogContext logContext() {
    method clone (line 189) | @Override

FILE: sumk-base/src/main/java/org/yx/base/context/AppContext.java
  class AppContext (line 26) | public final class AppContext {
    method inst (line 33) | public static AppContext inst() {
    method AppContext (line 37) | private AppContext() {
    method put (line 43) | public void put(String key, Object obj) {
    method put (line 47) | public void put(Class<?> clz, Object obj) {
    method get (line 51) | public Object get(String key) {
    method get (line 55) | public Object get(Class<?> clz) {
    method get (line 59) | public <T> T get(Class<T> clz, T defaultObject) {
    method clear (line 65) | public static void clear() {
    method startFailed (line 69) | public static void startFailed() {
    method getAppInfo (line 75) | public String getAppInfo(String key, String defaultV) {
    method isStarted (line 84) | public boolean isStarted() {
    method isDestoryed (line 88) | public boolean isDestoryed() {
    method resetStatus (line 92) | public void resetStatus() {
    method setStatusToStarted (line 97) | public void setStatusToStarted() {
    method setStatusToDestoryed (line 102) | public void setStatusToDestoryed() {
    method isTest (line 107) | public boolean isTest() {
    method setTest (line 111) | public void setTest(boolean test) {

FILE: sumk-base/src/main/java/org/yx/base/context/LogContext.java
  class LogContext (line 23) | public final class LogContext {
    method create (line 38) | public static LogContext create(String act, String traceId, String spa...
    method create (line 50) | public static LogContext create(LogContext lc, Map<String, String> att...
    method LogContext (line 54) | private LogContext(String act, String traceId, String spanId, String u...
    method empty (line 64) | public static LogContext empty() {
    method unmodifiedAttachs (line 68) | public Map<String, String> unmodifiedAttachs() {
    method getAct (line 72) | public String getAct() {
    method getTraceId (line 76) | public String getTraceId() {
    method getSpanId (line 80) | public String getSpanId() {
    method getUserId (line 84) | public String getUserId() {
    method isTest (line 88) | public boolean isTest() {

FILE: sumk-base/src/main/java/org/yx/base/date/DateAdapters.java
  class DateAdapters (line 31) | public final class DateAdapters {
    method registerAll (line 33) | public static void registerAll(GsonBuilder builder) {
    method write (line 43) | @Override
    method read (line 52) | @Override
    method write (line 65) | @Override
    method read (line 74) | @Override
    method write (line 87) | @Override
    method read (line 96) | @Override
    method write (line 109) | @Override
    method read (line 118) | @Override
    method write (line 139) | @Override
    method read (line 148) | @Override

FILE: sumk-base/src/main/java/org/yx/base/date/DateFormater.java
  class DateFormater (line 23) | public final class DateFormater implements SumkDateFormater {
    method order (line 27) | @Override
    method parse (line 32) | @Override
    method accept (line 41) | @Override

FILE: sumk-base/src/main/java/org/yx/base/date/DateTimeFormater.java
  class DateTimeFormater (line 23) | public final class DateTimeFormater implements SumkDateFormater {
    method DateTimeFormater (line 27) | private DateTimeFormater() {
    method order (line 31) | @Override
    method parse (line 36) | @Override
    method accept (line 48) | @Override

FILE: sumk-base/src/main/java/org/yx/base/date/DateTimeTypeAdapter.java
  class DateTimeTypeAdapter (line 29) | public final class DateTimeTypeAdapter extends TypeAdapter<Date> {
    method setDateFormat (line 33) | public void setDateFormat(String format) {
    method read (line 40) | @Override
    method deserializeToDate (line 49) | private Date deserializeToDate(final String text) throws IOException {
    method write (line 62) | @Override

FILE: sumk-base/src/main/java/org/yx/base/date/FullDateTimeFormater.java
  class FullDateTimeFormater (line 21) | public final class FullDateTimeFormater implements SumkDateFormater {
    method FullDateTimeFormater (line 24) | private FullDateTimeFormater() {
    method order (line 28) | @Override
    method parse (line 33) | @Override
    method accept (line 58) | @Override

FILE: sumk-base/src/main/java/org/yx/base/date/SumkDateFormater.java
  type SumkDateFormater (line 21) | public interface SumkDateFormater extends Ordered {
    method parse (line 22) | SumkDate parse(String text);
    method accept (line 24) | boolean accept(String format);

FILE: sumk-base/src/main/java/org/yx/base/date/SumkDateQuery.java
  class SumkDateQuery (line 29) | public class SumkDateQuery implements TemporalQuery<SumkDate> {
    method queryFrom (line 32) | @Override

FILE: sumk-base/src/main/java/org/yx/base/date/TimeUtil.java
  class TimeUtil (line 29) | public class TimeUtil {
    method isGenericDate (line 33) | public static boolean isGenericDate(Class<?> type) {
    method toType (line 39) | @SuppressWarnings("unchecked")
    method toSumkDate (line 72) | @SuppressWarnings("unchecked")
    method toType (line 92) | @SuppressWarnings({ "unchecked", "deprecation" })
    method toType (line 126) | @SuppressWarnings({ "unchecked", "deprecation" })
    method toType (line 174) | @SuppressWarnings("unchecked")
    method toType (line 205) | @SuppressWarnings({ "unchecked", "deprecation" })
    method toType (line 237) | @SuppressWarnings("unchecked")

FILE: sumk-base/src/main/java/org/yx/base/matcher/BooleanMatcher.java
  type BooleanMatcher (line 5) | public enum BooleanMatcher implements Predicate<String> {
    method BooleanMatcher (line 11) | private BooleanMatcher(boolean matched) {
    method test (line 15) | @Override
    method negate (line 20) | @Override

FILE: sumk-base/src/main/java/org/yx/base/matcher/InOutMatcher.java
  class InOutMatcher (line 21) | public class InOutMatcher implements Predicate<String> {
    method InOutMatcher (line 26) | InOutMatcher(Predicate<String> include, Predicate<String> exclude) {
    method test (line 31) | @Override
    method toString (line 39) | @Override

FILE: sumk-base/src/main/java/org/yx/base/matcher/Matchers.java
  class Matchers (line 28) | public class Matchers {
    method createWildcardMatcher (line 37) | public static Predicate<String> createWildcardMatcher(String patterns) {
    method createWildcardMatcher (line 41) | public static Predicate<String> createWildcardMatcher(String patterns,...
    method createWildcardMatcher (line 56) | public static Predicate<String> createWildcardMatcher(Collection<Strin...
    method includeAndExclude (line 127) | public static Predicate<String> includeAndExclude(Predicate<String> in...
    method includeAndExclude (line 137) | public static Predicate<String> includeAndExclude(String include, Stri...

FILE: sumk-base/src/main/java/org/yx/base/matcher/WildcardMatcher.java
  class WildcardMatcher (line 34) | public class WildcardMatcher implements Predicate<String> {
    method WildcardMatcher (line 46) | WildcardMatcher(Set<String> exacts, Set<String> matchStart, Set<String...
    method toArray (line 56) | private String[] toArray(Collection<String> src) {
    method test (line 63) | @Override
    method exacts (line 107) | public Collection<String> exacts() {
    method matchStarts (line 111) | public List<String> matchStarts() {
    method matchEnds (line 115) | public List<String> matchEnds() {
    method contains (line 119) | public List<String> contains() {
    method toString (line 123) | @Override
    class HeadAndTail (line 144) | public static final class HeadAndTail implements Predicate<String> {
      method HeadAndTail (line 148) | public HeadAndTail(String head, String tail) {
      method test (line 153) | @Override
      method toString (line 161) | @Override

FILE: sumk-base/src/main/java/org/yx/base/scaner/ClassScaner.java
  class ClassScaner (line 28) | public final class ClassScaner {
    method getScaner (line 32) | public static Function<Collection<String>, Collection<String>> getScan...
    method setScaner (line 36) | public static void setScaner(Function<Collection<String>, Collection<S...
    method subClassesInSameOrSubPackage (line 40) | public static <T> Set<Class<? extends T>> subClassesInSameOrSubPackage...
    method list (line 45) | @SuppressWarnings("unchecked")
    method listClasses (line 63) | public static Collection<String> listClasses(Collection<String> packag...

FILE: sumk-base/src/main/java/org/yx/base/scaner/FileNameScaner.java
  class FileNameScaner (line 38) | public final class FileNameScaner implements Function<Collection<String>...
    method FileNameScaner (line 41) | public FileNameScaner(String subfix) {
    method apply (line 45) | @Override
    method parseFile (line 88) | private void parseFile(Collection<String> classNameCol, final File roo...
    method addClz (line 108) | private void addClz(Collection<String> classNameList, String classPath) {
    method findClassInJar (line 122) | private void findClassInJar(Collection<String> classNameList, URL url,...

FILE: sumk-base/src/main/java/org/yx/base/scaner/JarFileUtil.java
  class JarFileUtil (line 30) | public class JarFileUtil {
    method isJarURL (line 37) | public static boolean isJarURL(URL url) {
    method exactResourcesInJar (line 42) | public static Map<String, byte[]> exactResourcesInJar(URL url, Predica...

FILE: sumk-base/src/main/java/org/yx/base/sumk/UnmodifiableArrayList.java
  class UnmodifiableArrayList (line 28) | public final class UnmodifiableArrayList<E> extends AbstractList<E> impl...
    method UnmodifiableArrayList (line 34) | public UnmodifiableArrayList(E[] array) {
    method UnmodifiableArrayList (line 38) | public UnmodifiableArrayList(Collection<E> col) {
    method size (line 43) | @Override
    method toArray (line 48) | @Override
    method toArray (line 53) | @Override
    method get (line 59) | @SuppressWarnings("unchecked")
    method indexOf (line 65) | @Override
    method contains (line 80) | @Override
    method spliterator (line 85) | @Override
    method forEach (line 90) | @SuppressWarnings("unchecked")
    method sort (line 99) | @Override

FILE: sumk-base/src/main/java/org/yx/base/sumk/UnsafeByteArrayOutputStream.java
  class UnsafeByteArrayOutputStream (line 8) | public class UnsafeByteArrayOutputStream extends OutputStream {
    method UnsafeByteArrayOutputStream (line 14) | public UnsafeByteArrayOutputStream(int size) {
    method ensureCapacity (line 21) | private void ensureCapacity(int minCapacity) {
    method grow (line 28) | private void grow(int minCapacity) {
    method hugeCapacity (line 38) | private static int hugeCapacity(int minCapacity) {
    method write (line 44) | public void write(int b) {
    method write (line 50) | public void write(byte b[], int off, int len) {
    method writeTo (line 59) | public void writeTo(OutputStream out) throws IOException {
    method reset (line 63) | public void reset() {
    method toByteArray (line 67) | public byte[] toByteArray() {
    method size (line 71) | public int size() {
    method toString (line 75) | public String toString() {
    method toString (line 79) | public String toString(String charsetName) throws UnsupportedEncodingE...
    method extractHttpBodyData (line 83) | public byte[] extractHttpBodyData() {

FILE: sumk-base/src/main/java/org/yx/base/sumk/UnsafeStringWriter.java
  class UnsafeStringWriter (line 6) | public class UnsafeStringWriter extends Writer {
    method UnsafeStringWriter (line 10) | public UnsafeStringWriter() {
    method UnsafeStringWriter (line 14) | public UnsafeStringWriter(int initialSize) {
    method UnsafeStringWriter (line 22) | public UnsafeStringWriter(StringBuilder sb) {
    method write (line 27) | public void write(int c) {
    method write (line 31) | public void write(char cbuf[], int off, int len) {
    method write (line 40) | public void write(String str) {
    method write (line 44) | public void write(String str, int off, int len) {
    method append (line 48) | public UnsafeStringWriter append(CharSequence csq) {
    method append (line 57) | public UnsafeStringWriter append(CharSequence csq, int start, int end) {
    method append (line 63) | public UnsafeStringWriter append(char c) {
    method toString (line 68) | public String toString() {
    method getBuffer (line 72) | public StringBuilder getBuffer() {
    method flush (line 76) | public void flush() {
    method close (line 82) | public void close() throws IOException {

FILE: sumk-base/src/main/java/org/yx/base/sumk/map/ListEntrySet.java
  class ListEntrySet (line 24) | public class ListEntrySet<K, V> extends AbstractSet<Entry<K, V>> {
    method ListEntrySet (line 28) | public ListEntrySet(List<Entry<K, V>> list) {
    method add (line 32) | @Override
    method size (line 42) | @Override
    method getByKey (line 47) | public Entry<K, V> getByKey(K key) {
    method indexKey (line 55) | public int indexKey(K key) {
    method iterator (line 66) | @Override

FILE: sumk-base/src/main/java/org/yx/base/sumk/map/ListMap.java
  class ListMap (line 30) | public class ListMap<K, V> extends AbstractMap<K, V> implements Serializ...
    method ListMap (line 36) | protected ListMap(ListEntrySet<K, V> data) {
    method ListMap (line 40) | public ListMap() {
    method ListMap (line 44) | public ListMap(int initialCapacity) {
    method ListMap (line 48) | public ListMap(Map<K, V> map) {
    method ListMap (line 52) | public ListMap(Map<K, V> map, int estimateGrowSize) {
    method entrySet (line 60) | @Override
    method put (line 65) | @Override

FILE: sumk-base/src/main/java/org/yx/base/sumk/map/UnmodifiableListMap.java
  class UnmodifiableListMap (line 30) | public class UnmodifiableListMap<K, V> extends AbstractMap<K, V> impleme...
    method UnmodifiableListMap (line 36) | public UnmodifiableListMap(Map<K, V> map) {
    method entrySet (line 44) | @Override

FILE: sumk-base/src/main/java/org/yx/base/thread/PriorityRunnable.java
  class PriorityRunnable (line 22) | public class PriorityRunnable implements Runnable {
    method PriorityRunnable (line 28) | public PriorityRunnable(Runnable target, int priority, int threshold) {
    method run (line 34) | @Override
    method priority (line 45) | int priority() {

FILE: sumk-base/src/main/java/org/yx/base/thread/SumkExecutorService.java
  type SumkExecutorService (line 20) | public interface SumkExecutorService extends ExecutorService, ThresholdE...
    method getCorePoolSize (line 22) | int getCorePoolSize();
    method setCorePoolSize (line 24) | void setCorePoolSize(int size);
    method getMaximumPoolSize (line 26) | int getMaximumPoolSize();
    method setMaximumPoolSize (line 28) | void setMaximumPoolSize(int size);
    method allowsCoreThreadTimeOut (line 30) | boolean allowsCoreThreadTimeOut();
    method allowCoreThreadTimeOut (line 32) | void allowCoreThreadTimeOut(boolean allowCoreTimeout);
    method getPoolSize (line 34) | int getPoolSize();
    method getQueued (line 36) | int getQueued();

FILE: sumk-base/src/main/java/org/yx/base/thread/ThreadPools.java
  class ThreadPools (line 30) | public class ThreadPools {
    method create (line 35) | public static SumkExecutorService create(String name, int core, int ma...
    class AbortPolicyQueue (line 45) | private static final class AbortPolicyQueue extends LinkedBlockingQueu...
      method AbortPolicyQueue (line 52) | AbortPolicyQueue(int capacity, int softCapacity) {
      method offer (line 57) | @Override
      method rejectedExecution (line 66) | @Override
    class ThresholdThreadPool (line 89) | private static class ThresholdThreadPool extends ThreadPoolExecutor im...
      method ThresholdThreadPool (line 93) | public ThresholdThreadPool(int corePoolSize, int maximumPoolSize, lo...
      method threshold (line 100) | @Override
      method threshold (line 105) | @Override
      method setThreadFactory (line 110) | @Override
      method setCorePoolSize (line 114) | @Override
      method getQueued (line 121) | @Override

FILE: sumk-base/src/main/java/org/yx/base/thread/ThresholdExecutor.java
  type ThresholdExecutor (line 18) | public interface ThresholdExecutor {
    method threshold (line 20) | int threshold();
    method threshold (line 22) | void threshold(int threshold);

FILE: sumk-base/src/main/java/org/yx/conf/AbsoluteXmlFilesLoader.java
  class AbsoluteXmlFilesLoader (line 28) | public class AbsoluteXmlFilesLoader extends AbstractFilesLoader {
    method AbsoluteXmlFilesLoader (line 30) | public AbsoluteXmlFilesLoader(String rootUri, String subfix) {
    method openResources (line 34) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/AbstractFilesLoader.java
  class AbstractFilesLoader (line 25) | public abstract class AbstractFilesLoader implements MultiResourceLoader...
    method AbstractFilesLoader (line 31) | public AbstractFilesLoader(String rootUri, String subfix) {
    method startListen (line 36) | @Override
    method getRefreshDelay (line 46) | protected long getRefreshDelay() {
    method run (line 50) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/AbstractRefreshableSystemConfig.java
  class AbstractRefreshableSystemConfig (line 23) | public abstract class AbstractRefreshableSystemConfig extends StartOnceL...
    method setConsumer (line 27) | @Override
    method onRefresh (line 32) | @Override
    method invokeConsumer (line 38) | protected final void invokeConsumer() {
    method onStart (line 45) | @Override
    method init (line 52) | protected abstract void init();

FILE: sumk-base/src/main/java/org/yx/conf/AppConfig.java
  class AppConfig (line 36) | public class AppConfig extends AbstractRefreshableSystemConfig {
    method AppConfig (line 45) | public AppConfig() {
    method AppConfig (line 49) | public AppConfig(String fileName) {
    method AppConfig (line 53) | public AppConfig(String fileName, int periodTimeMS) {
    method openInputStream (line 58) | private InputStream openInputStream() throws FileNotFoundException {
    method handle (line 71) | private void handle() {
    method isShowLog (line 94) | public boolean isShowLog() {
    method setShowLog (line 98) | public void setShowLog(boolean showLog) {
    method init (line 102) | @Override
    method keys (line 108) | @Override
    method stop (line 113) | @Override
    method get (line 121) | @Override
    method toString (line 126) | @Override
    method values (line 131) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/AppInfo.java
  class AppInfo (line 31) | public final class AppInfo {
    method init (line 45) | private synchronized static void init() {
    method pid (line 74) | public static String pid() {
    method setConfig (line 78) | private static synchronized void setConfig(SystemConfig config) {
    method refreshConfig (line 87) | static synchronized boolean refreshConfig() {
    method getLocalIp (line 101) | public static String getLocalIp() {
    method appId (line 109) | public static String appId(String defaultValue) {
    method get (line 117) | public static String get(String name) {
    method getLatin (line 121) | public static String getLatin(String name) {
    method getLatin (line 126) | public static String getLatin(String name, String defaultValue) {
    method get (line 131) | public static String get(String name, String defaultValue) {
    method get (line 139) | public static String get(String first, String second, String defaultVa...
    method getInt (line 147) | public static int getInt(String name, int defaultValue) {
    method getLong (line 159) | public static long getLong(String name, long defaultValue) {
    method getBoolean (line 171) | public static boolean getBoolean(String name, boolean defaultValue) {
    method subMap (line 180) | public static Map<String, String> subMap(String prefix) {
    method addObserver (line 197) | public static void addObserver(Consumer<SystemConfig> ob) {
    method removeObserver (line 207) | public static void removeObserver(Consumer<SystemConfig> ob) {
    method notifyUpdate (line 213) | public static synchronized void notifyUpdate() {
    method config (line 227) | public static SystemConfig config() {

FILE: sumk-base/src/main/java/org/yx/conf/ClassPathXmlFilesLoader.java
  class ClassPathXmlFilesLoader (line 37) | public class ClassPathXmlFilesLoader extends AbstractFilesLoader {
    method ClassPathXmlFilesLoader (line 39) | public ClassPathXmlFilesLoader(String rootUri, String subfix) {
    method openResources (line 43) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/ComposedConfig.java
  class ComposedConfig (line 32) | public class ComposedConfig implements SystemConfig, Consumer<Refreshabl...
    method ComposedConfig (line 46) | public ComposedConfig(Map<String, String> top, RefreshableSystemConfig...
    method ComposedConfig (line 50) | public ComposedConfig(Map<String, String> top, RefreshableSystemConfig...
    method createSystemConfig (line 57) | public static ComposedConfig createSystemConfig(RefreshableSystemConfi...
    method accept (line 85) | @Override
    method start (line 93) | @Override
    method stop (line 98) | @Override
    method get (line 103) | @Override
    method keys (line 108) | @Override
    method topConfig (line 113) | public Map<String, String> topConfig() {
    method lowConfig (line 117) | public Map<String, String> lowConfig() {
    method topConfig (line 121) | protected void topConfig(Map<String, String> top) {
    method lowConfig (line 125) | protected void lowConfig(Map<String, String> low) {
    method size (line 129) | public int size() {
    method innerConfig (line 133) | public RefreshableSystemConfig innerConfig() {

FILE: sumk-base/src/main/java/org/yx/conf/Const.java
  class Const (line 18) | public final class Const {
    method sumkVersion (line 24) | public static String sumkVersion() {

FILE: sumk-base/src/main/java/org/yx/conf/FileModifyTime.java
  class FileModifyTime (line 18) | public class FileModifyTime {
    method FileModifyTime (line 23) | public FileModifyTime(String file, long lastModify) {
    method toString (line 28) | @Override
    method getLastModify (line 33) | public long getLastModify() {
    method setLastModify (line 37) | public void setLastModify(long lastModify) {
    method getFile (line 41) | public String getFile() {

FILE: sumk-base/src/main/java/org/yx/conf/LocalMultiResourceLoaderSupplier.java
  class LocalMultiResourceLoaderSupplier (line 21) | public class LocalMultiResourceLoaderSupplier implements Supplier<MultiR...
    method LocalMultiResourceLoaderSupplier (line 25) | public LocalMultiResourceLoaderSupplier(String uri) {
    method get (line 29) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/LocalhostUtil.java
  class LocalhostUtil (line 34) | public final class LocalhostUtil {
    method defaultMatcher (line 40) | private static Predicate<String> defaultMatcher() {
    method isValid (line 47) | private static boolean isValid(InetAddress ia) {
    method getHostAddress (line 54) | private static String getHostAddress(InetAddress ia) {
    method setLocalIp (line 63) | public static synchronized boolean setLocalIp(String ip) {
    method getLocalIP (line 87) | public static String getLocalIP() {
    method resetLocalIp (line 95) | private synchronized static void resetLocalIp() {
    method getLocalIP0 (line 110) | private static String getLocalIP0() throws Exception {
    method getLocalIps (line 129) | private static synchronized String[] getLocalIps() {
    method isUp (line 167) | private static boolean isUp(NetworkInterface ni) throws SocketException {
    method getLocalIPList (line 171) | public static List<String> getLocalIPList() {

FILE: sumk-base/src/main/java/org/yx/conf/MapConfig.java
  class MapConfig (line 24) | public class MapConfig implements SystemConfig {
    method create (line 28) | public static MapConfig create() {
    method map (line 32) | public Map<String, String> map() {
    method replace (line 36) | public MapConfig replace(Map<String, String> config) {
    method get (line 41) | @Override
    method keys (line 46) | @Override
    method put (line 51) | public MapConfig put(String k, String v) {
    method remove (line 56) | public String remove(String key) {
    method putKV (line 60) | public MapConfig putKV(String kv) {
    method start (line 65) | @Override
    method stop (line 70) | @Override
    method toString (line 75) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/MultiNodeConfig.java
  class MultiNodeConfig (line 29) | public abstract class MultiNodeConfig extends AbstractRefreshableSystemC...
    method getDataParser (line 36) | public Function<byte[], Map<String, String>> getDataParser() {
    method setDataParser (line 40) | public void setDataParser(Function<byte[], Map<String, String>> dataPa...
    method parse (line 44) | protected Map<String, String> parse(byte[] data) {
    method get (line 48) | @Override
    method keys (line 53) | @Override
    method values (line 58) | @Override

FILE: sumk-base/src/main/java/org/yx/conf/MultiResourceLoader.java
  type MultiResourceLoader (line 21) | public interface MultiResourceLoader {
    method openResources (line 23) | Map<String, byte[]> openResources(String name) throws Exception;
    method startListen (line 25) | boolean startListen(Consumer<MultiResourceLoader> consumer);

FILE: sumk-base/src/main/java/org/yx/conf/RefreshableSystemConfig.java
  type RefreshableSystemConfig (line 21) | public interface RefreshableSystemConfig extends SystemConfig {
    method setConsumer (line 22) | void setConsumer(Consumer<RefreshableSystemConfig> observer);
    method onRefresh (line 24) | void onRefresh();
    method values (line 26) | Map<String, String> values();

FILE: sumk-base/src/main/java/org/yx/conf/SimpleBeanUtil.java
  class SimpleBeanUtil (line 26) | public class SimpleBeanUtil {
    method setProperty (line 28) | public static void setProperty(Object bean, Method m, String value)
    method parseValue (line 48) | public static Object parseValue(Class<?> ptype, String value) {
    method copyProperties (line 87) | public static void copyProperties(Object bean, Map<String, String> map...
    method getMethod (line 100) | private static Method getMethod(Method[] ms, String key) {

FILE: sumk-base/src/main/java/org/yx/conf/SystemConfig.java
  type SystemConfig (line 22) | public interface SystemConfig extends Lifecycle {
    method get (line 23) | String get(String key);
    method keys (line 25) | Set<String> keys();

FILE: sumk-base/src/main/java/org/yx/conf/SystemConfigHolder.java
  class SystemConfigHolder (line 20) | public class SystemConfigHolder {
    method setSystemConfig (line 29) | public static synchronized boolean setSystemConfig(SystemConfig config) {

FILE: sumk-base/src/main/java/org/yx/conf/UrlSystemConfig.java
  class UrlSystemConfig (line 36) | public class UrlSystemConfig extends MultiNodeConfig {
    method UrlSystemConfig (line 47) | public UrlSystemConfig(List<URL> urls) {
    method stop (line 54) | public final synchronized void stop() {
    method onStop (line 59) | protected void onStop() {
    method init (line 70) | @Override
    method handle (line 78) | protected void handle() {
    method extractData (line 100) | protected byte[] extractData(URL url) {
    method getTimeout (line 129) | public int getTimeout() {
    method setTimeout (line 133) | public void setTimeout(int timeout) {
    method getReadTimeout (line 137) | public int getReadTimeout() {
    method setReadTimeout (line 141) | public void setReadTimeout(int readTimeout) {
    method getMethod (line 145) | public String getMethod() {
    method setMethod (line 149) | public void setMethod(String method) {
    method getPeriod (line 153) | public long getPeriod() {
    method setPeriod (line 157) | public void setPeriod(long period) {

FILE: sumk-base/src/main/java/org/yx/exception/BizException.java
  class BizException (line 23) | public class BizException extends CodeException {
    method BizException (line 27) | public BizException(int code, String msg) {
    method BizException (line 31) | public BizException(String code, String msg) {
    method create (line 35) | public static BizException create(int code, String msg) {
    method throwException (line 39) | public static void throwException(int code, String msg) throws BizExce...
    method create (line 43) | public static BizException create(String code, String msg) {
    method throwException (line 47) | public static void throwException(String code, String msg) throws BizE...
    method fillInStackTrace (line 51) | @Override

FILE: sumk-base/src/main/java/org/yx/exception/CodeException.java
  class CodeException (line 20) | public abstract class CodeException extends RuntimeException {
    method CodeException (line 26) | public CodeException(String code, String msg) {
    method CodeException (line 31) | public CodeException(String code, String msg, Throwable exception) {
    method getCode (line 36) | public String getCode() {
    method isSameCode (line 40) | public boolean isSameCode(String expect) {
    method getLocalizedMessage (line 44) | @Override
    method toString (line 49) | @Override

FILE: sumk-base/src/main/java/org/yx/exception/SimpleSumkException.java
  class SimpleSumkException (line 18) | public final class SimpleSumkException extends SumkException {
    method SimpleSumkException (line 22) | public SimpleSumkException(int code, String msg) {
    method fillInStackTrace (line 26) | @Override

FILE: sumk-base/src/main/java/org/yx/exception/SoaException.java
  class SoaException (line 24) | public final class SoaException extends CodeException {
    method getDetailError (line 32) | public String getDetailError() {
    method getExceptionClz (line 36) | public String getExceptionClz() {
    method create (line 40) | public static SoaException create(String code, String msg, Throwable c...
    method SoaException (line 54) | public SoaException(String code, String msg, String detail) {
    method getException (line 60) | private static String getException(Throwable e) {
    method printRawStackTrace (line 75) | private boolean printRawStackTrace() {
    method fillInStackTrace (line 79) | @Override
    method buildStackTraceMessage (line 87) | private String buildStackTraceMessage() {
    method printStackTrace (line 98) | @Override
    method printStackTrace (line 108) | @Override
    method isBizException (line 117) | public boolean isBizException() {

FILE: sumk-base/src/main/java/org/yx/exception/SumkException.java
  class SumkException (line 23) | public class SumkException extends CodeException {
    method SumkException (line 27) | public SumkException(int code, String msg) {
    method SumkException (line 31) | public SumkException(int code, String msg, Throwable exception) {
    method stringCode (line 35) | private static String stringCode(int code) {
    method wrap (line 39) | public static SumkException wrap(Throwable e) {

FILE: sumk-base/src/main/java/org/yx/exception/SumkExceptionCode.java
  type SumkExceptionCode (line 21) | public interface SumkExceptionCode {

FILE: sumk-base/src/main/java/org/yx/log/CodeLineMarker.java
  class CodeLineMarker (line 23) | public class CodeLineMarker implements Marker {
    method CodeLineMarker (line 29) | public CodeLineMarker(String packageName) {
    method getName (line 33) | @Override
    method add (line 38) | @Override
    method remove (line 43) | @Override
    method hasChildren (line 48) | @Override
    method hasReferences (line 53) | @Override
    method iterator (line 58) | @Override
    method contains (line 75) | @Override
    method contains (line 80) | @Override

FILE: sumk-base/src/main/java/org/yx/log/ConsoleLog.java
  class ConsoleLog (line 21) | public class ConsoleLog extends SumkLogger {
    method get (line 27) | public static SumkLogger get(String name) {
    method ConsoleLog (line 37) | private ConsoleLog(String module) {
    method output (line 41) | @Override
    method output (line 46) | @Override
    method show (line 55) | private void show(LogLevel level, String msg, Object... args) {
    method currentTime (line 64) | private StringBuilder currentTime() {

FILE: sumk-base/src/main/java/org/yx/log/DelegateLogger.java
  class DelegateLogger (line 24) | public final class DelegateLogger implements Logger {
    method incrCount (line 28) | private static void incrCount() {
    method DelegateLogger (line 37) | private DelegateLogger(String name) {
    method get (line 41) | public static DelegateLogger get(String name) {
    method delegate (line 45) | public Logger delegate() {
    method getName (line 74) | @Override
    method isTraceEnabled (line 79) | @Override
    method trace (line 84) | @Override
    method trace (line 89) | @Override
    method trace (line 94) | @Override
    method trace (line 99) | @Override
    method trace (line 104) | @Override
    method isTraceEnabled (line 109) | @Override
    method trace (line 114) | @Override
    method trace (line 119) | @Override
    method trace (line 124) | @Override
    method trace (line 129) | @Override
    method trace (line 134) | @Override
    method isDebugEnabled (line 139) | @Override
    method debug (line 144) | @Override
    method debug (line 149) | @Override
    method debug (line 154) | @Override
    method debug (line 159) | @Override
    method debug (line 164) | @Override
    method isDebugEnabled (line 169) | @Override
    method debug (line 174) | @Override
    method debug (line 179) | @Override
    method debug (line 184) | @Override
    method debug (line 189) | @Override
    method debug (line 194) | @Override
    method isInfoEnabled (line 199) | @Override
    method info (line 204) | @Override
    method info (line 209) | @Override
    method info (line 214) | @Override
    method info (line 219) | @Override
    method info (line 224) | @Override
    method isInfoEnabled (line 229) | @Override
    method info (line 234) | @Override
    method info (line 239) | @Override
    method info (line 244) | @Override
    method info (line 249) | @Override
    method info (line 254) | @Override
    method isWarnEnabled (line 259) | @Override
    method warn (line 264) | @Override
    method warn (line 269) | @Override
    method warn (line 274) | @Override
    method warn (line 279) | @Override
    method warn (line 284) | @Override
    method isWarnEnabled (line 289) | @Override
    method warn (line 294) | @Override
    method warn (line 299) | @Override
    method warn (line 304) | @Override
    method warn (line 309) | @Override
    method warn (line 314) | @Override
    method isErrorEnabled (line 319) | @Override
    method error (line 324) | @Override
    method error (line 329) | @Override
    method error (line 334) | @Override
    method error (line 339) | @Override
    method error (line 344) | @Override
    method isErrorEnabled (line 349) | @Override
    method error (line 354) | @Override
    method error (line 359) | @Override
    method error (line 364) | @Override
    method error (line 369) | @Override
    method error (line 374) | @Override
    method setDelegate (line 379) | public void setDelegate(Logger delegate) {

FILE: sumk-base/src/main/java/org/yx/log/Log.java
  class Log (line 21) | public final class Log {
    method Log (line 24) | private Log() {
    method isTraceEnable (line 27) | public static boolean isTraceEnable(String module) {
    method get (line 31) | public static Logger get(Class<?> clz) {
    method get (line 40) | public static Logger get(String module) {
    method isNOPLogger (line 51) | public static boolean isNOPLogger(Logger logger) {
    method printStack (line 55) | public static void printStack(String module, Throwable e) {
    method isON (line 59) | public static boolean isON(Logger log) {

FILE: sumk-base/src/main/java/org/yx/log/LogKits.java
  class LogKits (line 20) | public final class LogKits {
    method shorterPrefix (line 23) | public static String shorterPrefix(String name, int maxLogNameLength) {
    method shorterSubfix (line 30) | public static String shorterSubfix(String text, int maxLogNameLength) {
    method buildMessage (line 37) | public static String buildMessage(String msg, Object... args) {
    method fromSlf4jLocationAwareLoggerInt (line 69) | public static LogLevel fromSlf4jLocationAwareLoggerInt(int logger_int) {

FILE: sumk-base/src/main/java/org/yx/log/LogLevel.java
  type LogLevel (line 18) | public enum LogLevel {

FILE: sumk-base/src/main/java/org/yx/log/LogSettings.java
  class LogSettings (line 20) | public final class LogSettings {
    method updateSettings (line 29) | public static void updateSettings() {
    method showAttach (line 36) | public static boolean showAttach() {
    method consoleEnable (line 40) | public static boolean consoleEnable() {
    method maxBodyLength (line 44) | public static int maxBodyLength() {
    method maxLogNameLength (line 48) | public static int maxLogNameLength() {

FILE: sumk-base/src/main/java/org/yx/log/Loggers.java
  class Loggers (line 31) | public final class Loggers {
    method Loggers (line 40) | private Loggers(String name) {
    method toString (line 44) | @Override
    method create (line 85) | public static synchronized Loggers create(String name) {
    method getLevel (line 90) | private static LogLevel getLevel(final String fullName) {
    method getLevel (line 117) | public static LogLevel getLevel(SumkLogger log) {
    method resetLevel (line 125) | public synchronized static void resetLevel(Map<String, LogLevel> newLe...
    method setDefaultLevel (line 132) | public static void setDefaultLevel(LogLevel level) {
    method currentLevels (line 138) | public static Map<String, LogLevel> currentLevels() {
    method get (line 142) | public SumkLogger get(String name) {
    method putIfAbsent (line 146) | public SumkLogger putIfAbsent(String name, SumkLogger log) {

FILE: sumk-base/src/main/java/org/yx/log/Logs.java
  class Logs (line 23) | public final class Logs {
    method http (line 25) | public static Logger http() {
    method rpc (line 29) | public static Logger rpc() {
    method system (line 33) | public static Logger system() {
    method db (line 37) | public static Logger db() {
    method redis (line 41) | public static Logger redis() {
    method ioc (line 45) | public static Logger ioc() {
    method asm (line 49) | public static Logger asm() {
    method aop (line 53) | public static Logger aop() {

FILE: sumk-base/src/main/java/org/yx/log/RawLog.java
  class RawLog (line 20) | public final class RawLog {
    method debug (line 23) | @Override
    method info (line 28) | @Override
    method warn (line 33) | @Override
    method error (line 38) | @Override
    method error (line 48) | @Override
    method debug (line 55) | @Override
    method info (line 60) | @Override
    method warn (line 65) | @Override
    method error (line 70) | @Override
    method error (line 75) | @Override
    method setLogger (line 84) | public static void setLogger(SimpleLogger inst) {
    method debug (line 88) | public static void debug(String module, String msg) {
    method info (line 92) | public static void info(String module, String msg) {
    method warn (line 96) | public static void warn(String module, String msg) {
    method error (line 100) | public static void error(String module, String msg) {
    method error (line 104) | public static void error(String module, Throwable e) {
    method error (line 108) | public static void error(String module, String msg, Throwable e) {

FILE: sumk-base/src/main/java/org/yx/log/SimpleLogger.java
  type SimpleLogger (line 18) | public interface SimpleLogger {
    method debug (line 19) | void debug(String module, String msg);
    method info (line 21) | void info(String module, String msg);
    method warn (line 23) | void warn(String module, String msg);
    method error (line 25) | void error(String module, String msg, Throwable e);
    method error (line 27) | void error(String module, String msg);

FILE: sumk-base/src/main/java/org/yx/log/SumkLogger.java
  class SumkLogger (line 27) | public abstract class SumkLogger implements Logger {
    method getName (line 34) | public String getName() {
    method SumkLogger (line 38) | protected SumkLogger(String module) {
    method parseName (line 42) | private String parseName(String module) {
    method isLogable (line 52) | protected boolean isLogable(LogLevel methodLevel) {
    method output (line 56) | protected abstract void output(Marker marker, LogLevel methodLevel, St...
    method output (line 58) | protected abstract void output(Marker marker, LogLevel methodLevel, St...
    method log (line 60) | private void log(LogLevel methodLevel, String msg) {
    method log (line 66) | private void log(LogLevel methodLevel, String format, Object... argume...
    method log (line 72) | private void log(LogLevel methodLevel, String msg, Throwable t) {
    method log (line 78) | private void log(Marker marker, LogLevel methodLevel, String msg) {
    method log (line 84) | private void log(Marker marker, LogLevel methodLevel, String format, O...
    method log (line 90) | private void log(Marker marker, LogLevel methodLevel, String msg, Thro...
    method isTraceEnabled (line 96) | @Override
    method trace (line 101) | @Override
    method trace (line 106) | @Override
    method trace (line 111) | @Override
    method trace (line 116) | @Override
    method trace (line 121) | @Override
    method isDebugEnabled (line 126) | @Override
    method debug (line 131) | @Override
    method debug (line 136) | @Override
    method debug (line 141) | @Override
    method debug (line 146) | @Override
    method debug (line 151) | @Override
    method isInfoEnabled (line 156) | @Override
    method info (line 161) | @Override
    method info (line 166) | @Override
    method info (line 171) | @Override
    method info (line 176) | @Override
    method info (line 181) | @Override
    method isWarnEnabled (line 186) | @Override
    method warn (line 191) | @Override
    method warn (line 196) | @Override
    method warn (line 201) | @Override
    method warn (line 206) | @Override
    method warn (line 211) | @Override
    method isErrorEnabled (line 216) | @Override
    method error (line 221) | @Override
    method error (line 226) | @Override
    method error (line 231) | @Override
    method error (line 236) | @Override
    method error (line 241) | @Override
    method isON (line 246) | public boolean isON() {
    method isTraceEnabled (line 250) | @Override
    method trace (line 255) | @Override
    method trace (line 260) | @Override
    method trace (line 265) | @Override
    method trace (line 270) | @Override
    method trace (line 275) | @Override
    method isDebugEnabled (line 280) | @Override
    method debug (line 285) | @Override
    method debug (line 290) | @Override
    method debug (line 295) | @Override
    method debug (line 300) | @Override
    method debug (line 305) | @Override
    method isInfoEnabled (line 310) | @Override
    method info (line 315) | @Override
    method info (line 320) | @Override
    method info (line 325) | @Override
    method info (line 330) | @Override
    method info (line 335) | @Override
    method isWarnEnabled (line 340) | @Override
    method warn (line 345) | @Override
    method warn (line 350) | @Override
    method warn (line 355) | @Override
    method warn (line 360) | @Override
    method warn (line 365) | @Override
    method isErrorEnabled (line 370) | @Override
    method error (line 375) | @Override
    method error (line 380) | @Override
    method error (line 385) | @Override
    method error (line 390) | @Override
    method error (line 395) | @Override
    method toString (line 400) | @Override

FILE: sumk-base/src/main/java/org/yx/util/BitUtil.java
  class BitUtil (line 5) | public class BitUtil {
    method setBit (line 7) | public static int setBit(int flag, int rightCount, boolean value) {
    method getBit (line 18) | public static boolean getBit(int flag, int rightCount) {
    method setBitsToTrue (line 26) | public static int setBitsToTrue(int flag, int... rightCounts) {

FILE: sumk-base/src/main/java/org/yx/util/CollectionUtil.java
  class CollectionUtil (line 41) | public final class CollectionUtil {
    method loadMapFromText (line 49) | public static Map<String, String> loadMapFromText(String text, String ...
    method fillMapFromText (line 53) | public static Map<String, String> fillMapFromText(Map<String, String> ...
    method saveMapToText (line 75) | public static String saveMapToText(Map<String, ?> map, String bigDelim...
    method fillPropertiesFromText (line 89) | public static Map<String, String> fillPropertiesFromText(final Map<Str...
    method readLine (line 121) | private static String readLine(BufferedReader reader) throws IOExcepti...
    method loadList (line 148) | public static List<String> loadList(InputStream in) throws IOException {
    method isEmpty (line 161) | public static boolean isEmpty(Map<?, ?> map) {
    method isEmpty (line 165) | public static boolean isEmpty(Collection<?> colletion) {
    method isNotEmpty (line 169) | public static boolean isNotEmpty(Collection<?> colletion) {
    method flatMapToTree (line 173) | @SuppressWarnings("unchecked")
    method subMap (line 204) | public static <T> Map<String, T> subMap(@NotNull Map<String, T> source...
    method unmodifyList (line 224) | public static <T> List<T> unmodifyList(Collection<T> col) {
    method unmodifyList (line 252) | public static <T> List<T> unmodifyList(T[] arr) {
    method unmodifyMap (line 270) | public static <K, V> Map<K, V> unmodifyMap(Map<K, V> m) {

FILE: sumk-base/src/main/java/org/yx/util/ExceptionUtil.java
  class ExceptionUtil (line 22) | public final class ExceptionUtil {
    method toRuntimeException (line 24) | public static RuntimeException toRuntimeException(Throwable e) {
    method printStackTrace (line 31) | public static void printStackTrace(StringBuilder sb, Throwable e) {

FILE: sumk-base/src/main/java/org/yx/util/FileUtil.java
  class FileUtil (line 24) | public final class FileUtil {
    method listAllSubFiles (line 31) | public static void listAllSubFiles(Collection<File> filelist, File par...
    method file (line 45) | public static File file(String path) throws URISyntaxException {

FILE: sumk-base/src/main/java/org/yx/util/IOUtil.java
  class IOUtil (line 26) | public final class IOUtil {
    method readAllBytes (line 28) | public static byte[] readAllBytes(InputStream in, boolean closeInput) ...
    method readAll (line 35) | public static String readAll(Reader in, boolean closeInput) throws IOE...
    method transferTo (line 55) | public static int transferTo(InputStream in, OutputStream output, bool...

FILE: sumk-base/src/main/java/org/yx/util/Loader.java
  class Loader (line 24) | public final class Loader {
    method setClassLoader (line 29) | public static void setClassLoader(ClassLoader classLoader) {
    method loader (line 33) | public static ClassLoader loader() {
    method newInstance (line 38) | public static <T> T newInstance(Class<T> clz) throws Exception {
    method newInstance (line 46) | public static Object newInstance(String clz) throws Exception {
    method newInstance (line 51) | public static Object newInstance(String clzName, Object[] params, Clas...
    method loadClass (line 60) | public static Class<?> loadClass(String clz) throws ClassNotFoundExcep...
    method getResourceAsStream (line 64) | public static InputStream getResourceAsStream(String name) {
    method getResources (line 68) | public static Enumeration<URL> getResources(String name) throws IOExce...
    method getResource (line 72) | public static URL getResource(String name) {

FILE: sumk-base/src/main/java/org/yx/util/StringUtil.java
  class StringUtil (line 25) | public final class StringUtil {
    method formatNewLineFlag (line 27) | public static String formatNewLineFlag(@NotNull String text) {
    method uncapitalize (line 31) | public static String uncapitalize(String str) {
    method splitAndTrim (line 48) | public static List<String> splitAndTrim(@NotNull String source, @NotNu...
    method isEmpty (line 66) | public static boolean isEmpty(CharSequence str) {
    method toLatin (line 70) | public static String toLatin(String v) {
    method capitalize (line 75) | public static String capitalize(String str) {
    method isNotEmpty (line 84) | public static boolean isNotEmpty(CharSequence str) {
    method camelToUnderline (line 88) | public static String camelToUnderline(String param) {
    method isNumber (line 110) | public static boolean isNumber(char c) {
    method requireNotEmpty (line 114) | public static String requireNotEmpty(String text) {

FILE: sumk-base/src/main/java/org/yx/util/SumkDate.java
  class SumkDate (line 45) | public final class SumkDate implements Comparable<SumkDate>, Serializable {
    method cacheChangeCount (line 71) | public static int cacheChangeCount() {
    method now (line 81) | public static SumkDate now() {
    method create (line 85) | private static SumkDate create(final long currentMS, boolean toCache) {
    method of (line 109) | public static SumkDate of(Calendar cal) {
    method of (line 116) | public static SumkDate of(Date d) {
    method of (line 120) | public static SumkDate of(long timeInMillis) {
    method of (line 135) | public static SumkDate of(int year, int month, int day, int hour, int ...
    method SumkDate (line 140) | SumkDate(int year, byte month, byte day, byte hour, byte minute, byte ...
    method of (line 168) | public static SumkDate of(LocalDateTime d) {
    method of (line 177) | public static SumkDate of(LocalDate date, LocalTime time) {
    method of (line 195) | public static SumkDate of(final String dateString) {
    method of (line 204) | public static SumkDate of(final String dateString, final String format) {
    method format (line 238) | public static String format(Date d, String format) {
    method format (line 260) | public static String format(LocalDateTime d, String format) {
    method toDate (line 282) | public static Date toDate(String dateString, String format) {
    method toLocalDateTime (line 286) | public static LocalDateTime toLocalDateTime(String dateString, String ...
    method toDate (line 290) | public static Date toDate(LocalDateTime localDateTime) {
    method toLocalDateTime (line 294) | public static LocalDateTime toLocalDateTime(Date date) {
    method takeUpTimeInMils (line 298) | public static long takeUpTimeInMils(SumkDate from, SumkDate to) {
    method getDay (line 320) | public int getDay() {
    method getHour (line 327) | public int getHour() {
    method getMilSecond (line 334) | public int getMilSecond() {
    method getMinute (line 341) | public int getMinute() {
    method getMonth (line 348) | public int getMonth() {
    method getSecond (line 355) | public int getSecond() {
    method getYear (line 363) | public int getYear() {
    method to_HH_mm_ss (line 372) | public String to_HH_mm_ss() {
    method to_HH_mm_ss_SSS (line 381) | public String to_HH_mm_ss_SSS() {
    method to_yyyy_MM (line 390) | public String to_yyyy_MM() {
    method to_yyyy_MM_dd (line 399) | public String to_yyyy_MM_dd() {
    method to_yyyy_MM_dd_HH_mm_ss (line 409) | public String to_yyyy_MM_dd_HH_mm_ss() {
    method to_yyyy_MM_dd_HH_mm_ss_SSS (line 418) | public String to_yyyy_MM_dd_HH_mm_ss_SSS() {
    method toCalendar (line 422) | public Calendar toCalendar() {
    method toDate (line 429) | public Date toDate() {
    method getTimeInMils (line 433) | public long getTimeInMils() {
    method toLocalDate (line 437) | public LocalDate toLocalDate() {
    method toLocalDateTime (line 441) | public LocalDateTime toLocalDateTime() {
    method toLocalTime (line 445) | public LocalTime toLocalTime() {
    method toTimestamp (line 449) | @SuppressWarnings("deprecation")
    method isAfter (line 455) | public boolean isAfter(SumkDate d) {
    method isBefore (line 459) | public boolean isBefore(SumkDate d) {
    method toString (line 466) | @Override
    method hashCode (line 471) | @Override
    method equals (line 485) | @Override
    method compareTo (line 511) | @Override
    method withYear (line 549) | public SumkDate withYear(int year) {
    method withMonth (line 562) | public SumkDate withMonth(int month) {
    method withDay (line 573) | public SumkDate withDay(int day) {
    method withHour (line 581) | public SumkDate withHour(int h) {
    method withMinute (line 591) | public SumkDate withMinute(int m) {
    method withSecond (line 601) | public SumkDate withSecond(int sec) {
    method withMilSecond (line 611) | public SumkDate withMilSecond(int milSecond) {
    method plusYears (line 622) | public SumkDate plusYears(int years) {
    method plusMonths (line 635) | public SumkDate plusMonths(int months) {
    method plusDays (line 642) | public SumkDate plusDays(int days) {
    method plusHours (line 649) | public SumkDate plusHours(int hours) {
    method plusMinutes (line 656) | public SumkDate plusMinutes(int minutes) {
    method plusSeconds (line 663) | public SumkDate plusSeconds(int seconds) {
    method plusMilSeconds (line 670) | public SumkDate plusMilSeconds(int mils) {
    method stringOf (line 677) | public static String stringOf(Date d) {
    method stringOf (line 681) | public static String stringOf(LocalDateTime d) {
    class CacheDate (line 685) | private static final class CacheDate {
      method CacheDate (line 689) | CacheDate(long second, SumkDate date) {
    class UnsafeFormater (line 695) | private static final class UnsafeFormater {
      method UnsafeFormater (line 702) | UnsafeFormater(SumkDate sumkDate) {
      method appendDoubleChar (line 706) | void appendDoubleChar(byte v) {
      method to_HH_mm_ss (line 716) | UnsafeFormater to_HH_mm_ss() {
      method to_HH_mm_ss_SSS (line 730) | UnsafeFormater to_HH_mm_ss_SSS() {
      method to_yyyy_MM (line 747) | UnsafeFormater to_yyyy_MM() {
      method to_yyyy_MM_dd (line 778) | UnsafeFormater to_yyyy_MM_dd() {
      method to_yyyy_MM_dd_HH_mm_ss (line 791) | UnsafeFormater to_yyyy_MM_dd_HH_mm_ss() {
      method to_yyyy_MM_dd_HH_mm_ss_SSS (line 798) | UnsafeFormater to_yyyy_MM_dd_HH_mm_ss_SSS() {
      method toString (line 805) | @Override

FILE: sumk-base/src/main/java/org/yx/util/SumkThreadPool.java
  class SumkThreadPool (line 35) | public final class SumkThreadPool {
    method setDaemon (line 39) | public static void setDaemon(boolean daemon) {
    method createThreadFactory (line 43) | public static ThreadFactory createThreadFactory(String pre) {
    method scheduledExecutor (line 69) | static ScheduledExecutorService scheduledExecutor() {
    method executor (line 73) | public static SumkExecutorService executor() {
    method scheduleAtFixedRate (line 77) | public static ScheduledFuture<?> scheduleAtFixedRate(Runnable job, lon...
    method schedule (line 104) | public static ScheduledFuture<?> schedule(Runnable job, long delayMS) {
    method shutdown (line 108) | public static void shutdown() {
    method synchronize (line 113) | public static Runnable synchronize(Runnable target) {
    class SynchronizedRunner (line 117) | private static final class SynchronizedRunner implements Runnable {
      method SynchronizedRunner (line 124) | public SynchronizedRunner(Runnable target) {
      method run (line 129) | @Override
      method isBusy (line 146) | public boolean isBusy() {
    method scheduleThreadPoolMonitor (line 161) | public static void scheduleThreadPoolMonitor() {
    class ThreadPoolReSeter (line 167) | private static class ThreadPoolReSeter implements Runnable {
      method run (line 171) | @Override
      method resetCurrentThreshold (line 181) | private void resetCurrentThreshold() {
      method resetThreadPoolSize (line 195) | private void resetThreadPoolSize() {

FILE: sumk-base/src/main/java/org/yx/util/Task.java
  class Task (line 27) | public final class Task {
    method scheduleAtFixedRate (line 29) | public static ScheduledFuture<?> scheduleAtFixedRate(Runnable job, lon...
    method schedule (line 33) | public static ScheduledFuture<?> schedule(Runnable job, long delayMS) {
    method scheduleAtFixedRate (line 37) | public static ScheduledFuture<?> scheduleAtFixedRate(Runnable job, lon...

FILE: sumk-base/src/main/java/org/yx/util/UUIDSeed.java
  class UUIDSeed (line 21) | public final class UUIDSeed {
    method fill (line 28) | static void fill(char[] source, final int from, int bytes, long number) {
    method toLong (line 47) | public static long toLong(String s) {
    method getSeqTime (line 59) | public static long getSeqTime(String sn) {
    method getRandomSNTime (line 63) | public static long getRandomSNTime(String sn) {
    method seq (line 69) | public static String seq() {
    method seq18 (line 73) | public static String seq18() {
    method random (line 77) | public static String random() {
    method seqChars (line 81) | static char[] seqChars() {
    method reOrder (line 100) | static String reOrder(char[] cs) {
    method parse (line 119) | public static String parse(long number, int bytes) {

FILE: sumk-db/src/main/java/org/yx/db/DB.java
  class DB (line 42) | public final class DB {
    method insert (line 49) | public static Insert insert() {
    method insert (line 60) | public static Insert insert(Object pojo) {
    method update (line 74) | public static Update update() {
    method update (line 86) | public static Update update(Object pojo) {
    method delete (line 93) | public static Delete delete() {
    method delete (line 104) | public static Delete delete(Object pojo) {
    method select (line 111) | public static Select select() {
    method select (line 115) | public static Select select(Object pojo) {
    method commit (line 122) | public static void commit() throws SQLException {
    method rollback (line 126) | public static void rollback(Exception e) throws SQLException {
    method addHook (line 130) | public static void addHook(TxHook type, Consumer<HookContext> consumer) {
    method execute (line 134) | public static <T> T execute(DBSource ds, DBExecutor<T> executor) throw...

FILE: sumk-db/src/main/java/org/yx/db/DBJson.java
  class DBJson (line 25) | public final class DBJson {
    method operator (line 30) | public static JsonOperator operator() {
    method setOperator (line 34) | public static void setOperator(JsonOperator operator) {

FILE: sumk-db/src/main/java/org/yx/db/SDB.java
  class SDB (line 27) | public class SDB {
    method execute (line 29) | public static int execute(String name, Map<String, Object> map) {
    method insertWithAutoGeneratedKeys (line 33) | public static InsertResult insertWithAutoGeneratedKeys(String name, Ma...
    method list (line 37) | public static List<Map<String, Object>> list(String name, Map<String, ...
    method listInArray (line 41) | public static List<Object[]> listInArray(String name, Map<String, Obje...
    method singleColumnList (line 45) | public static List<?> singleColumnList(String name, Map<String, Object...
    method count (line 49) | public static long count(String name, Map<String, Object> map) {
    method queryOne (line 53) | public static Map<String, Object> queryOne(String name, Map<String, Ob...
    method builder (line 57) | public static SDBuilder builder() {
    method builder (line 61) | public static SDBuilder builder(String name, Object param) {

FILE: sumk-db/src/main/java/org/yx/db/conn/CommonConfigFactory.java
  class CommonConfigFactory (line 30) | @Bean
    method parseFromAppInfo (line 33) | protected Map<String, Map<String, String>> parseFromAppInfo(String dbN...
    method create (line 42) | @Override
    method pureMap (line 55) | public static Map<String, Map<String, String>> pureMap(Map<String, Obj...

FILE: sumk-db/src/main/java/org/yx/db/conn/ConnectionPool.java
  class ConnectionPool (line 36) | public final class ConnectionPool implements AutoCloseable {
    method initialValue (line 40) | @Override
    method addHook (line 59) | public void addHook(TxHook type, Consumer<HookContext> r) {
    method create (line 70) | public static ConnectionPool create(String dbName, DBType dbType, bool...
    method createIfAbsent (line 83) | public static ConnectionPool createIfAbsent(String dbName, DBType dbTy...
    method ConnectionPool (line 92) | private ConnectionPool(String dbName, DBType dbType, boolean autoCommi...
    method get (line 99) | public static ConnectionPool get() {
    method localPoolSize (line 106) | public static int localPoolSize() {
    method clossLeakConnection (line 111) | public static void clossLeakConnection() {
    method connection (line 128) | public SumkConnection connection(DBType userType) throws SQLException {
    method connectionByCommand (line 153) | private SumkConnection connectionByCommand(DBType type) throws SQLExce...
    method getReadConnection (line 168) | private SumkConnection getReadConnection() throws SQLException {
    method getWriteConnection (line 190) | private SumkConnection getWriteConnection() throws SQLException {
    method getDataSource (line 213) | private SumkDataSource getDataSource(SumkConnection c) {
    method runHook (line 220) | private void runHook(TxHook type, Throwable exception) {
    method commit (line 232) | public void commit() throws SQLException {
    method rollback (line 247) | public void rollback(Throwable e) throws SQLException {
    method close (line 260) | @Override
    method getDbName (line 290) | public String getDbName() {
    method getDbType (line 294) | public DBType getDbType() {
    method isAutoCommit (line 298) | public boolean isAutoCommit() {
    method pubuishModify (line 302) | public void pubuishModify(DBEvent event) {
    method existModifyEvent (line 308) | public boolean existModifyEvent(PojoMeta pm) {

FILE: sumk-db/src/main/java/org/yx/db/conn/DBCPDataSourceFactory.java
  class DBCPDataSourceFactory (line 31) | public class DBCPDataSourceFactory implements DataSourceFactory {
    method valid (line 57) | private boolean valid(Map<String, String> properties) {
    method create (line 62) | @Override
    method status (line 80) | @Override

FILE: sumk-db/src/main/java/org/yx/db/conn/DBConfig.java
  class DBConfig (line 31) | public class DBConfig {
    method setPasswordDecryptor (line 43) | public static void setPasswordDecryptor(Function<String, String> passw...
    method create (line 47) | public static DBConfig create(String index, Map<String, String> p) thr...
    method parseFromConfigFile (line 85) | private static DBType parseFromConfigFile(String type) {
    method DBConfig (line 109) | public DBConfig(String index, DBType type, int weight, int readWeight,...
    method getProperty (line 117) | public String getProperty(String name) {
    method getProperties (line 121) | public Map<String, String> getProperties() {
    method getIndex (line 125) | public String getIndex() {
    method getType (line 129) | public DBType getType() {
    method getWeight (line 133) | public int getWeight() {
    method getReadWeight (line 137) | public int getReadWeight() {
    method toString (line 141) | @Override

FILE: sumk-db/src/main/java/org/yx/db/conn/DBConfigFactory.java
  type DBConfigFactory (line 22) | public interface DBConfigFactory extends Ordered {
    method create (line 24) | List<DBConfig> create(String dbName) throws Exception;

FILE: sumk-db/src/main/java/org/yx/db/conn/DSFactory.java
  class DSFactory (line 27) | public final class DSFactory {
    method factory (line 43) | public static DataSourceFactory factory() {
    method setFactory (line 47) | public static void setFactory(DataSourceFactory factory) {
    method create (line 51) | public static SumkDataSource create(String name, String index, DBType ...

FILE: sumk-db/src/main/java/org/yx/db/conn/DataSourceFactory.java
  type DataSourceFactory (line 22) | public interface DataSourceFactory {
    method create (line 23) | DataSource create(Map<String, String> properties, boolean readonly);
    method status (line 25) | Map<String, Number> status(DataSource datasource);

FILE: sumk-db/src/main/java/org/yx/db/conn/DataSourceManager.java
  type DataSourceManager (line 20) | public interface DataSourceManager {
    method status (line 22) | String status();
    method destroy (line 27) | void destroy();
    method writeDataSource (line 29) | SumkDataSource writeDataSource();
    method readDataSource (line 31) | SumkDataSource readDataSource();
    method allDataSources (line 33) | Set<SumkDataSource> allDataSources();

FILE: sumk-db/src/main/java/org/yx/db/conn/DataSourceManagerImpl.java
  class DataSourceManagerImpl (line 32) | public final class DataSourceManagerImpl implements DataSourceManager {
    method DataSourceManagerImpl (line 39) | public DataSourceManagerImpl(String dbName) {
    method DataSourceManagerImpl (line 49) | public DataSourceManagerImpl(String dbName, Router<SumkDataSource> wri...
    method status (line 56) | @Override
    method destroy (line 69) | @Override
    method parseDatasource (line 76) | private void parseDatasource() throws Exception {
    method toString (line 90) | @Override
    method writeDataSource (line 95) | @Override
    method readDataSource (line 100) | @Override
    method allDataSources (line 105) | @Override

FILE: sumk-db/src/main/java/org/yx/db/conn/DataSourceManagerSelector.java
  type DataSourceManagerSelector (line 5) | public interface DataSourceManagerSelector {
    method select (line 7) | DataSourceManager select(String dbName);
    method dbNames (line 14) | Set<String> dbNames();

FILE: sumk-db/src/main/java/org/yx/db/conn/DataSources.java
  class DataSources (line 20) | public final class DataSources {
    method setManagerSelector (line 24) | public static void setManagerSelector(DataSourceManagerSelector select...
    method getManagerSelector (line 28) | public static DataSourceManagerSelector getManagerSelector() {
    method writeDataSource (line 32) | public static SumkDataSource writeDataSource(String dbName) {
    method readDataSource (line 36) | public static SumkDataSource readDataSource(String dbName) {
    method getManager (line 40) | public static DataSourceManager getManager(String dbName) {

FILE: sumk-db/src/main/java/org/yx/db/conn/DefaultManagerSelector.java
  class DefaultManagerSelector (line 34) | public class DefaultManagerSelector implements DataSourceManagerSelector {
    method DefaultManagerSelector (line 45) | public DefaultManagerSelector() {
    method setManagerFactory (line 68) | public void setManagerFactory(Function<String, DataSourceManager> mana...
    method addManagerIfAbsent (line 72) | public synchronized DataSourceManager addManagerIfAbsent(String dbName...
    method removeManager (line 81) | public synchronized DataSourceManager removeManager(String dbName) thr...
    method getDbName (line 90) | protected String getDbName(String dbName) {
    method select (line 97) | @Override
    method aliasMap (line 130) | public Map<String, String> aliasMap() {
    method dbNames (line 134) | public Set<String> dbNames() {

FILE: sumk-db/src/main/java/org/yx/db/conn/HookContext.java
  class HookContext (line 21) | public class HookContext {
    method HookContext (line 26) | public HookContext(SumkDataSource write, SumkDataSource read, Throwabl...
    method getWrite (line 32) | public SumkDataSource getWrite() {
    method getRead (line 36) | public SumkDataSource getRead() {
    method getException (line 40) | public Throwable getException() {

FILE: sumk-db/src/main/java/org/yx/db/conn/RouterFactory.java
  type RouterFactory (line 22) | public interface RouterFactory {
    method create (line 24) | List<Router<SumkDataSource>> create(String dbName) throws Exception;

FILE: sumk-db/src/main/java/org/yx/db/conn/SqlSessionHook.java
  class SqlSessionHook (line 23) | class SqlSessionHook {
    method SqlSessionHook (line 27) | public SqlSessionHook(TxHook type, Consumer<HookContext> action) {
    method getType (line 32) | public TxHook getType() {
    method getAction (line 36) | public Consumer<HookContext> getAction() {
    method hashCode (line 40) | @Override
    method equals (line 49) | @Override

FILE: sumk-db/src/main/java/org/yx/db/conn/SumkConnection.java
  class SumkConnection (line 41) | public final class SumkConnection implements Connection {
    method isReadOnly (line 50) | @Override
    method SumkConnection (line 55) | public SumkConnection(Connection inner, SumkDataSource ds) {
    method originAutoCommit (line 61) | private boolean originAutoCommit() {
    method dataSource (line 71) | public SumkDataSource dataSource() {
    method unwrap (line 75) | @Override
    method isWrapperFor (line 80) | @Override
    method createStatement (line 85) | @Override
    method prepareStatement (line 91) | @Override
    method prepareCall (line 97) | @Override
    method nativeSQL (line 103) | @Override
    method setAutoCommit (line 108) | @Override
    method getAutoCommit (line 117) | @Override
    method commit (line 122) | @Override
    method rollback (line 134) | @Override
    method close (line 139) | @Override
    method isClosed (line 156) | @Override
    method getMetaData (line 164) | @Override
    method setReadOnly (line 169) | @Override
    method setCatalog (line 174) | @Override
    method getCatalog (line 179) | @Override
    method setTransactionIsolation (line 184) | @Override
    method getTransactionIsolation (line 189) | @Override
    method getWarnings (line 194) | @Override
    method clearWarnings (line 199) | @Override
    method createStatement (line 204) | @Override
    method prepareStatement (line 210) | @Override
    method prepareCall (line 217) | @Override
    method getTypeMap (line 223) | @Override
    method setTypeMap (line 228) | @Override
    method setHoldability (line 233) | @Override
    method getHoldability (line 238) | @Override
    method setSavepoint (line 243) | @Override
    method setSavepoint (line 248) | @Override
    method rollback (line 253) | @Override
    method releaseSavepoint (line 258) | @Override
    method createStatement (line 263) | @Override
    method prepareStatement (line 270) | @Override
    method prepareCall (line 277) | @Override
    method prepareStatement (line 284) | @Override
    method prepareStatement (line 290) | @Override
    method prepareStatement (line 296) | @Override
    method createClob (line 302) | @Override
    method createBlob (line 307) | @Override
    method createNClob (line 312) | @Override
    method createSQLXML (line 317) | @Override
    method isValid (line 322) | @Override
    method setClientInfo (line 327) | @Override
    method setClientInfo (line 332) | @Override
    method getClientInfo (line 337) | @Override
    method getClientInfo (line 342) | @Override
    method createArrayOf (line 347) | @Override
    method createStruct (line 352) | @Override
    method setSchema (line 357) | @Override
    method getSchema (line 362) | @Override
    method abort (line 367) | @Override
    method setNetworkTimeout (line 372) | @Override
    method getNetworkTimeout (line 377) | @Override
    method toString (line 382) | @Override
    method isSameInnerConnection (line 387) | public boolean isSameInnerConnection(SumkConnection w) {
    method copy (line 391) | public SumkConnection copy() {
    method recoverAutoCommit (line 395) | private void recoverAutoCommit() throws SQLException {

FILE: sumk-db/src/main/java/org/yx/db/conn/SumkDataSource.java
  class SumkDataSource (line 34) | public class SumkDataSource implements DataSource {
    method SumkDataSource (line 42) | public SumkDataSource(String name, String index, DBType type, DataSour...
    method getOpenCount (line 49) | public long getOpenCount() {
    method getIndex (line 53) | public String getIndex() {
    method getName (line 57) | public String getName() {
    method getType (line 61) | public DBType getType() {
    method getConnection (line 65) | @Override
    method getLogWriter (line 71) | @Override
    method setLogWriter (line 76) | @Override
    method setLoginTimeout (line 81) | @Override
    method getLoginTimeout (line 86) | @Override
    method getParentLogger (line 91) | @Override
    method unwrap (line 96) | @Override
    method isWrapperFor (line 107) | @Override
    method toString (line 112) | @Override
    method getConnection (line 117) | @Override
    method isEnable (line 123) | public boolean isEnable() {
    method setEnable (line 127) | public void setEnable(boolean enable) {
    method close (line 131) | public boolean close() {
    method status (line 148) | public Map<String, Number> status() {

FILE: sumk-db/src/main/java/org/yx/db/conn/WeightedDataSource.java
  class WeightedDataSource (line 20) | public class WeightedDataSource extends AbstractWeightedServer<SumkDataS...
    method WeightedDataSource (line 22) | public WeightedDataSource(SumkDataSource source) {
    method isEnable (line 26) | @Override

FILE: sumk-db/src/main/java/org/yx/db/conn/WeightedRouterFactory.java
  class WeightedRouterFactory (line 31) | public class WeightedRouterFactory implements RouterFactory {
    method create (line 33) | @Override
    method createWeightedRouter (line 63) | protected Router<SumkDataSource> createWeightedRouter(String name, DBT...
    method parseDBConfig (line 75) | protected List<DBConfig> parseDBConfig(String db) throws Exception {

FILE: sumk-db/src/main/java/org/yx/db/dao/AbstractCachable.java
  class AbstractCachable (line 22) | public abstract class AbstractCachable {
    method isCacheEnable (line 26) | public boolean isCacheEnable() {
    method setCacheEnable (line 30) | protected void setCacheEnable(boolean cache) {

FILE: sumk-db/src/main/java/org/yx/db/dao/CountedResult.java
  class CountedResult (line 23) | public class CountedResult<T> {
    method CountedResult (line 27) | public CountedResult(List<T> list, long count) {
    method getResult (line 35) | public List<T> getResult() {
    method getCount (line 42) | public long getCount() {

FILE: sumk-db/src/main/java/org/yx/db/enums/CacheType.java
  type CacheType (line 18) | public enum CacheType {

FILE: sumk-db/src/main/java/org/yx/db/enums/ColumnType.java
  type ColumnType (line 24) | public enum ColumnType {
    method order (line 43) | public int order() {
    method isDbID (line 47) | public boolean isDbID() {
    method isCacheID (line 51) | public boolean isCacheID() {
    method ColumnType (line 55) | private ColumnType(boolean dbId, boolean cacheId, int order) {

FILE: sumk-db/src/main/java/org/yx/db/enums/DBType.java
  type DBType (line 18) | public enum DBType {
    method DBType (line 31) | private DBType(boolean writable, boolean readable) {
    method isWritable (line 36) | public boolean isWritable() {
    method isReadable (line 40) | public boolean isReadable() {

FILE: sumk-db/src/main/java/org/yx/db/enums/TransactionType.java
  type TransactionType (line 18) | public enum TransactionType {

FILE: sumk-db/src/main/java/org/yx/db/enums/TxHook.java
  type TxHook (line 25) | public enum TxHook {

FILE: sumk-db/src/main/java/org/yx/db/enums/ValidRecord.java
  type ValidRecord (line 18) | public enum ValidRecord {

FILE: sumk-db/src/main/java/org/yx/db/event/DBEvent.java
  class DBEvent (line 23) | public class DBEvent {
    method DBEvent (line 27) | public DBEvent(String table) {
    method getTable (line 31) | public String getTable() {
    method getTableMeta (line 35) | public PojoMeta getTableMeta() {

FILE: sumk-db/src/main/java/org/yx/db/event/DBEventPublisher.java
  class DBEventPublisher (line 24) | public final class DBEventPublisher {
    method init (line 30) | public static void init() {
    method onCommit (line 36) | public static void onCommit(List<DBEvent> events) {
    method publishModify (line 42) | public static void publishModify(List<DBEvent> events) {
    method publishModify (line 46) | public static void publishModify(DBEvent event) {
    method publishQuery (line 50) | public static void publishQuery(QueryEvent event) {

FILE: sumk-db/src/main/java/org/yx/db/event/DeleteEvent.java
  class DeleteEvent (line 21) | public class DeleteEvent extends ModifyEvent {
    method DeleteEvent (line 25) | public DeleteEvent(String table, int flag, List<Map<String, Object>> w...
    method getWheres (line 30) | public List<Map<String, Object>> getWheres() {

FILE: sumk-db/src/main/java/org/yx/db/event/EventLane.java
  class EventLane (line 24) | public final class EventLane {
    method EventLane (line 27) | public EventLane() {
    method makeSureEvents (line 30) | private List<DBEvent> makeSureEvents() {
    method pubuishModify (line 37) | public void pubuishModify(SumkConnection conn, DBEvent event) {
    method commit (line 48) | public void commit(SumkConnection conn) throws SQLException {
    method clear (line 59) | public void clear() {
    method existModifyEvent (line 63) | public boolean existModifyEvent(String table) {

FILE: sumk-db/src/main/java/org/yx/db/event/InsertEvent.java
  class InsertEvent (line 21) | public class InsertEvent extends ModifyEvent {
    method InsertEvent (line 25) | public InsertEvent(String table, int flag, List<Map<String, Object>> p...
    method getPojos (line 30) | public List<Map<String, Object>> getPojos() {

FILE: sumk-db/src/main/java/org/yx/db/event/ModifyEvent.java
  class ModifyEvent (line 21) | public class ModifyEvent extends DBEvent {
    method ModifyEvent (line 25) | public ModifyEvent(String table, int flag) {
    method getAffected (line 30) | public int getAffected() {
    method setAffected (line 34) | public void setAffected(int modified) {
    method flag (line 38) | public int flag() {
    method setBoolean (line 49) | public void setBoolean(int slot, boolean h) {
    method getBoolean (line 56) | public boolean getBoolean(int slot) {

FILE: sumk-db/src/main/java/org/yx/db/event/QueryEvent.java
  class QueryEvent (line 21) | public class QueryEvent extends DBEvent {
    method QueryEvent (line 22) | public QueryEvent(String table) {
    method getIn (line 29) | public List<Map<String, Object>> getIn() {
    method setIn (line 33) | public void setIn(List<Map<String, Object>> in) {
    method getResult (line 37) | public List<?> getResult() {
    method setResult (line 41) | public void setResult(List<?> result) {

FILE: sumk-db/src/main/java/org/yx/db/event/UpdateEvent.java
  class UpdateEvent (line 28) | public class UpdateEvent extends ModifyEvent {
    method UpdateEvent (line 34) | public UpdateEvent(String table, int flag, Map<String, Object> to, Map...
    method isFullUpdate (line 42) | public boolean isFullUpdate() {
    method isUpdateDBID (line 46) | public boolean isUpdateDBID() {
    method getTo (line 50) | public Map<String, Object> getTo() {
    method getWheres (line 54) | public List<Map<String, Object>> getWheres() {
    method getIncrMap (line 58) | public Map<String, Number> getIncrMap() {
    method canUpdateCache (line 62) | public boolean canUpdateCache() {
    method removeNull (line 67) | private <K, V> Map<K, V> removeNull(@NotNull Map<K, V> map) {

FILE: sumk-db/src/main/java/org/yx/db/exec/BoxAopExecutorSupplier.java
  class BoxAopExecutorSupplier (line 11) | @Bean
    method order (line 17) | @Override
    method changeToDBSource (line 24) | private DBSource changeToDBSource(BoxSpec box) {
    method willProxy (line 40) | @Override
    method get (line 49) | @Override

FILE: sumk-db/src/main/java/org/yx/db/exec/DBExecutor.java
  type DBExecutor (line 18) | @FunctionalInterface
    method execute (line 21) | T execute(DBSource d) throws Exception;

FILE: sumk-db/src/main/java/org/yx/db/exec/DBSource.java
  type DBSource (line 21) | public interface DBSource {
    method dbName (line 23) | String dbName();
    method dbType (line 25) | DBType dbType();
    method transactionType (line 27) | TransactionType transactionType();

FILE: sumk-db/src/main/java/org/yx/db/exec/DBSources.java
  class DBSources (line 22) | public final class DBSources {
    method write (line 31) | public static DBSource write() {
    method readOnly (line 35) | public static DBSource readOnly() {
    method any (line 39) | public static DBSource any() {
    method write (line 43) | public static DBSource write(String dbName) {
    method readOnly (line 47) | public static DBSource readOnly(String dbName) {
    method any (line 51) | public static DBSource any(String dbName) {
    method writeAutoCommit (line 55) | public static DBSource writeAutoCommit(String dbName) {
    method autoCommit (line 59) | public static DBSource autoCommit(String dbName) {

FILE: sumk-db/src/main/java/org/yx/db/exec/DBTransaction.java
  class DBTransaction (line 26) | public final class DBTransaction implements AopExecutor, AutoCloseable {
    method DBTransaction (line 33) | public DBTransaction(@NotNull DBSource box) {
    method begin (line 37) | public void begin() {
    method rollback (line 54) | public void rollback(Throwable e) {
    method commit (line 65) | public void commit() {
    method close (line 76) | @Override
    method getConnectionPool (line 89) | public ConnectionPool getConnectionPool() {
    method getDBSource (line 93) | public DBSource getDBSource() {
    method before (line 97) | @Override
    method after (line 102) | @Override

FILE: sumk-db/src/main/java/org/yx/db/exec/DefaultDBSource.java
  class DefaultDBSource (line 23) | public class DefaultDBSource implements DBSource {
    method DefaultDBSource (line 28) | public DefaultDBSource(String dbName, DBType type, TransactionType tra...
    method create (line 34) | public static DefaultDBSource create(String dbName, DBType type, Trans...
    method dbName (line 38) | public String dbName() {
    method dbType (line 42) | public DBType dbType() {
    method transactionType (line 46) | @Override
    method toString (line 51) | @Override

FILE: sumk-db/src/main/java/org/yx/db/kit/DBKits.java
  class DBKits (line 30) | public final class DBKits {
    method setPlainSqlParse (line 41) | public static void setPlainSqlParse(Function<PreparedStatement, String...
    method getSqlOfStatement (line 45) | public static String getSqlOfStatement(PreparedStatement statement) {
    method queryOne (line 49) | public static <T> T queryOne(List<T> list) {
    method clearCache (line 60) | @SafeVarargs

FILE: sumk-db/src/main/java/org/yx/db/kit/SDBuilder.java
  class SDBuilder (line 29) | public final class SDBuilder {
    method name (line 33) | public SDBuilder name(String name) {
    method param (line 38) | @SuppressWarnings("unchecked")
    method list (line 52) | public <T> List<T> list(Class<T> clz) {
    method queryOne (line 64) | public <T> T queryOne(Class<T> clz) {
    method toBean (line 69) | private <T> T toBean(Map<String, Object> ret, Class<T> clz) {
    method newInstance (line 76) | private <T> T newInstance(Class<T> clz) {

FILE: sumk-db/src/main/java/org/yx/db/listener/DeleteListener.java
  class DeleteListener (line 31) | @Bean
    method order (line 34) | @Override
    method acceptType (line 39) | @Override
    method listen (line 44) | @Override

FILE: sumk-db/src/main/java/org/yx/db/listener/InsertListener.java
  class InsertListener (line 33) | @Bean
    method order (line 36) | @Override
    method acceptType (line 41) | @Override
    method listen (line 46) | @Override

FILE: sumk-db/src/main/java/org/yx/db/listener/SelectListener.java
  class SelectListener (line 36) | @Bean
    method acceptType (line 39) | @Override
    method listen (line 44) | @Override
    method singleIdCache (line 95) | private void singleIdCache(PojoMeta pm, List<?> result) throws Excepti...

FILE: sumk-db/src/main/java/org/yx/db/listener/UpdateListener.java
  class UpdateListener (line 35) | @Bean
    method order (line 38) | @Override
    method acceptType (line 43) | @Override
    method listen (line 48) | @Override
    method handleUpdate (line 67) | private void handleUpdate(UpdateEvent event, PojoMeta pm, Map<String, ...

FILE: sumk-db/src/main/java/org/yx/db/log/SimpleSqlLogImpl.java
  class SimpleSqlLogImpl (line 40) | public class SimpleSqlLogImpl implements SqlLog {
    method SimpleSqlLogImpl (line 43) | public SimpleSqlLogImpl() {
    method getSqlLogName (line 48) | public static String getSqlLogName() {
    method setSqlLogName (line 52) | public static void setSqlLogName(String sqlLogName) {
    method log (line 59) | @Override

FILE: sumk-db/src/main/java/org/yx/db/mapper/DBPlugin.java
  class DBPlugin (line 39) | @Bean
    method order (line 42) | @Override
    method prepare (line 47) | @Override
    method startAsync (line 62) | @Override
    method preHotDataSource (line 68) | protected void preHotDataSource() {
    method loadSDBResources (line 86) | protected void loadSDBResources() {
    method startListen (line 96) | private void startListen(MultiResourceLoader loader) {
    method loadSql (line 107) | private void loadSql(MultiResourceLoader loader) throws Exception {

FILE: sumk-db/src/main/java/org/yx/db/mapper/ForeachParser.java
  class ForeachParser (line 30) | public class ForeachParser implements SqlParser {
    method create (line 40) | public static ForeachParser create(String collection, String itemName,...
    method ForeachParser (line 53) | protected ForeachParser(String collecitonName, String itemName, String...
    method toMapedSql (line 60) | @SuppressWarnings("unchecked")
    method toString (line 98) | @Override
    class ComposeMapHandler (line 104) | private static class ComposeMapHandler implements Function<String, Obj...
      method ComposeMapHandler (line 110) | public ComposeMapHandler(Map<String, Object> globalMap, Map<String, ...
      method apply (line 116) | @Override
    class ComposeValueHandler (line 126) | private static class ComposeValueHandler implements Function<String, O...
      method ComposeValueHandler (line 132) | public ComposeValueHandler(Map<String, Object> globalMap, Object ite...
      method apply (line 138) | @Override

FILE: sumk-db/src/main/java/org/yx/db/mapper/IFParser.java
  class IFParser (line 24) | public class IFParser implements SqlParser {
    method create (line 29) | public static IFParser create(Predicate<Map<String, Object>> expressio...
    method IFParser (line 36) | protected IFParser(Predicate<Map<String, Object>> expression, SqlParse...
    method toMapedSql (line 41) | @Override
    method toString (line 46) | @Override

FILE: sumk-db/src/main/java/org/yx/db/mapper/ItemsParser.java
  class ItemsParser (line 26) | public class ItemsParser implements SqlParser {
    method create (line 31) | public static ItemsParser create(List<SqlParser> list, JoinerFactory j...
    method ItemsParser (line 38) | protected ItemsParser(SqlParser[] parsers, JoinerFactory joinFactory) {
    method toMapedSql (line 43) | @Override
    method toString (line 59) | @Override

FILE: sumk-db/src/main/java/org/yx/db/mapper/JoinerFactory.java
  class JoinerFactory (line 20) | public class JoinerFactory {
    method create (line 25) | public static JoinerFactory create(String delimiter, String prefix, St...
    method addBlank (line 30) | private static String addBlank(String p) {
    method JoinerFactory (line 41) | private JoinerFactory(String delimiter, String prefix, String suffix) {
    method create (line 47) | public ItemJoiner create() {
    method toString (line 51) | @Override

FILE: sumk-db/src/main/java/org/yx/db/mapper/NamedExecutor.java
  class NamedExecutor (line 35) | public final class NamedExecutor {
    method getExecuteCount (line 39) | public static int getExecuteCount() {
    class InnerSqlBuilder (line 43) | private static class InnerSqlBuilder implements SqlBuilder {
      method InnerSqlBuilder (line 48) | InnerSqlBuilder(SqlParser sql, Map<String, Object> map) {
      method toMapedSql (line 53) | @Override
    method createSqlBuilder (line 61) | private static InnerSqlBuilder createSqlBuilder(SqlParser sql, Map<Str...
    method execute (line 65) | public static int execute(SqlParser sql, Map<String, Object> map) {
    method insertWithAutoGeneratedKeys (line 73) | public static InsertResult insertWithAutoGeneratedKeys(SqlParser sql, ...
    method list (line 81) | public static List<Map<String, Object>> list(SqlParser sql, Map<String...
    method listInArray (line 89) | public static List<Object[]> listInArray(SqlParser sql, Map<String, Ob...
    method singleColumnList (line 97) | public static List<?> singleColumnList(SqlParser sql, Map<String, Obje...
    method count (line 105) | public static long count(SqlParser sql, Map<String, Object> map) {

FILE: sumk-db/src/main/java/org/yx/db/mapper/PureStringParser.java
  class PureStringParser (line 23) | public class PureStringParser implements SqlParser {
    method create (line 27) | public static PureStringParser create(String sql) {
    method PureStringParser (line 34) | private PureStringParser(String sql) {
    method toMapedSql (line 38) | @Override
    method toString (line 43) | @Override

FILE: sumk-db/src/main/java/org/yx/db/mapper/RawExecutor.java
  class RawExecutor (line 33) | public class RawExecutor {
    method execute (line 39) | public static int execute(String sql, Object... params) {
    method insertWithAutoGeneratedKeys (line 54) | public static InsertResult insertWithAutoGeneratedKeys(String sql, Obj...
    method list (line 67) | public static List<Map<String, Object>> list(String sql, Object... par...
    method listInOrder (line 80) | public static List<Object[]> listInOrder(String sql, Object... params) {
    method singleColumnList (line 96) | public static List<?> singleColumnList(String sql, Object... params) {
    method count (line 109) | public static long count(String sql, Object... params) {

FILE: sumk-db/src/main/java/org/yx/db/mapper/SqlHolder.java
  class SqlHolder (line 30) | public class SqlHolder {
    method setSQLS (line 33) | public static void setSQLS(Map<String, SqlParser> sqls) {
    method resourceLoader (line 42) | public static Supplier<MultiResourceLoader> resourceLoader() {
    method resourceLoader (line 46) | public static void resourceLoader(Supplier<MultiResourceLoader> resour...
    method documentBuilderFactory (line 50) | public static Supplier<DocumentBuilder> documentBuilderFactory() {
    method documentBuilderFactory (line 54) | public static void documentBuilderFactory(Supplier<DocumentBuilder> do...
    method findSql (line 58) | public static SqlParser findSql(String name) {

FILE: sumk-db/src/main/java/org/yx/db/mapper/SqlParser.java
  type SqlParser (line 22) | public interface SqlParser {
    method toMapedSql (line 24) | MapedSql toMapedSql(Map<String, Object> param) throws Exception;

FILE: sumk-db/src/main/java/org/yx/db/mapper/SqlParsers.java
  class SqlParsers (line 28) | public final class SqlParsers {
    method createParamExpression (line 32) | public static Predicate<Map<String, Object>> createParamExpression(Str...
    method createParamExpression (line 45) | private static Predicate<Map<String, Object>> createParamExpression(St...

FILE: sumk-db/src/main/java/org/yx/db/mapper/SqlXmlBuilderFactory.java
  class SqlXmlBuilderFactory (line 31) | public class SqlXmlBuilderFactory implements Supplier<DocumentBuilder> {
    method SqlXmlBuilderFactory (line 35) | public SqlXmlBuilderFactory() {
    method create (line 43) | private DocumentBuilder create() throws Exception {
    method get (line 71) | @Override
    method getDocumentBuilderFactory (line 81) | public DocumentBuilderFactory getDocumentBuilderFactory() {

FILE: sumk-db/src/main/java/org/yx/db/mapper/SqlXmlParser.java
  class SqlXmlParser (line 36) | public class SqlXmlParser {
    method parseXml (line 40) | public static void parseXml(Map<String, SqlParser> map, DocumentBuilde...
    method name (line 76) | private static String name(String namespace, String id) {
    method add (line 83) | private static void add(List<SqlParser> list, SqlParser parser) {
    method paramExpression (line 89) | private static Predicate<Map<String, Object>> paramExpression(Element ...
    method compose (line 94) | private static SqlParser compose(List<SqlParser> list) {
    method parseSqlNode (line 104) | private static List<SqlParser> parseSqlNode(NodeList sqlNodeList)
    method forEach (line 149) | private static SqlParser forEach(Element el) {
    method items (line 158) | private static SqlParser items(Element el) throws SAXException, IOExce...

FILE: sumk-db/src/main/java/org/yx/db/monitor/DBMonitor.java
  class DBMonitor (line 19) | public class DBMonitor implements MessageProvider {
    method dbVisitInfo (line 20) | public String dbVisitInfo() {
    method dataSourceStatus (line 51) | public String dataSourceStatus(String name) {
    method get (line 68) | @Override

FILE: sumk-db/src/main/java/org/yx/db/spec/BoxSpec.java
  class BoxSpec (line 23) | public class BoxSpec {
    method BoxSpec (line 28) | public BoxSpec(String value, DBType dbType, TransactionType transactio...
    method value (line 37) | public String value() {
    method dbType (line 41) | public DBType dbType() {
    method transaction (line 45) | public TransactionType transaction() {

FILE: sumk-db/src/main/java/org/yx/db/spec/ColumnSpec.java
  class ColumnSpec (line 22) | public class ColumnSpec {
    method ColumnSpec (line 27) | public ColumnSpec(String value, ColumnType type, byte order) {
    method value (line 36) | public String value() {
    method type (line 40) | public ColumnType type() {
    method order (line 44) | public byte order() {

FILE: sumk-db/src/main/java/org/yx/db/spec/DBSpecs.java
  class DBSpecs (line 29) | public class DBSpecs extends Specs {
    method extractTable (line 54) | public static TableSpec extractTable(Class<?> clz) {
    method extractColumn (line 58) | public static ColumnSpec extractColumn(Class<?> clz, Field f) {
    method extractBox (line 62) | public static BoxSpec extractBox(Method m) {
    method setBoxParser (line 66) | public static void setBoxParser(Function<Method, BoxSpec> boxParser) {
    method setColumnParser (line 70) | public static void setColumnParser(BiFunction<Class<?>, Field, ColumnS...
    method setTableParser (line 74) | public static void setTableParser(Function<Class<?>, TableSpec> tableP...
    method getTableParser (line 78) | public static Function<Class<?>, TableSpec> getTableParser() {
    method getColumnParser (line 82) | public static BiFunction<Class<?>, Field, ColumnSpec> getColumnParser() {
    method getBoxParser (line 86) | public static Function<Method, BoxSpec> getBoxParser() {

FILE: sumk-db/src/main/java/org/yx/db/spec/TableSpec.java
  class TableSpec (line 22) | public class TableSpec {
    method TableSpec (line 29) | public TableSpec(String value, int duration, String preInCache, int ma...
    method value (line 40) | public String value() {
    method duration (line 47) | public int duration() {
    method preInCache (line 56) | public String preInCache() {
    method maxHit (line 63) | public int maxHit() {
    method cacheType (line 70) | public CacheType cacheType() {

FILE: sumk-db/src/main/java/org/yx/db/sql/AbstractOperationGroup.java
  class AbstractOperationGroup (line 24) | public abstract class AbstractOperationGroup implements CompareOperation {
    method addOperation (line 28) | protected void addOperation(CompareOperation op) {
    method isEmpty (line 38) | public boolean isEmpty() {
    method size (line 42) | public int size() {
    method get (line 46) | CompareOperation get(int index) {
    method removeCompares (line 50) | public void removeCompares(String key, Operation op) {
    method buildSql (line 71) | protected CharSequence buildSql(SelectBuilder select, List<Object> par...

FILE: sumk-db/src/main/java/org/yx/db/sql/AbstractSqlBuilder.java
  class AbstractSqlBuilder (line 30) | public abstract class AbstractSqlBuilder<T> implements SqlBuilder {
    method sub (line 44) | protected void sub(String sub) {
    method checkMap (line 51) | protected void checkMap(Map<String, ?> map, PojoMeta pm) {
    method failIfNotAllowPropertyMiss (line 63) | protected void failIfNotAllowPropertyMiss(String key) {
    method checkIn (line 72) | protected void checkIn() {
    method _addIn (line 78) | protected void _addIn(Object src) {
    method populate (line 82) | @SuppressWarnings("unchecked")
    method _addInByMap (line 101) | protected void _addInByMap(Map<String, Object> map) {
    method makeSurePojoMeta (line 111) | public PojoMeta makeSurePojoMeta() {
    method AbstractSqlBuilder (line 124) | public AbstractSqlBuilder(SumkDbVisitor<T> visitor) {
    method isOn (line 129) | public final boolean isOn(int flagBit) {
    method setOnOff (line 133) | protected final void setOnOff(int flagBit, boolean onOff) {
    method flag (line 137) | public int flag() {
    method accept (line 141) | protected T accept(SumkDbVisitor<T> visitor) {

FILE: sumk-db/src/main/java/org/yx/db/sql/ColumnMeta.java
  class ColumnMeta (line 28) | public final class ColumnMeta implements Comparable<ColumnMeta> {
    method ColumnMeta (line 37) | public ColumnMeta(Field field, ColumnSpec c) {
    method isDBID (line 50) | public boolean isDBID() {
    method isCacheID (line 54) | public boolean isCacheID() {
    method value (line 58) | public Object value(Object owner) throws IllegalArgumentException, Ill...
    method setValue (line 67) | public void setValue(Object owner, final Object value) throws Exception {
    method getFieldName (line 77) | public String getFieldName() {
    method compareTo (line 81) | @Override
    method toString (line 89) | @Override
    method getField (line 95) | public Field getField() {
    method getMeta (line 99) | public ColumnType getMeta() {
    method getColumnOrder (line 103) | public int getColumnOrder() {
    method getDbColumn (line 107) | public String getDbColumn() {
    method getComment (line 111) | public String getComment() {

FILE: sumk-db/src/main/java/org/yx/db/sql/ColumnOperation.java
  class ColumnOperation (line 24) | public class ColumnOperation implements CompareOperation {
    method ColumnOperation (line 29) | public ColumnOperation(String name, Operation type, Object value) {
    method getName (line 35) | public String getName() {
    method getType (line 39) | public Operation getType() {
    method getValue (line 43) | public Object getValue() {
    method toString (line 47) | @Override
    method isSameOperation (line 52) | public boolean isSameOperation(ColumnOperation b) {
    method buildSql (line 56) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/CompareOperation.java
  type CompareOperation (line 20) | public interface CompareOperation {
    method buildSql (line 27) | CharSequence buildSql(SelectBuilder select, List<Object> paramters);

FILE: sumk-db/src/main/java/org/yx/db/sql/Count.java
  class Count (line 30) | public class Count {
    method Count (line 33) | public Count(SelectBuilder select) {
    method execute (line 37) | public long execute() {

FILE: sumk-db/src/main/java/org/yx/db/sql/DBFactory.java
  class DBFactory (line 20) | public final class DBFactory {
    method setSupplier (line 23) | public static void setSupplier(DBSupplier supplier) {
    method select (line 27) | public static Select select() {
    method insert (line 31) | public static Insert insert() {
    method update (line 35) | public static Update update() {
    method delete (line 39) | public static Delete delete() {

FILE: sumk-db/src/main/java/org/yx/db/sql/DBFlag.java
  class DBFlag (line 3) | public class DBFlag {

FILE: sumk-db/src/main/java/org/yx/db/sql/DBNameResolvers.java
  class DBNameResolvers (line 9) | public class DBNameResolvers {
    method getColumnNameResolver (line 23) | public static UnaryOperator<String> getColumnNameResolver() {
    method setColumnNameResolver (line 27) | public static void setColumnNameResolver(UnaryOperator<String> columnN...
    method getTableNameResolver (line 31) | public static UnaryOperator<String> getTableNameResolver() {
    method setTableNameResolver (line 35) | public static void setTableNameResolver(UnaryOperator<String> tableNam...
    method getCachePrefixResolver (line 39) | public static UnaryOperator<String> getCachePrefixResolver() {
    method setCachePrefixResolver (line 43) | public static void setCachePrefixResolver(UnaryOperator<String> cacheP...

FILE: sumk-db/src/main/java/org/yx/db/sql/DBSettings.java
  class DBSettings (line 26) | public final class DBSettings {
    method flag (line 52) | public static int flag() {
    method visitCounterFactory (line 56) | public static IntFunction<VisitCounter> visitCounterFactory() {
    method setVisitCounterFactory (line 60) | public static void setVisitCounterFactory(IntFunction<VisitCounter> fa...
    method softDeleteParser (line 64) | public static SoftDeleteParser softDeleteParser() {
    method setSoftDeleteParser (line 68) | public static void setSoftDeleteParser(SoftDeleteParser parser) {
    method maxQueryCacheSize (line 72) | public static int maxQueryCacheSize() {
    method readType (line 76) | public static DBType readType() {
    method maxSingleKeyToCache (line 80) | public static int maxSingleKeyToCache() {
    method getPasswordKey (line 84) | public static byte[] getPasswordKey() {
    method setPasswordKey (line 88) | public static void setPasswordKey(byte[] passwordKey) {
    method debugLogSpendTime (line 92) | public static int debugLogSpendTime() {
    method unionLogTime (line 96) | public static int unionLogTime() {
    method isUnionLogEnable (line 100) | public static boolean isUnionLogEnable() {
    method toCache (line 104) | public static boolean toCache() {
    method MaxLimit (line 108) | public static int MaxLimit() {
    method MaxOffset (line 112) | public static int MaxOffset() {
    method maxSqlParamLength (line 116) | public static int maxSqlParamLength() {
    method init (line 120) | public static synchronized void init() {

FILE: sumk-db/src/main/java/org/yx/db/sql/DBSupplier.java
  type DBSupplier (line 18) | public interface DBSupplier {
    method insert (line 19) | Insert insert();
    method update (line 21) | Update update();
    method select (line 23) | Select select();
    method delete (line 25) | Delete delete();

FILE: sumk-db/src/main/java/org/yx/db/sql/DBSupplierImpl.java
  class DBSupplierImpl (line 20) | public class DBSupplierImpl implements DBSupplier {
    method insert (line 22) | @Override
    method update (line 27) | @Override
    method delete (line 32) | @Override
    method select (line 37) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/Delete.java
  class Delete (line 20) | public class Delete extends ModifySqlBuilder {
    method Delete (line 22) | public Delete(SumkDbVisitor<Integer> visitor) {
    method failIfPropertyNotMapped (line 26) | public Delete failIfPropertyNotMapped(boolean onOff) {
    method delete (line 39) | public Delete delete(Object pojo) {
    method tableClass (line 44) | public Delete tableClass(Class<?> tableClass) {
    method partition (line 55) | public Delete partition(String sub) {
    method toMapedSql (line 60) | public MapedSql toMapedSql() throws InstantiationException, IllegalAcc...

FILE: sumk-db/src/main/java/org/yx/db/sql/EstimateVisitCounter.java
  class EstimateVisitCounter (line 20) | public class EstimateVisitCounter implements VisitCounter {
    method EstimateVisitCounter (line 34) | public EstimateVisitCounter(int interval) {
    method getCacheKeyVisits (line 39) | @Override
    method getCacheKeyHits (line 44) | @Override
    method willVisitCache (line 49) | @Override
    method incrCacheHit (line 59) | @Override
    method getModifyCount (line 64) | @Override
    method incrModifyCount (line 69) | @Override
    method getQueryCount (line 74) | @Override
    method incrQueryCount (line 79) | @Override
    method getInterval (line 84) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/GroupAND.java
  class GroupAND (line 22) | public class GroupAND extends AbstractOperationGroup {
    method create (line 24) | public static GroupAND create() {
    method and (line 28) | public GroupAND and(String name, Operation type, Object value) {
    method and (line 32) | public GroupAND and(CompareOperation op) {
    method buildSql (line 37) | @Override
    method unmodifyFirstLevel (line 42) | GroupAND unmodifyFirstLevel() {

FILE: sumk-db/src/main/java/org/yx/db/sql/GroupOR.java
  class GroupOR (line 20) | public class GroupOR extends AbstractOperationGroup {
    method create (line 22) | public static GroupOR create() {
    method or (line 26) | public GroupOR or(String name, Operation type, Object value) {
    method or (line 30) | public GroupOR or(CompareOperation op) {
    method buildSql (line 35) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/InnerDelete.java
  class InnerDelete (line 24) | public abstract class InnerDelete {
    method InnerDelete (line 27) | public InnerDelete(Delete delete) {
    method toMapedSql (line 31) | protected MapedSql toMapedSql(StringBuilder sb, MapedSql ms) throws In...
  class HardDelete (line 62) | class HardDelete extends InnerDelete implements SqlBuilder {
    method HardDelete (line 64) | public HardDelete(Delete delete) {
    method toMapedSql (line 68) | public MapedSql toMapedSql() throws InstantiationException, IllegalAcc...
  class SoftDelete (line 76) | class SoftDelete extends InnerDelete implements SqlBuilder {
    method SoftDelete (line 78) | public SoftDelete(Delete delete) {
    method toMapedSql (line 82) | public MapedSql toMapedSql() throws InstantiationException, IllegalAcc...

FILE: sumk-db/src/main/java/org/yx/db/sql/Insert.java
  class Insert (line 30) | public class Insert extends ModifySqlBuilder {
    method Insert (line 34) | public Insert(SumkDbVisitor<Integer> visitor) {
    method partition (line 44) | public Insert partition(String sub) {
    method insert (line 54) | public Insert insert(Object pojo) {
    method tableClass (line 60) | public Insert tableClass(Class<?> tableClass) {
    method toMapedSql (line 65) | @Override
    method batchInsert (line 71) | protected MapedSql batchInsert() throws Exception {
    method fillSpecialColumns (line 127) | protected void fillSpecialColumns(Map<String, Object> pojoMap, Object ...

FILE: sumk-db/src/main/java/org/yx/db/sql/InsertResult.java
  class InsertResult (line 20) | public class InsertResult {
    method InsertResult (line 24) | public InsertResult(int effectCount, List<Long> autoGeneratedKeys) {
    method getEffectCount (line 29) | public int getEffectCount() {
    method getAutoGeneratedKeys (line 33) | public List<Long> getAutoGeneratedKeys() {
    method getAutoGeneratedKey (line 37) | public long getAutoGeneratedKey() {

FILE: sumk-db/src/main/java/org/yx/db/sql/MapedSql.java
  class MapedSql (line 25) | public class MapedSql {
    method MapedSql (line 27) | public MapedSql() {
    method MapedSql (line 31) | public MapedSql(String sql, List<Object> paramters) {
    method getSql (line 40) | public String getSql() {
    method setSql (line 44) | public void setSql(String sql) {
    method getParamters (line 48) | public List<Object> getParamters() {
    method addParam (line 52) | public void addParam(Object p) {
    method addParams (line 56) | public void addParams(List<Object> ps) {
    method getEvent (line 63) | public DBEvent getEvent() {
    method setEvent (line 67) | public void setEvent(DBEvent event) {
    method toString (line 71) | @Override
    method merge (line 76) | public static MapedSql merge(List<MapedSql> mapeds, ItemJoiner joiner) {

FILE: sumk-db/src/main/java/org/yx/db/sql/MapedSqlBuilder.java
  class MapedSqlBuilder (line 27) | public class MapedSqlBuilder implements SqlBuilder {
    method MapedSqlBuilder (line 31) | public MapedSqlBuilder(String sql, Map<String, Object> map) {
    method MapedSqlBuilder (line 36) | public MapedSqlBuilder(String sql, Function<String, Object> valueHandl...
    method toMapedSql (line 41) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/ModifySqlBuilder.java
  class ModifySqlBuilder (line 20) | public abstract class ModifySqlBuilder extends AbstractSqlBuilder<Intege...
    method ModifySqlBuilder (line 22) | public ModifySqlBuilder(SumkDbVisitor<Integer> visitor) {
    method execute (line 26) | public int execute() {

FILE: sumk-db/src/main/java/org/yx/db/sql/Operation.java
  type Operation (line 18) | public enum Operation {
    method Operation (line 24) | private Operation(String op) {
    method op (line 28) | public String op() {

FILE: sumk-db/src/main/java/org/yx/db/sql/PojoMeta.java
  class PojoMeta (line 45) | public final class PojoMeta implements Cloneable {
    method PojoMeta (line 78) | public PojoMeta(TableSpec table, List<ColumnMeta> fieldMetas, Class<?>...
    method pojoArrayClz (line 115) | public Type pojoArrayClz() {
    method fieldMetas (line 119) | public List<ColumnMeta> fieldMetas() {
    method getByColumnDBName (line 123) | public ColumnMeta getByColumnDBName(String columnDBName) {
    method getByFieldName (line 132) | public ColumnMeta getByFieldName(String fieldName) {
    method isNoCache (line 136) | public boolean isNoCache() {
    method cacheType (line 140) | public CacheType cacheType() {
    method isPrimeKeySameWithCache (line 144) | public boolean isPrimeKeySameWithCache() {
    method getDatabaseIds (line 148) | public List<ColumnMeta> getDatabaseIds() {
    method isSoftDelete (line 152) | public boolean isSoftDelete() {
    method getCounter (line 156) | public VisitCounter getCounter() {
    method resetCounter (line 165) | public VisitCounter resetCounter() {
    method getTtlSec (line 174) | public int getTtlSec() {
    method parseTable (line 178) | private void parseTable(TableSpec table) {
    method getTableName (line 202) | public String getTableName() {
    method getPre (line 206) | public String getPre() {
    method isOnlyCacheID (line 210) | public boolean isOnlyCacheID(Object condition) throws IllegalArgumentE...
    method getCacheIDs (line 242) | public List<ColumnMeta> getCacheIDs() {
    method buildFromDBColumn (line 246) | public Object buildFromDBColumn(Map<String, Object> map) throws Except...
    method populate (line 263) | @SuppressWarnings("unchecked")
    method populateByDbColumn (line 285) | @SuppressWarnings("unchecked")
    method getCacheID (line 307) | public String getCacheID(Object source, boolean exceptionIfHasNull) th...
    method getCacheIDWithNULL (line 311) | public String getCacheIDWithNULL(Map<String, Object> map) throws Excep...
    method joinColumnsFromMap (line 323) | private String joinColumnsFromMap(Map<String, Object> map, boolean exc...
    method joinColumns (line 342) | @SuppressWarnings("unchecked")
    method subPojoMeta (line 365) | public PojoMeta subPojoMeta(String sub) {
    method subTableName (line 380) | String subTableName(String sub) {
    method createColumns (line 384) | public List<ColumnMeta> createColumns() {
    method timeOnly (line 388) | private static boolean timeOnly(Class<?> type) {
    method pojoClz (line 392) | public Class<?> pojoClz() {
    method getComment (line 396) | public String getComment() {
    method getSoftDelete (line 401) | public SoftDeleteMeta getSoftDelete() {

FILE: sumk-db/src/main/java/org/yx/db/sql/PojoMetaHolder.java
  class PojoMetaHolder (line 26) | public class PojoMetaHolder {
    method getTableMeta (line 31) | public static PojoMeta getTableMeta(String table) {
    method allPojoMeta (line 35) | public static List<PojoMeta> allPojoMeta() {
    method getPojoMeta (line 39) | public static PojoMeta getPojoMeta(PojoMeta pm, String sub) {
    method getPojoMeta (line 49) | public static PojoMeta getPojoMeta(Class<?> clz, String sub) {
    method getPojoMeta (line 66) | public static PojoMeta getPojoMeta(Class<?> clz) {
    method register (line 81) | public static void register(Class<?> pojoClz, TableSpec table, List<Co...

FILE: sumk-db/src/main/java/org/yx/db/sql/RawSqlBuilder.java
  class RawSqlBuilder (line 22) | public class RawSqlBuilder implements SqlBuilder {
    method RawSqlBuilder (line 26) | @SuppressWarnings("unchecked")
    method toMapedSql (line 38) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/Select.java
  class Select (line 55) | public class Select extends SelectBuilder {
    method Select (line 56) | public Select(SumkDbVisitor<List<Map<ColumnMeta, Object>>> visitor) {
    method failIfPropertyNotMapped (line 64) | public Select failIfPropertyNotMapped(boolean onOff) {
    method partition (line 75) | public Select partition(String sub) {
    method allowEmptyWhere (line 86) | public Select allowEmptyWhere(boolean empty) {
    method resultHandler (line 93) | public Select resultHandler(ResultHandler resultHandler) {
    method compareAllowNull (line 98) | public Select compareAllowNull(boolean onOff) {
    method compareIgnoreNull (line 103) | public Select compareIgnoreNull(boolean onOff) {
    method andCompares (line 108) | protected Select andCompares(Operation op, Object pojo) {
    method and (line 119) | private Select and(Operation op, String key, Object value) {
    method bigThan (line 131) | public Select bigThan(String key, Object value) {
    method bigOrEqual (line 135) | public Select bigOrEqual(String key, Object value) {
    method lessThan (line 139) | public Select lessThan(String key, Object value) {
    method lessOrEqual (line 143) | public Select lessOrEqual(String key, Object value) {
    method like (line 154) | public Select like(String key, Object value) {
    method notLike (line 158) | public Select notLike(String key, Object value) {
    method and (line 168) | public Select and(CompareOperation op) {
    method not (line 180) | public Select not(String key, Object value) {
    method in (line 191) | public Select in(String key, Collection<?> values) {
    method notIn (line 195) | public Select notIn(String key, Collection<?> values) {
    method bigThan (line 199) | public Select bigThan(Object pojo) {
    method bigOrEqual (line 209) | public Select bigOrEqual(Object pojo) {
    method lessThan (line 213) | public Select lessThan(Object pojo) {
    method lessOrEqual (line 223) | public Select lessOrEqual(Object pojo) {
    method like (line 227) | public Select like(Object pojo) {
    method not (line 231) | public Select not(Object pojo) {
    method removeCompares (line 242) | public Select removeCompares(String key, Operation op) {
    method orderByAsc (line 253) | public Select orderByAsc(String field) {
    method addOrderBy (line 257) | protected Select addOrderBy(String name, boolean desc) {
    method orderByDesc (line 271) | public Select orderByDesc(String field) {
    method offset (line 281) | public Select offset(int offset) {
    method limit (line 297) | public Select limit(int limit) {
    method selectColumns (line 313) | public Select selectColumns(String... columns) {
    method fromCache (line 328) | public Select fromCache(boolean fromCache) {
    method toCache (line 339) | public Select toCache(boolean toCache) {
    method ignoreMaxLimit (line 344) | public Select ignoreMaxLimit(boolean on) {
    method ignoreMaxOffset (line 349) | public Select ignoreMaxOffset(boolean on) {
    method addEqual (line 361) | public Select addEqual(Object src) {
    method addEqual (line 373) | public Select addEqual(String field, Object value) {
    method byDatabaseId (line 384) | public Select byDatabaseId(Object... ids) {
    method byCacheId (line 397) | public Select byCacheId(Object... ids) {
    method byId (line 401) | protected Select byId(boolean databaseId, Object... ids) {
    method tableClass (line 416) | public Select tableClass(Class<?> tableClass) {
    method resultHandler (line 421) | protected ResultHandler resultHandler() {
    method isCompareOnlyCacheId (line 425) | private boolean isCompareOnlyCacheId() {
    method canUseInCache (line 437) | protected boolean canUseInCache() {
    method queryFromCache (line 442) | protected <T> List<T> queryFromCache(Exchange exchange) throws Excepti...
    method validSelectColumns (line 493) | protected final void validSelectColumns() {
    method queryList (line 510) | public <T> List<T> queryList() {
    method merge (line 555) | protected <T> List<T> merge(List<T> cacheList, List<T> dbList) throws ...
    method queryOne (line 579) | public <T> T queryOne() {
    method count (line 589) | public long count() {

FILE: sumk-db/src/main/java/org/yx/db/sql/SelectBuilder.java
  class SelectBuilder (line 30) | public class SelectBuilder extends AbstractSqlBuilder<List<Map<ColumnMet...
    method SelectBuilder (line 42) | public SelectBuilder(SumkDbVisitor<List<Map<ColumnMeta, Object>>> visi...
    method toMapedSql (line 52) | @Override
    method buildLimitAndOffset (line 75) | protected void buildLimitAndOffset(StringBuilder sql) {
    method buildOrder (line 85) | protected CharSequence buildOrder() {
    method buildField (line 99) | protected CharSequence buildField() {
    method buildWhere (line 119) | protected CharSequence buildWhere(List<Object> paramters) {
    method buildValid (line 128) | private CharSequence buildValid(List<Object> paramters) {
    method buildCompare (line 144) | private CharSequence buildCompare(List<Object> paramters) {
    method buildEquals (line 148) | private CharSequence buildEquals(List<Object> paramters) {
    method parseEqual (line 164) | private CharSequence parseEqual(Map<String, Object> src, List<Object> ...
    class Order (line 191) | protected static class Order {
      method Order (line 197) | public Order(String name, boolean desc) {
      method toString (line 202) | public String toString(PojoMeta pm) {

FILE: sumk-db/src/main/java/org/yx/db/sql/SoftDeleteMeta.java
  class SoftDeleteMeta (line 18) | public final class SoftDeleteMeta {
    method SoftDeleteMeta (line 27) | public SoftDeleteMeta(String columnName, Object validValue, Object inV...
    method getColumnName (line 36) | public String getColumnName() {
    method getValidValue (line 40) | public Object getValidValue() {
    method getInValidValue (line 44) | public Object getInValidValue() {
    method isEqualValid (line 48) | public boolean isEqualValid() {
    method isFieldProvided (line 52) | public boolean isFieldProvided() {

FILE: sumk-db/src/main/java/org/yx/db/sql/SoftDeleteParser.java
  type SoftDeleteParser (line 20) | public interface SoftDeleteParser {
    method parse (line 22) | SoftDeleteMeta parse(Class<?> pojoClz, List<ColumnMeta> fieldMetas);

FILE: sumk-db/src/main/java/org/yx/db/sql/SoftDeleteParserImpl.java
  class SoftDeleteParserImpl (line 24) | public class SoftDeleteParserImpl implements SoftDeleteParser {
    method parseValue (line 26) | public Object parseValue(Class<?> type, String value) {
    method parse (line 51) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/SqlBuilder.java
  type SqlBuilder (line 18) | public interface SqlBuilder {
    method toMapedSql (line 20) | MapedSql toMapedSql() throws Exception;

FILE: sumk-db/src/main/java/org/yx/db/sql/SqlLog.java
  type SqlLog (line 20) | public interface SqlLog {
    method log (line 22) | void log(SumkStatement state, int totalTime, Throwable ex);

FILE: sumk-db/src/main/java/org/yx/db/sql/TableBootWatcher.java
  class TableBootWatcher (line 33) | public class TableBootWatcher extends ParallelBootWatcher {
    method TableBootWatcher (line 35) | public TableBootWatcher() {
    method handle (line 39) | @Override
    method extractColumns (line 49) | public List<ColumnMeta> extractColumns(Class<?> pojoClz) {
    method order (line 74) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/Update.java
  class Update (line 31) | public class Update extends ModifySqlBuilder {
    method updateDBID (line 41) | public Update updateDBID(boolean update) {
    method failIfPropertyNotMapped (line 51) | public Update failIfPropertyNotMapped(boolean onOff) {
    method addWhere (line 68) | public Update addWhere(Object pojo) {
    method Update (line 73) | public Update(SumkDbVisitor<Integer> visitor) {
    method fullUpdate (line 81) | public Update fullUpdate(boolean fullUpdate) {
    method partition (line 92) | public Update partition(String sub) {
    method updateTo (line 109) | public Update updateTo(Object pojo) {
    method tableClass (line 114) | public Update tableClass(Class<?> tableClass) {
    method toMapedSql (line 119) | @Override
    method buildSingleEqual (line 135) | protected CharSequence buildSingleEqual(Map<String, Object> oneEqual, ...
    method buildSetUpdateField (line 170) | protected Map<String, Object> buildSetUpdateField(StringBuilder sb, Ma...
    method _toMapedSql (line 202) | protected MapedSql _toMapedSql() throws Exception {
    method addDBIDs2Where (line 226) | protected void addDBIDs2Where() throws Exception {
    method incrNum (line 243) | public Update incrNum(String fieldName, Number v) {

FILE: sumk-db/src/main/java/org/yx/db/sql/VisitCounter.java
  type VisitCounter (line 21) | public interface VisitCounter {
    method getInterval (line 23) | public int getInterval();
    method getCacheKeyVisits (line 25) | long getCacheKeyVisits();
    method getCacheKeyHits (line 27) | long getCacheKeyHits();
    method getModifyCount (line 29) | long getModifyCount();
    method getQueryCount (line 31) | long getQueryCount();
    method incrCacheHit (line 33) | void incrCacheHit(int c);
    method incrModifyCount (line 35) | void incrModifyCount();
    method incrQueryCount (line 37) | void incrQueryCount();
    method willVisitCache (line 39) | boolean willVisitCache(int c);

FILE: sumk-db/src/main/java/org/yx/db/sql/token/MapValueHandler.java
  class MapValueHandler (line 22) | public class MapValueHandler implements Function<String, Object> {
    method MapValueHandler (line 25) | public MapValueHandler(Map<String, Object> param) {
    method apply (line 29) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/token/MapedSqlTokenParser.java
  class MapedSqlTokenParser (line 23) | public class MapedSqlTokenParser {
    method MapedSqlTokenParser (line 29) | public MapedSqlTokenParser(String openToken, String closeToken, TokenH...
    method parse (line 35) | public MapedSql parse(String text) {
    type TokenHandler (line 70) | public static interface TokenHandler {
      method handleToken (line 72) | String handleToken(String content, List<Object> paramters);

FILE: sumk-db/src/main/java/org/yx/db/sql/token/ReplaceTokenHandler.java
  class ReplaceTokenHandler (line 21) | public final class ReplaceTokenHandler implements StringTokenParser.Toke...
    method createByMap (line 25) | public static ReplaceTokenHandler createByMap(Map<String, Object> map) {
    method create (line 29) | public static ReplaceTokenHandler create(Function<String, Object> valu...
    method ReplaceTokenHandler (line 33) | public ReplaceTokenHandler(Function<String, Object> valueHandler) {
    method handleToken (line 37) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sql/token/StringTokenParser.java
  class StringTokenParser (line 18) | public class StringTokenParser {
    method StringTokenParser (line 24) | public StringTokenParser(String openToken, String closeToken, TokenHan...
    method parse (line 30) | public String parse(String text) {
    type TokenHandler (line 64) | public static interface TokenHandler {
      method handleToken (line 66) | String handleToken(String content);

FILE: sumk-db/src/main/java/org/yx/db/sql/token/VariableTokenHandler.java
  class VariableTokenHandler (line 22) | public class VariableTokenHandler implements MapedSqlTokenParser.TokenHa...
    method createByMap (line 26) | public static VariableTokenHandler createByMap(Map<String, Object> map) {
    method create (line 30) | public static VariableTokenHandler create(Function<String, Object> val...
    method VariableTokenHandler (line 34) | public VariableTokenHandler(Function<String, Object> valueHandler) {
    method handleToken (line 38) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sumk/batis/ConfigurationFactory.java
  type ConfigurationFactory (line 21) | public interface ConfigurationFactory extends Ordered {
    method create (line 23) | Configuration create(String name);

FILE: sumk-db/src/main/java/org/yx/db/sumk/batis/ProxySession.java
  class ProxySession (line 34) | public class ProxySession implements SqlSession {
    method getConnection (line 36) | @Override
    method readSession (line 41) | protected SqlSession readSession() {
    method writeSession (line 51) | protected SqlSession writeSession() {
    method selectOne (line 61) | @Override
    method selectOne (line 66) | @Override
    method selectMap (line 71) | @Override
    method selectMap (line 76) | @Override
    method selectMap (line 81) | @Override
    method selectList (line 86) | @Override
    method selectList (line 91) | @Override
    method selectList (line 96) | @Override
    method select (line 101) | @SuppressWarnings("rawtypes")
    method select (line 107) | @SuppressWarnings("rawtypes")
    method select (line 113) | @SuppressWarnings("rawtypes")
    method insert (line 119) | @Override
    method insert (line 124) | @Override
    method update (line 129) | @Override
    method update (line 134) | @Override
    method delete (line 139) | @Override
    method delete (line 144) | @Override
    method commit (line 149) | @Override
    method commit (line 153) | @Override
    method rollback (line 157) | @Override
    method rollback (line 161) | @Override
    method flushStatements (line 165) | @Override
    method close (line 170) | @Override
    method getConfiguration (line 174) | @Override
    method getMapper (line 179) | @Override
    method clearCache (line 184) | @Override
    method selectCursor (line 189) | @Override
    method selectCursor (line 194) | @Override
    method selectCursor (line 199) | @Override

FILE: sumk-db/src/main/java/org/yx/db/sumk/batis/SqlSessionFactory.java
  class SqlSessionFactory (line 46) | public class SqlSessionFactory {
    method SqlSessionFactory (line 53) | private SqlSessionFactory() {
    method create (line 57) | private static SqlSessionFactory create(String dbName) throws Exception {
    method setResourceLoader (line 80) | public static void setResourceLoader(Supplier<MultiResourceLoader> res...
    method getResourceLoader (line 84) | public static Supplier<MultiResourceLoader> getResourceLoader() {
    method get (line 88) | public static SqlSessionFactory get(String dbName) {
    method destroy (line 113) | void destroy() {
    method reload (line 116) | public static void reload(String dbName) throws Exception {
    method openSession (line 127) | public SqlSession openSession(Connection conn) {
    method sqlParse (line 134) | SqlSessionFactory sqlParse() throws Exception {
    method getConfiguration (line 146) | public Configuration getConfiguration() {

FILE: sumk-db/src/main/java/org/yx/db/sumk/batis/SqlSessionHolder.java
  class SqlSessionHolder (line 25) | public abstract class SqlSessionHolder {
    method session (line 27) | public static SqlSession session() {

FILE: sumk-db/src/main/java/org/yx/db/visit/Exchange.java
  class Exchange (line 29) | public class Exchange {
    method Exchange (line 35) | public Exchange() {
    method setLeftIn (line 38) | public void setLeftIn(List<Map<String, Object>> leftIn) {
    method getLeftIn (line 42) | public List<Map<String, Object>> getLeftIn() {
    method getData (line 46) | public List<String> getData() {
    method findFromCache (line 50) | public void findFromCache(PojoMeta pm) {

FILE: sumk-db/src/main/java/org/yx/db/visit/MapResultHandler.java
  class MapResultHandler (line 33) | public class MapResultHandler implements ResultHandler {
    method filterSelectColumns (line 37) | public static Map<String, Object> filterSelectColumns(Map<String, Obje...
    method parseFromJson (line 51) | @SuppressWarnings("unchecked")
    method parse (line 91) | @SuppressWarnings("unchecked")

FILE: sumk-db/src/main/java/org/yx/db/visit/PojoResultHandler.java
  class PojoResultHandler (line 31) | public class PojoResultHandler implements ResultHandler {
    method filterSelectColumns (line 35) | public void filterSelectColumns(PojoMeta pm, Object obj, List<String> ...
    method parseFromJson (line 46) | @SuppressWarnings("unchecked")
    method parse (line 80) | @SuppressWarnings("unchecked")
    method buildPojo (line 93) | private Object buildPojo(PojoMeta pm, Map<ColumnMeta, Object> map) thr...

FILE: sumk-db/src/main/java/org/yx/db/visit/RecordAccess.java
  type RecordAccess (line 11) | public interface RecordAccess {
    method get (line 13) | String get(PojoMeta m, String id);
    method getMultiValue (line 15) | List<String> getMultiValue(PojoMeta m, Collection<String> ids);
    method set (line 17) | void set(PojoMeta m, String id, String json);
    method del (line 19) | void del(PojoMeta m, String id);
    method delMulti (line 21) | void delMulti(PojoMeta m, String[] ids);

FILE: sumk-db/src/main/java/org/yx/db/visit/RecordRepository.java
  class RecordRepository (line 26) | public final class RecordRepository {
    method access (line 29) | public static RecordAccess access() {
    method setAccess (line 33) | public static void setAccess(RecordAccess access) {
    method get (line 37) | public static String get(PojoMeta m, String id) {
    method set (line 48) | public static void set(PojoMeta m, String id, String json) {
    method del (line 58) | public static void del(PojoMeta m, String id) {
    method delMulti (line 62) | public static void delMulti(PojoMeta m, String[] ids) {
    method getMultiValue (line 69) | public static List<String> getMultiValue(PojoMeta m, Collection<String...

FILE: sumk-db/src/main/java/org/yx/db/visit/RedisAccess.java
  class RedisAccess (line 28) | public final class RedisAccess implements RecordAccess {
    method muteRedis (line 32) | protected Redis muteRedis(String tableName) {
    method getKey (line 36) | protected String getKey(PojoMeta m, String id) {
    method getKeys (line 40) | protected String[] getKeys(PojoMeta m, String[] ids) {
    method get (line 48) | @Override
    method set (line 53) | @Override
    method del (line 71) | @Override
    method delMulti (line 81) | @Override
    method getMultiValue (line 92) | @Override

FILE: sumk-db/src/main/java/org/yx/db/visit/ResultHandler.java
  type ResultHandler (line 27) | public interface ResultHandler {
    method parseFromJson (line 29) | <T> List<T> parseFromJson(PojoMeta pm, List<String> jsons, List<String...
    method parse (line 31) | <T> List<T> parse(PojoMeta pm, List<Map<ColumnMeta, Object>> list) thr...

FILE: sumk-db/src/main/java/org/yx/db/visit/ResultSetUtils.java
  class ResultSetUtils (line 31) | public final class ResultSetUtils {
    method toMapList (line 32) | public static List<Map<String, Object>> toMapList(ResultSet rs) throws...
    method toMapList (line 50) | public static List<Map<ColumnMeta, Object>> toMapList(ResultSet rs, Po...
    method toList (line 77) | public static List<Object> toList(ResultSet rs) throws java.sql.SQLExc...
    method toObjectArrayList (line 91) | public static List<Object[]> toObjectArrayList(ResultSet rs) throws ja...

FILE: sumk-db/src/main/java/org/yx/db/visit/SumkDbVisitor.java
  type SumkDbVisitor (line 20) | public interface SumkDbVisitor<T> {
    method visit (line 22) | T visit(SqlBuilder builder) throws Exception;

FILE: sumk-db/src/main/java/org/yx/db/visit/SumkStatement.java
  class SumkStatement (line 41) | public class SumkStatement implements AutoCloseable {
    method getStatementParamAttacher (line 75) | public static BiConsumer<PreparedStatement, List<Object>> getStatement...
    method setStatementParamAttacher (line 79) | public static void setStatementParamAttacher(BiConsumer<PreparedStatem...
    method getMarker (line 95) | public static CodeLineMarker getMarker() {
    method setMarker (line 99) | public static void setMarker(CodeLineMarker marker) {
    method setSqlLog (line 103) | public static void setSqlLog(SqlLog sqlLog) {
    method create (line 107) | static SumkStatement create(Connection conn, MapedSql maped) throws Ex...
    method createAutoGenerateKeyStatement (line 111) | static SumkStatement createAutoGenerateKeyStatement(Connection conn, M...
    method SumkStatement (line 115) | private SumkStatement(PreparedStatement statement, MapedSql maped) {
    method checkStatement (line 122) | private PreparedStatement checkStatement() throws SQLException {
    method executeUpdate (line 131) | public int executeUpdate() throws SQLException {
    method executeQuery (line 145) | public ResultSet executeQuery() throws Exception {
    method close (line 159) | @Override
    method logSpendTime (line 180) | private void logSpendTime() {
    method buildTimeLog (line 190) | private String buildTimeLog() {
    method attachParams (line 199) | private void attachParams() {
    method getGeneratedKeys (line 211) | public ResultSet getGeneratedKeys() throws SQLException {
    method getSqlTime (line 219) | public int getSqlTime() {
    method getModifyCount (line 223) | public int getModifyCount() {
    method getMaped (line 227) | public MapedSql getMaped() {
    method getExecuteCount (line 231) | public static long getExecuteCount() {

FILE: sumk-db/src/main/java/org/yx/db/visit/Visitors.java
  class Visitors (line 36) | public final class Visitors {
    type Transform (line 38) | public static interface Transform<T> {
      method transFrom (line 39) | T transFrom(ResultSet ret) throws Exception;
    class QueryVisitor (line 42) | public static class QueryVisitor<T> implements SumkDbVisitor<T> {
      method QueryVisitor (line 45) | private QueryVisitor(Transform<T> transform) {
      method visit (line 49) | @Override

FILE: sumk-framework/src/main/java/org/yx/annotation/spec/BeanSpec.java
  class BeanSpec (line 18) | public class BeanSpec {
    method BeanSpec (line 26) | public BeanSpec(String value, String conditionOnProperty, boolean onPr...
    method value (line 32) | public String value() {
    method conditionOnProperty (line 36) | public String conditionOnProperty() {
    method onProperty (line 40) | public boolean onProperty() {

FILE: sumk-framework/src/main/java/org/yx/annotation/spec/BuiltInParsers.java
  class BuiltInParsers (line 30) | public final class BuiltInParsers {
    method createParamSpec (line 75) | public static ParamSpec createParamSpec(Param p) {

FILE: sumk-framework/src/main/java/org/yx/annotation/spec/InjectSpec.java
  class InjectSpec (line 18) | public class InjectSpec {
    method InjectSpec (line 24) | public InjectSpec(String value, boolean allowEmpty, boolean allowMulti) {
    method value (line 30) | public String value() {
    method allowEmpty (line 39) | public boolean allowEmpty() {
    method allowMulti (line 43) | public boolean allowMulti() {

FILE: sumk-framework/src/main/java/org/yx/annotation/spec/ParamSpec.java
  class ParamSpec (line 20) | public class ParamSpec {
    method ParamSpec (line 31) | public ParamSpec(String value, boolean required, int max, int min, Str...
    method value (line 47) | public String value() {
    method required (line 51) | public boolean required() {
    method max (line 55) | public int max() {
    method min (line 59) | public int min() {
    method example (line 63) | public String example() {
    method comment (line 67) | public String comment() {
    method complex (line 71) | public boolean complex() {
    method custom (line 80) | public Object custom() {

FILE: sumk-framework/src/main/java/org/yx/annotation/spec/SpecParsers.java
  class SpecParsers (line 24) | public final class SpecParsers {
    method getBeanParser (line 33) | public static Function<Class<?>, BeanSpec> getBeanParser() {
    method getInjectParser (line 37) | public static BiFunction<Object, Field, InjectSpec> getInjectParser() {
    method getParamFieldParser (line 41) | public static Function<Field, ParamSpec> getParamFieldParser() {
    method getParamParamterParser (line 45) | public static Function<Method, ParamSpec[]> getParamParamterParser() {
    method setBeanParser (line 49) | public static void setBeanParser(Function<Class<?>, BeanSpec> beanPars...
    method setInjectParser (line 53) | public static void setInjectParser(BiFunction<Object, Field, InjectSpe...
    method setParamFieldParser (line 57) | public static void setParamFieldParser(Function<Field, ParamSpec> para...
    method setParamParamterParser (line 61) | public static void setParamParamterParser(Function<Method, ParamSpec[]...

FILE: sumk-framework/src/main/java/org/yx/annotation/spec/Specs.java
  class Specs (line 23) | public class Specs {
    method extractBean (line 25) | public static BeanSpec extractBean(Class<?> clz) {
    method extractInject (line 29) | public static InjectSpec extractInject(Object destBean, Field f) {
    method extractParamField (line 33) | public static ParamSpec extractParamField(Field f) {
    method extractParamParamter (line 37) | public static ParamSpec[] extractParamParamter(Method m) {
    method parse (line 41) | protected static <T, R> R parse(T t, Function<T, R> parser) {
    method parse (line 45) | protected static <T, U, R> R parse(T t, U u, BiFunction<T, U, R> parse...

FILE: sumk-framework/src/main/java/org/yx/bean/BeanAssemblerBootWatcher.java
  class BeanAssemblerBootWatcher (line 11) | public class BeanAssemblerBootWatcher extends ParallelBootWatcher {
    method handle (line 13) | @Override
    method priorityList (line 19) | protected List<List<Class<?>>> priorityList(List<Class<?>> sortedClass...
    method publish (line 23) | @Override
    method order (line 35) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/BeanFieldFinder.java
  type BeanFieldFinder (line 10) | public interface BeanFieldFinder {
    method findTarget (line 20) | Object findTarget(Field f, Object bean, InjectSpec inject) throws Exce...

FILE: sumk-framework/src/main/java/org/yx/bean/BeanKit.java
  class BeanKit (line 25) | public final class BeanKit {
    method getTargetClass (line 27) | public static Class<?> getTargetClass(Object bean) {
    method resloveBeanName (line 31) | public static String resloveBeanName(Class<?> clz) {
    method resloveBeanNames (line 39) | public static Set<String> resloveBeanNames(Class<?> clazz) {
    method resloveSuperClassAndInterface (line 49) | private static void resloveSuperClassAndInterface(Class<?> clazz, Set<...

FILE: sumk-framework/src/main/java/org/yx/bean/BeanPool.java
  class BeanPool (line 45) | public final class BeanPool {
    method proxyIfNeed (line 49) | private Class<?> proxyIfNeed(Class<?> clz) throws Exception {
    method beanNames (line 95) | public List<String> beanNames() {
    method beans (line 100) | public Collection<Object> beans() {
    method putClass (line 110) | public <T> T putClass(String beanName, Class<T> clz) throws Exception {
    method putBean (line 126) | public <T> T putBean(String beanName, T bean) {
    method put (line 140) | private synchronized boolean put(String name, Object bean) {
    method getBean (line 149) | public <T> T getBean(String name, Class<T> clz) {
    method getBeans (line 157) | public <T> List<T> getBeans(String name, Class<T> clz) {
    method getSlot (line 166) | public NameSlot getSlot(String name) {
    method clear (line 170) | public void clear() {
    method toString (line 174) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/BeanProvider.java
  type BeanProvider (line 5) | public interface BeanProvider {
    method getBeans (line 6) | <T> List<T> getBeans(String name, Class<T> clz);
    method beanNames (line 8) | List<String> beanNames();
    method getBean (line 10) | <T> T getBean(String name, Class<T> clz);

FILE: sumk-framework/src/main/java/org/yx/bean/BeanRegistry.java
  class BeanRegistry (line 27) | public class BeanRegistry {
    method registerClass (line 29) | public static void registerClass(Class<?> clz, BeanSpec spec) throws E...
    method valid (line 41) | public static boolean valid(Class<?> clz, BeanSpec bean) {
    method registerBeans (line 56) | public static void registerBeans(Collection<?> beans) throws Exception {
    method registerBean (line 64) | public static void registerBean(String name, Object obj) throws Except...

FILE: sumk-framework/src/main/java/org/yx/bean/Booter.java
  class Booter (line 56) | public final class Booter {
    method start (line 73) | public void start(List<String> packageNames) throws Exception {
    method buildBeanScanerInstance (line 84) | private BeanScanerInstance buildBeanScanerInstance(List<String> packag...
    method onStart (line 91) | private void onStart(List<String> packageNames) {
    method parseFactoriesInstance (line 109) | private FactoriesInstance parseFactoriesInstance() throws IOException {
    method unmodifyClassList (line 125) | private List<Class<?>> unmodifyClassList(List<Class<?>> list) {
    method refresh (line 129) | private void refresh(List<Class<?>> clazzList, List<BootWatcher> watch...
    method loadAndSortClasses (line 141) | private List<Class<?>> loadAndSortClasses(BeanScanerInstance definitio...
    method printClassListDebugInfo (line 166) | private void printClassListDebugInfo(List<Class<?>> sortedClazzList) {
    method loadWatcher (line 176) | private List<BootWatcher> loadWatcher(BeanScanerInstance definition) t...
    method loadClass (line 197) | private Class<?> loadClass(String fullName, BeanScanerInstance definit...
    method injectField (line 226) | private void injectField(Field f, Object bean, Object target) throws I...
    method autoWiredAll (line 233) | private void autoWiredAll(BeanScanerInstance definition) throws Except...
    method injectProperties (line 251) | private void injectProperties(Object bean, BeanScanerInstance definiti...
    class FactoriesInstance (line 275) | private static final class FactoriesInstance {
      method addValues (line 285) | private static void addValues(Set<String> set, String factoryNamesPr...
      method addAll (line 293) | public void addAll(FactoriesInstance f) {
      method fromProperties (line 300) | public static FactoriesInstance fromProperties(Properties properties) {
      method fromContext (line 309) | public static FactoriesInstance fromContext() {
      method toString (line 318) | @Override
    class BeanScanerInstance (line 326) | private static final class BeanScanerInstance {
      method BeanScanerInstance (line 340) | public BeanScanerInstance(List<String> packageNames, FactoriesInstan...
      method createWildcardMatcher (line 348) | private Predicate<String> createWildcardMatcher(Collection<String> p...
      method toString (line 359) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/Boxed.java
  type Boxed (line 3) | public interface Boxed {
    method targetRawClass (line 5) | Class<?> targetRawClass();

FILE: sumk-framework/src/main/java/org/yx/bean/ComplexBean.java
  type ComplexBean (line 18) | public interface ComplexBean {

FILE: sumk-framework/src/main/java/org/yx/bean/DefaultBeanFieldFinder.java
  class DefaultBeanFieldFinder (line 14) | public class DefaultBeanFieldFinder implements BeanFieldFinder {
    method findTarget (line 16) | @Override
    method getSimpleBean (line 30) | protected Object getSimpleBean(Field f, InjectSpec inject) {
    method getListField (line 63) | protected List<?> getListField(Field f, Object bean, boolean allowEmpt...
    method getArrayField (line 85) | protected Object[] getArrayField(Field f, Object bean, boolean allowEm...

FILE: sumk-framework/src/main/java/org/yx/bean/FactoryBean.java
  type FactoryBean (line 23) | public interface FactoryBean {
    method beans (line 31) | Collection<?> beans();

FILE: sumk-framework/src/main/java/org/yx/bean/IOC.java
  class IOC (line 25) | public final class IOC {
    method setProvider (line 29) | public static void setProvider(BeanProvider provider) {
    method get (line 40) | public static <T> T get(String name) {
    method get (line 44) | public static <T> T get(Class<T> clz) {
    method get (line 48) | public static <T> T get(String name, Class<T> clz) {
    method getBeans (line 52) | public static <T> List<T> getBeans(Class<T> clz) {
    method getFirstBean (line 64) | public static <T extends Ordered> T getFirstBean(Class<T> clz, boolean...
    method getBeans (line 77) | public static <T> List<T> getBeans(String name, Class<T> clz) {

FILE: sumk-framework/src/main/java/org/yx/bean/InnerIOC.java
  class InnerIOC (line 24) | public final class InnerIOC {
    method pool (line 27) | static BeanPool pool() {
    method putClass (line 31) | public static <T> T putClass(String name, Class<T> clz) throws Excepti...
    method putClassByInterface (line 35) | public static <T> T putClassByInterface(Class<?> intf, Class<T> clz) t...
    method putBean (line 39) | public static <T> T putBean(String beanName, T bean) {
    method getOrCreate (line 43) | public static <T> T getOrCreate(Class<T> clz) throws Exception {
    method beanNames (line 51) | public static List<String> beanNames() {
    method getSlot (line 55) | public static NameSlot getSlot(String name) {
    method beans (line 59) | public static Collection<Object> beans() {
    method clear (line 63) | public static void clear() {
    method info (line 67) | public static String info() {
    method getAopExecutorChain (line 71) | public static AopExecutorChain getAopExecutorChain(int index) {

FILE: sumk-framework/src/main/java/org/yx/bean/InnerProvider.java
  class InnerProvider (line 5) | public class InnerProvider implements BeanProvider {
    method getBeans (line 7) | @Override
    method beanNames (line 12) | @Override
    method getBean (line 17) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/InterfaceBean.java
  class InterfaceBean (line 22) | public final class InterfaceBean implements ComplexBean {
    method InterfaceBean (line 27) | public InterfaceBean(Class<?> intf, Object bean) {
    method getIntf (line 35) | public Class<?> getIntf() {
    method getBean (line 39) | public Object getBean() {

FILE: sumk-framework/src/main/java/org/yx/bean/NameSlot.java
  class NameSlot (line 26) | public class NameSlot {
    method NameSlot (line 31) | public NameSlot(String name, Object[] beans) {
    method beans (line 36) | public List<Object> beans() {
    method appendBean (line 40) | public synchronized boolean appendBean(Object bean) {
    method resolveType (line 60) | private Class<?> resolveType(Class<?> clz) {
    method getBean (line 70) | @SuppressWarnings("unchecked")
    method getBeans (line 93) | @SuppressWarnings("unchecked")
    method name (line 109) | public String name() {
    method toString (line 113) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/NamedBean.java
  class NamedBean (line 22) | public final class NamedBean implements ComplexBean {
    method NamedBean (line 33) | public NamedBean(String beanName, Object bean) {
    method getBeanName (line 45) | public String getBeanName() {
    method getBean (line 49) | public Object getBean() {

FILE: sumk-framework/src/main/java/org/yx/bean/ParallelBootWatcher.java
  class ParallelBootWatcher (line 35) | public abstract class ParallelBootWatcher implements BootWatcher {
    method handle (line 43) | protected abstract void handle(Class<?> clz) throws Exception;
    method publish (line 45) | @Override
    method serialPublish (line 56) | protected void serialPublish(List<Class<?>> sortedClasses, Predicate<S...
    method parallelPublish (line 63) | protected void parallelPublish(List<Class<?>> scanedClasses, Predicate...
    method createExecutor (line 76) | protected ExecutorService createExecutor() {
    class BootCallable (line 87) | private static class BootCallable implements Callable<Boolean> {
      method BootCallable (line 93) | public BootCallable(Class<?> clz, Predicate<String> optional, Parall...
      method call (line 99) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/Plugin.java
  type Plugin (line 27) | public interface Plugin extends Ordered {
    method prepare (line 31) | default void prepare() {
    method startAsync (line 38) | void startAsync();
    method afterStarted (line 43) | default void afterStarted() {
    method stop (line 47) | default void stop() {

FILE: sumk-framework/src/main/java/org/yx/bean/PluginBooter.java
  class PluginBooter (line 31) | public class PluginBooter {
    method start (line 33) | public void start() {
    method startBeans (line 38) | private void startBeans() {
    method preHotCoreThreads (line 79) | private void preHotCoreThreads(SumkExecutorService executor) {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/AopContext.java
  class AopContext (line 5) | public class AopContext {
    method AopContext (line 9) | public AopContext(AopExecutorSupplier supplier, Object attach) {
    method getAopExecutor (line 14) | public AopExecutor getAopExecutor() {
    method getSupplier (line 18) | public AopExecutorSupplier getSupplier() {
    method getAttach (line 22) | public Object getAttach() {
    method hashCode (line 26) | @Override
    method equals (line 31) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/aop/AopExecutor.java
  type AopExecutor (line 30) | public interface AopExecutor {
    method before (line 38) | void before(Object[] params) throws Exception;
    method after (line 48) | Throwable after(Object result, Throwable e, boolean methodExecuted);

FILE: sumk-framework/src/main/java/org/yx/bean/aop/AopExecutorChain.java
  class AopExecutorChain (line 12) | public class AopExecutorChain {
    method AopExecutorChain (line 16) | public AopExecutorChain(AopExecutor[] excutors) {
    method before (line 20) | public void before(Object[] params) throws Exception {
    method after (line 28) | public void after(Object result, Throwable e, boolean methodExecuted) {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/AopExecutorManager.java
  class AopExecutorManager (line 10) | public class AopExecutorManager {
    method get (line 14) | public static AopExecutorManager get() {
    method reset (line 18) | public static void reset() {
    method getChain (line 24) | public AopExecutorChain getChain(int index) {
    method willProxyExcutorSuppliers (line 33) | public List<AopContext> willProxyExcutorSuppliers(Class<?> clz, Method...
    method indexSupplier (line 48) | public synchronized int indexSupplier(List<AopContext> supplierList) {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/AopExecutorSupplier.java
  type AopExecutorSupplier (line 15) | public interface AopExecutorSupplier extends Ordered {
    method willProxy (line 25) | Object willProxy(Class<?> clz, Method rawMethod);
    method get (line 34) | @NotNull

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/AsmUtils.java
  class AsmUtils (line 39) | public final class AsmUtils {
    method proxyCalssName (line 42) | public static String proxyCalssName(Class<?> clz) {
    method asmVersion (line 48) | public static int asmVersion() {
    method jvmVersion (line 52) | public static int jvmVersion() {
    method openStreamForClass (line 56) | public static InputStream openStreamForClass(Class<?> clz) {
    method sameType (line 61) | public static boolean sameType(Type[] types, Class<?>[] clazzes) {
    method buildMethodInfos (line 75) | public static List<MethodParamInfo> buildMethodInfos(List<Method> meth...
    method buildMethodInfos (line 92) | private static List<MethodParamInfo> buildMethodInfos(Class<?> declari...
    method getMethod (line 100) | public static Method getMethod(Class<?> clz, String methodName, Class<...
    method getProxyClassLoader (line 118) | private static ProxyClassLoader getProxyClassLoader(ClassLoader origin...
    method defineClass (line 128) | public static Class<?> defineClass(String fullName, byte[] b, ClassLoa...
    method notPublicOnly (line 165) | public static boolean notPublicOnly(int modifiers) {
    method canProxy (line 170) | public static boolean canProxy(int modifiers) {
    method getImplicitFrame (line 174) | public static List<Object> getImplicitFrame(String desc) {
    method getSameMethod (line 224) | public static Method getSameMethod(Method method, Class<?> otherClass) {
    method clearProxyClassLoaders (line 242) | public static void clearProxyClassLoaders() {
    method aopClassLoaders (line 246) | public static HashMap<ClassLoader, ProxyClassLoader> aopClassLoaders() {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/MethodInfoClassVisitor.java
  class MethodInfoClassVisitor (line 36) | class MethodInfoClassVisitor extends ClassVisitor {
    method MethodInfoClassVisitor (line 40) | public MethodInfoClassVisitor(List<Method> methods) {
    method createMethodInfo (line 49) | private MethodParamInfo createMethodInfo(Method m) {
    method getMethodParamInfo (line 59) | private MethodParamInfo getMethodParamInfo(String methodName, String d...
    method visitMethod (line 68) | @Override
    method visit (line 79) | @Override
    method visitSource (line 83) | @Override
    method visitModule (line 87) | @Override
    method visitNestHost (line 92) | @Override
    method visitOuterClass (line 96) | @Override
    method visitAnnotation (line 100) | @Override
    method visitTypeAnnotation (line 105) | @Override
    method visitAttribute (line 110) | @Override
    method visitNestMember (line 114) | @Override
    method visitInnerClass (line 118) | @Override
    method visitField (line 122) | @Override
    method visitEnd (line 127) | @Override
    method getMethodInfos (line 131) | public List<MethodParamInfo> getMethodInfos() {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/MethodParamInfo.java
  class MethodParamInfo (line 22) | public final class MethodParamInfo {
    method getArgNames (line 30) | public String[] getArgNames() {
    method getDescs (line 34) | public String[] getDescs() {
    method getSignatures (line 38) | public String[] getSignatures() {
    method MethodParamInfo (line 42) | public MethodParamInfo(Method method, String[] argNames, String[] desc...
    method getMethod (line 50) | public Method getMethod() {
    method getMethodDesc (line 54) | public String getMethodDesc() {
    method isSameMethod (line 58) | public boolean isSameMethod(String methodName, String desc) {
    method getArgumentTypes (line 64) | public Type[] getArgumentTypes() {
    method getDeclaringClass (line 68) | public Class<?> getDeclaringClass() {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/MethodPojo.java
  class MethodPojo (line 28) | public class MethodPojo {
    method MethodPojo (line 34) | public MethodPojo(Class<? extends ParamPojo> clz, String[] names, Type...
    method paramTypes (line 46) | public List<Type> paramTypes() {
    method paramNames (line 50) | public List<String> paramNames() {
    method paramClz (line 54) | public Class<? extends ParamPojo> paramClz() {
    method getIndex (line 58) | public int getIndex(String name) {
    method getParamType (line 67) | public Type getParamType(int index) {
    method getParamName (line 71) | public String getParamName(int index) {
    method createParamPojo (line 75) | public ParamPojo createParamPojo(Map<String, Object> map) throws Excep...
    method createEmptyParamObj (line 85) | @SuppressWarnings("unchecked")
    method paramLength (line 90) | public int paramLength() {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ParamPojo.java
  type ParamPojo (line 18) | public interface ParamPojo {
    method params (line 20) | Object[] params();
    method invoke (line 22) | Object invoke(Object owner) throws Throwable;
    method setParams (line 24) | void setParams(Object[] objs);
    method createEmpty (line 26) | ParamPojo createEmpty();

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ParamPojoClassFactory.java
  class ParamPojoClassFactory (line 43) | final class ParamPojoClassFactory {
    method ParamPojoClassFactory (line 53) | public ParamPojoClassFactory(MethodParamInfo p) {
    method create (line 60) | @SuppressWarnings("unchecked")
    method buildInit (line 89) | private void buildInit() {
    method buildParams (line 99) | private void buildParams() {
    method buildArgArray (line 108) | private static void buildArgArray(String fullName, MethodVisitor mv, A...
    method buildCreateEmpty (line 118) | private void buildCreateEmpty() {
    method buildInvoke (line 133) | private void buildInvoke() {
    method loadObjectFields (line 159) | private static void loadObjectFields(String fullName, MethodVisitor mv...
    method buildSetParams (line 166) | private void buildSetParams() {
    method checkCast (line 197) | private void checkCast(MethodVisitor mv, Class<?> argType, String desc) {
    class Arg (line 216) | static class Arg {
      method Arg (line 220) | private Arg(String name, String desc) {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ParamPojos.java
  class ParamPojos (line 22) | public class ParamPojos {
    method get (line 25) | public static MethodPojo get(Class<? extends ParamPojo> clz) {
    method create (line 29) | public synchronized static MethodPojo create(MethodParamInfo p) throws...

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ParseParamsMethodVisitor.java
  class ParseParamsMethodVisitor (line 29) | public class ParseParamsMethodVisitor extends MethodVisitor {
    method ParseParamsMethodVisitor (line 36) | public ParseParamsMethodVisitor(int api, MethodParamInfo info) {
    method visitLocalVariable (line 43) | @Override
    method visitEnd (line 55) | @Override
    class LocalArg (line 84) | private static class LocalArg implements Comparable<LocalArg> {
      method LocalArg (line 90) | public LocalArg(String name, String desc, int index, String signatur...
      method compareTo (line 97) | @Override
      method toString (line 102) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ProxyClassLoader.java
  class ProxyClassLoader (line 3) | public class ProxyClassLoader extends ClassLoader {
    method ProxyClassLoader (line 5) | public ProxyClassLoader(ClassLoader parent) {
    method defineClass (line 9) | public Class<?> defineClass(String name, byte[] clzByts) {
    method toString (line 13) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ProxyClassVistor.java
  class ProxyClassVistor (line 41) | public class ProxyClassVistor extends ClassVisitor {
    method ProxyClassVistor (line 47) | public ProxyClassVistor(final ClassVisitor cv, String newClzName, Clas...
    method visit (line 54) | @Override
    method queryMethod (line 68) | private Entry<Method, Integer> queryMethod(String name, String desc) {
    method visitMethod (line 79) | @Override
    method visitOuterClass (line 104) | @Override
    method visitAnnotation (line 108) | @Override
    method visitTypeAnnotation (line 113) | @Override
    method visitAttribute (line 118) | @Override
    method visitInnerClass (line 122) | @Override
    method visitField (line 126) | @Override
    method visitEnd (line 131) | @Override

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/ProxyMethodWritor.java
  class ProxyMethodWritor (line 49) | public final class ProxyMethodWritor {
    method jReturn (line 51) | private static void jReturn(MethodVisitor mv, Class<?> c) {
    method argLength (line 65) | private static int argLength(Class<?>[] params) {
    class ProxyBuilder (line 73) | private static class ProxyBuilder {
      method jReturn (line 84) | private void jReturn() {
      method jReturnNULLOrException (line 88) | private void jReturnNULLOrException() {
      method storeReuturnToLocalVariable (line 103) | private int storeReuturnToLocalVariable(int frameIndex) {
      method loadArgs (line 107) | private void loadArgs() {
      method ProxyBuilder (line 114) | public ProxyBuilder(MethodVisitor mv, AsmMethod asmMethod) {
      method callSuperMethod (line 124) | private void callSuperMethod() {
      method writeVoidMethod (line 130) | private void writeVoidMethod(int key) {
      method write (line 167) | public void write() {
      method visitAfter (line 182) | private void visitAfter() {
      method visitBefore (line 187) | private void visitBefore() {
      method writeWithReturn (line 191) | private void writeWithReturn(int key) {
      method visitFullFrame (line 232) | private void visitFullFrame() {
    method write (line 245) | public static void write(MethodVisitor mv, AsmMethod asmMethod) {
    class AsmMethod (line 249) | static class AsmMethod {
      method AsmMethod (line 260) | public AsmMethod(int access, String name, String desc, String signat...

FILE: sumk-framework/src/main/java/org/yx/bean/aop/asm/WriterHelper.java
  class WriterHelper (line 39) | public final class WriterHelper {
    method visitInt (line 43) | public static void visitInt(MethodVisitor mv, int num) {
    method buildParamArray (line 59) | public static void buildParamArray(MethodVisitor mv, Class<?>[] params) {
    method loadFromLocalVariable (line 77) | public static int loadFromLocalVariable(MethodVisitor mv, Class<?> c, ...
    method boxPrimitive (line 140) | public static int boxPrimitive(MethodVisitor mv, Class<?> c) {
    method storeToLocalVariable (line 177) | public static int storeToLocalVariable(MethodVisitor mv, Class<?> c, i...
    method boxDesc (line 200) | public static String boxDesc(String desc) {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/context/CalleeNode.java
  class CalleeNode (line 37) | public abstract class CalleeNode {
    method CalleeNode (line 49) | public CalleeNode(Object owner, Method method, MethodPojo params, int ...
    method registerFieldInfos (line 69) | protected void registerFieldInfos() {
    method overflowThreshold (line 81) | public boolean overflowThreshold() {
    method createEmptyParamObj (line 96) | public ParamPojo createEmptyParamObj() {
    method getDeclaringClass (line 100) | public Class<?> getDeclaringClass() {
    method getReturnType (line 104) | public Class<?> getReturnType() {
    method getMethodName (line 108) | public String getMethodName() {
    method getParameterTypes (line 112) | public Class<?>[] getParameterTypes() {
    method rawMethod (line 116) | public Method rawMethod() {
    method getAnnotation (line 120) | public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
    method getDeclaredAnnotations (line 124) | public Annotation[] getDeclaredAnnotations() {
    method getParameterAnnotations (line 128) | public Annotation[][] getParameterAnnotations() {
    method getAnnotatedReturnType (line 132) | public AnnotatedType getAnnotatedReturnType() {
    method toplimit (line 136) | public int toplimit() {
    method paramLength (line 140) | public int paramLength() {
    method owner (line 144) | public Object owner() {
    method execute (line 148) | public Object execute(ParamPojo argObj) throws Throwable {
    method paramNames (line 172) | public List<String> paramNames() {
    method paramInfos (line 176) | public List<ParamInfo> paramInfos() {
    method params (line 180) | public MethodPojo params() {
    method comment (line 184) | public String comment() {

FILE: sumk-framework/src/main/java/org/yx/bean/aop/context/NodeContext.java
  class NodeContext (line 26) | public abstract class NodeContext<T extends CalleeNode> {
    method node (line 29) | @NotNull
    method getParamPojo (line 32) | public ParamPojo getParamPojo() {
    method setParamPojo (line 36) | public void setParamPojo(ParamPojo argPojo) {
    method getParams (line 43) | public Map<String, Object> getParams() {

FILE: sumk-framework/src/main/java/org/yx/bean/watcher/BeanCreateWatcher.java
  type BeanCreateWatcher (line 22) | public interface BeanCreateWatcher extends Ordered {
    method afterCreate (line 24) | void afterCreate(List<Object> beans);

FILE: sumk-framework/src/main/java/org/yx/bean/watcher/BeanInjectWatcher.java
  type BeanInjectWatcher (line 26) | public interface BeanInjectWatcher extends Ordered {
    method afterInject (line 28) | void afterInject(List<Object> beans);

FILE: sumk-framework/src/main/java/org/yx/bean/watcher/BootWatcher.java
  type BootWatcher (line 14) | public interface BootWatcher extends Ordered {
    method publish (line 24) | List<Class<?>> publish(List<Class<?>> sortedClasses, Predicate<String>...

FILE: sumk-framework/src/main/java/org/yx/common/Host.java
  class Host (line 21) | public final class Host implements Comparable<Host> {
    method Host (line 25) | private Host(String ip, int port) {
    method create (line 30) | public static Host create(String addr) {
    method create (line 38) | public static Host create(String ip, int port) {
    method ip (line 42) | public String ip() {
    method port (line 46) | public int port() {
    method toInetSocketAddress (line 50) | public InetSocketAddress toInetSocketAddress() {
    method hashCode (line 54) | @Override
    method equals (line 63) | @Override
    method toAddressString (line 82) | public String toAddressString() {
    method toString (line 89) | @Override
    method compareTo (line 94) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/Predicator.java
  class Predicator (line 8) | public class Predicator {
    method test (line 10) | public static boolean test(String vs, Predicate<String> p) {
    method andTest (line 17) | public static boolean andTest(String vs, Predicate<String> p) {
    method orTest (line 27) | public static boolean orTest(String vs, Predicate<String> p) {

FILE: sumk-framework/src/main/java/org/yx/common/StringEntity.java
  class StringEntity (line 23) | public final class StringEntity<T> {
    method StringEntity (line 27) | private StringEntity(String key, T value) {
    method create (line 32) | public static <T> StringEntity<T> create(String key, T value) {
    method key (line 36) | public String key() {
    method value (line 40) | public T value() {
    method hashCode (line 44) | @Override
    method equals (line 53) | @Override
    method toString (line 75) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/action/ActInfoUtil.java
  class ActInfoUtil (line 42) | public final class ActInfoUtil {
    method describe (line 44) | public static Object describe(Class<?> clazz, Class<? extends Annotati...
    method createMap (line 76) | private static Map<String, Object> createMap(String name, CalleeNode n...
    method simpleInfoMap (line 85) | public static Map<String, Object> simpleInfoMap(String name, CalleeNod...
    method fullInfoMap (line 99) | public static Map<String, Object> fullInfoMap(String name, CalleeNode ...
    method fullDescribe (line 131) | public static ParamDescript fullDescribe(Class<?> clazz, ParameterInfo...

FILE: sumk-framework/src/main/java/org/yx/common/action/ActionStatis.java
  type ActionStatis (line 20) | public interface ActionStatis {
    method visit (line 22) | void visit(String name, long time, boolean success);
    method getAndReset (line 24) | Map<String, StatisItem> getAndReset();
    method getAll (line 26) | Map<String, StatisItem> getAll();

FILE: sumk-framework/src/main/java/org/yx/common/action/ActionStatisImpl.java
  class ActionStatisImpl (line 22) | public class ActionStatisImpl implements ActionStatis {
    method ActionStatisImpl (line 26) | public ActionStatisImpl(Map<String, StatisItem> actStatis) {
    method ActionStatisImpl (line 30) | public ActionStatisImpl() {
    method setActStatis (line 34) | public void setActStatis(Map<String, StatisItem> actStatis) {
    method visit (line 38) | public void visit(String name, long time, boolean success) {
    method getAndReset (line 54) | public Map<String, StatisItem> getAndReset() {
    method getAll (line 60) | public Map<String, StatisItem> getAll() {

FILE: sumk-framework/src/main/java/org/yx/common/action/ParamDescript.java
  class ParamDescript (line 22) | public class ParamDescript {
    method getComplexFields (line 42) | public List<ParamDescript> getComplexFields() {
    method setComplexFields (line 46) | public void setComplexFields(List<ParamDescript> list) {
    method getName (line 50) | public String getName() {
    method setName (line 54) | public void setName(String name) {
    method getCnName (line 58) | public String getCnName() {
    method setCnName (line 62) | public void setCnName(String cnName) {
    method getRequired (line 66) | public Boolean getRequired() {
    method setRequired (line 70) | public void setRequired(Boolean required) {
    method getMax (line 74) | public Integer getMax() {
    method setMax (line 78) | public void setMax(Integer max) {
    method getMin (line 82) | public Integer getMin() {
    method setMin (line 86) | public void setMin(Integer min) {
    method getType (line 90) | public String getType() {
    method setType (line 94) | public ParamDescript setType(String type) {
    method setType (line 99) | public ParamDescript setType(Class<?> type) {
    method getExample (line 109) | public String getExample() {
    method setExample (line 113) | public void setExample(String example) {
    method getComment (line 117) | public String getComment() {
    method setComment (line 121) | public void setComment(String comment) {
    method getCustom (line 125) | public Object getCustom() {
    method setCustom (line 129) | public void setCustom(String custom) {
    method getComplex (line 133) | public Boolean getComplex() {
    method setComplex (line 137) | public void setComplex(Boolean complex) {
    method getArray (line 141) | public Boolean getArray() {
    method setArray (line 145) | public void setArray(Boolean array) {
    method copyFrom (line 149) | public ParamDescript copyFrom(ParameterInfo info, boolean supportCompl...
    method getValue (line 165) | private String getValue(String v) {

FILE: sumk-framework/src/main/java/org/yx/common/action/StatisItem.java
  class StatisItem (line 20) | public class StatisItem {
    method StatisItem (line 27) | public StatisItem(String name) {
    method successVisit (line 31) | public void successVisit(long t) {
    method failedVisit (line 36) | public void failedVisit(long t) {
    method toString (line 41) | @Override
    method toSimpleString (line 47) | public String toSimpleString() {
    method header (line 55) | public static String header() {
    method getName (line 59) | public String getName() {
    method getSuccessCount (line 63) | public long getSuccessCount() {
    method getSuccessTime (line 67) | public long getSuccessTime() {
    method getFailedCount (line 71) | public long getFailedCount() {
    method getFailedTime (line 75) | public long getFailedTime() {

FILE: sumk-framework/src/main/java/org/yx/common/expression/AndExpression.java
  class AndExpression (line 25) | public class AndExpression implements Predicate<Map<String, Object>> {
    method AndExpression (line 29) | @SuppressWarnings("unchecked")
    method test (line 37) | @Override
    method toString (line 47) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/expression/Expressions.java
  class Expressions (line 24) | public class Expressions {
    method createSimpleExpression (line 25) | public static SimpleExpression createSimpleExpression(String key, Stri...
    method booleanExpression (line 41) | public static Predicate<Map<String, Object>> booleanExpression(Collect...
    method and (line 52) | public static Predicate<Map<String, Object>> and(Collection<Predicate<...
    method or (line 56) | public static Predicate<Map<String, Object>> or(Collection<Predicate<M...

FILE: sumk-framework/src/main/java/org/yx/common/expression/HasKeyExpression.java
  class HasKeyExpression (line 20) | public class HasKeyExpression extends SimpleExpression {
    method HasKeyExpression (line 22) | HasKeyExpression(String key) {
    method test (line 26) | @Override
    method toString (line 31) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/expression/MatchType.java
  class MatchType (line 20) | public final class MatchType {
    method matchTypeOrDefault (line 34) | public static String matchTypeOrDefault(String type) {

FILE: sumk-framework/src/main/java/org/yx/common/expression/NotEmptyExpression.java
  class NotEmptyExpression (line 20) | public class NotEmptyExpression extends SimpleExpression {
    method NotEmptyExpression (line 22) | NotEmptyExpression(String key) {
    method test (line 26) | @Override
    method toString (line 35) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/expression/NotNullExpression.java
  class NotNullExpression (line 20) | public class NotNullExpression extends SimpleExpression {
    method NotNullExpression (line 22) | NotNullExpression(String key) {
    method test (line 26) | @Override
    method toString (line 31) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/expression/OrExpression.java
  class OrExpression (line 25) | public class OrExpression implements Predicate<Map<String, Object>> {
    method OrExpression (line 29) | @SuppressWarnings("unchecked")
    method test (line 37) | @Override
    method toString (line 47) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/expression/SimpleExpression.java
  class SimpleExpression (line 21) | public abstract class SimpleExpression implements Predicate<Map<String, ...
    method SimpleExpression (line 25) | SimpleExpression(String key) {
    method hashCode (line 29) | @Override
    method equals (line 37) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/json/ByteArrayTypeAdapter.java
  class ByteArrayTypeAdapter (line 30) | public class ByteArrayTypeAdapter extends TypeAdapter<byte[]> {
    method ByteArrayTypeAdapter (line 32) | private ByteArrayTypeAdapter() {
    method write (line 37) | @Override
    method read (line 47) | @Override
    method rawRead (line 67) | private byte[] rawRead(JsonReader in) throws IOException {

FILE: sumk-framework/src/main/java/org/yx/common/json/GsonHelper.java
  class GsonHelper (line 29) | public final class GsonHelper {
    method builder (line 31) | public static GsonBuilder builder(String module) {
    method gson (line 73) | public static Gson gson(String module) {

FILE: sumk-framework/src/main/java/org/yx/common/json/GsonOperator.java
  class GsonOperator (line 25) | public class GsonOperator implements JsonOperator {
    method GsonOperator (line 29) | public GsonOperator(Gson gson) {
    method setGson (line 33) | public void setGson(Gson gson) {
    method getGson (line 37) | public Gson getGson() {
    method toJson (line 41) | @Override
    method fromJson (line 49) | @Override
    method fromJson (line 54) | @Override

FILE: sumk-framework/src/main/java/org/yx/common/json/JsonOperator.java
  type JsonOperator (line 20) | public interface JsonOperator {
    method toJson (line 22) | String toJson(Object obj);
    method fromJson (line 24) | <T> T fromJson(String json, Class<T> clz);
    method fromJson (line 26) | <T> T fromJson(String json, Type type);

FILE: sumk-framework/src/main/java/org/yx/common/json/JsonTypes.java
  class JsonTypes (line 26) | public final class JsonTypes {
    method registe (line 29) | public static Type registe(String name, Type type) {
    method registeIfAbsent (line 33) | public static Type registeIfAbsent(String name, Type type) {
    method remove (line 37) | public static Type remove(String name) {
    method get (line 41) | public static Type get(String name) {
    method keys (line 45) | public static Set<String> keys() {
    method registe (line 49) | public static Type registe(Type type) {

FILE: sumk-framework/src/main/java/org/yx/common/json/ParamPojoTypeAdapter.java
  class ParamPojoTypeAdapter (line 32) | public class ParamPojoTypeAdapter<T extends ParamPojo> extends TypeAdapt...
    method ParamPojoTypeAdapter (line 39) | public ParamPojoTypeAdapter(Gson gson, MethodPojo info) {
    method read (line 44) | @Override
    method write (line 74) | @SuppressWarnings({ "unchecked", "rawtypes" })

FILE: sumk-framework/src/main/java/org/yx/common/json/ParamPojoTypeAdapterFactory.java
  class ParamPojoTypeAdapterFactory (line 28) | public class ParamPojoTypeAdapterFactory implements TypeAdapterFactory {
    method create (line 30) | @SuppressWarnings({ "rawtypes", "unchecked" })

FILE: sumk-framework/src/main/java/org/yx/common/json/ServerJsonExclusionStrategy.java
  class ServerJsonExclusionStrategy (line 27) | public class ServerJsonExclusionStrategy implements ExclusionStrategy {
    method ServerJsonExclusionStrategy (line 31) | public ServerJsonExclusionStrategy(Class<? extends Annotation> exclude...
    method shouldSkipField (line 35) | @Override
    method shouldSkipClass (line 40) | @Override
    method addServerExclusionStrategy (line 45) | public static GsonBuilder addServerExclusionStrategy(GsonBuilder gb) {

FILE: sumk-framework/src/main/java/org/yx/common/listener/ConcurrentSumkListener.java
  class ConcurrentSumkListener (line 24) | public abstract class ConcurrentSumkListener implements SumkListener {
    method ConcurrentSumkListener (line 28) | public ConcurrentSumkListener() {
    method listenBatch (line 33) | @Override
    method listen (line 38) | @Override
    method executor (line 43) | public Executor executor() {
    method createExecutor (line 52) | protected Executor createExecutor() {
    method asyncListenBatch (line 56) | protected void asyncListenBatch(List<?> events) throws Exception {
    method asyncListen (line 62) | protected abstract void asyncListen(Object event) throws Exception;

FILE: sumk-framework/src/main/java/org/yx/common/listener/EventBus.java
  class EventBus (line 14) | public class EventBus {
    method EventBus (line 19) | public EventBus(List<SumkListener> list, Executor executor) {
    method publishBatch (line 25) | public void publishBatch(List<?> events) {
    method publish (line 35) | public void publish(Object event) {
    method asyncPublishBatch (line 45) | public void asyncPublishBatch(List<?> events) {
    method asyncPublish (line 49) | public void asyncPublish(Object event) {
    met
Condensed preview — 689 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,780K chars).
[
  {
    "path": "CHANGELOG",
    "chars": 8800,
    "preview": "v2.3.1\n1、将JsonUtil改为S.json\n2、sdb和mybatis的配置文件可以打包到jar中\n\nv2.3.2\n1、增加jetty端口被占用时的重试功能,默认重试将近2分钟。通过http.bind.retry=0可以关闭重试功"
  },
  {
    "path": "LICENSE",
    "chars": 11594,
    "preview": "                                 Apache License\r\n                           Version 2.0, January 2004\r\n                 "
  },
  {
    "path": "README.md",
    "chars": 1116,
    "preview": "# sumk\r\n\r\nsumk是为互联网而生的,在性能、分布式、扩展性等方面考虑较多,互联网常见的特性很多都内置支持,比如数据库读写分离、调用链跟踪、统一日志等,与spring体系相比,sumk更轻量、性能更高、内存消耗更低。以下是主要工程介"
  },
  {
    "path": "async-logger/LICENSE",
    "chars": 11393,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "async-logger/README.md",
    "chars": 1376,
    "preview": "# sumk-log\n&emsp;&emsp;async-logger是一款基于slf4j标准的日志系统。它的特点是高效、异步、支持配置中心统一配置,拥有鹰眼跟踪与统一日志等功能。它的前身名叫sumk-log\n\n### 引入sumk-log"
  },
  {
    "path": "async-logger/pom.xml",
    "chars": 2117,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
  },
  {
    "path": "async-logger/src/main/java/org/slf4j/impl/StaticLoggerBinder.java",
    "chars": 1322,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/slf4j/impl/StaticMDCBinder.java",
    "chars": 908,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/slf4j/v2/SumkServiceProvider.java",
    "chars": 975,
    "preview": "package org.slf4j.v2;\n\nimport org.slf4j.ILoggerFactory;\nimport org.slf4j.IMarkerFactory;\nimport org.slf4j.helpers.BasicM"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/CodeLine.java",
    "chars": 1071,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/CodeLineKit.java",
    "chars": 1387,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/DayRollingFileAppender.java",
    "chars": 1464,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/DefaultUnionLog.java",
    "chars": 3685,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LeveledDayRollingFileAppender.java",
    "chars": 1569,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LocalFileDao.java",
    "chars": 4059,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogAppendObserver.java",
    "chars": 2257,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogAppender.java",
    "chars": 869,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogAppenderFactory.java",
    "chars": 2154,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogAppenders.java",
    "chars": 1958,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogHelper.java",
    "chars": 2309,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogObject.java",
    "chars": 3413,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/LogQueue.java",
    "chars": 4526,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/MonthRollingFileAppender.java",
    "chars": 1504,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/PlainOutput.java",
    "chars": 895,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/PlainOutputImpl.java",
    "chars": 3010,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/RollingFileAppender.java",
    "chars": 6922,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/SumkLoggerFactory.java",
    "chars": 1903,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/SumkLoggerImpl.java",
    "chars": 3430,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/UnionLog.java",
    "chars": 871,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/UnionLogDao.java",
    "chars": 1007,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/UnionLogObject.java",
    "chars": 1404,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/UnionLogObjectSerializer.java",
    "chars": 1568,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/UnionLogUtil.java",
    "chars": 4642,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/java/org/yx/log/impl/UnionLogs.java",
    "chars": 1045,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "async-logger/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider",
    "chars": 32,
    "preview": "org.slf4j.v2.SumkServiceProvider"
  },
  {
    "path": "async-logger/src/test/java/org/test/ProxyLog.java",
    "chars": 510,
    "preview": "package org.test;\n\nimport org.slf4j.spi.LocationAwareLogger;\nimport org.yx.log.Log;\n\npublic class ProxyLog {\n\n\tprivate s"
  },
  {
    "path": "async-logger/src/test/java/org/test/Starter.java",
    "chars": 811,
    "preview": "package org.test;\n\nimport org.junit.Test;\nimport org.slf4j.spi.LocationAwareLogger;\nimport org.yx.log.Log;\nimport org.yx"
  },
  {
    "path": "async-logger/src/test/java/org/test/UnionDemo.java",
    "chars": 826,
    "preview": "package org.test;\n\nimport java.util.List;\n\nimport org.junit.Test;\nimport org.yx.log.Log;\nimport org.yx.log.impl.DefaultU"
  },
  {
    "path": "async-logger/src/test/resources/app.properties",
    "chars": 201,
    "preview": "\nsumk.ioc=org.yx\n\n#用,或;做分隔符\nsumk.log.level=info,org.apache.zookeeper:warn\nsumk.log.console=1\n\n#kv之间用=做分隔符,kv对之间用;做分隔符\ns."
  },
  {
    "path": "pom.xml",
    "chars": 6358,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "sql.dtd",
    "chars": 766,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n\r\n<!ELEMENT sdb (sql+)>\r\n<!ATTLIST sdb\r\nnamespace CDATA #IMPLIED\r\n>\r\n\r\n<!ELEMEN"
  },
  {
    "path": "sumk-base/LICENSE",
    "chars": 11393,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "sumk-base/pom.xml",
    "chars": 2124,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/annotation/doc/Comment.java",
    "chars": 1055,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/annotation/doc/NotNull.java",
    "chars": 1106,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/Executable.java",
    "chars": 714,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/ItemJoiner.java",
    "chars": 3078,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/Lifecycle.java",
    "chars": 719,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/Ordered.java",
    "chars": 936,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/StartOnceLifecycle.java",
    "chars": 947,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/context/ActionContext.java",
    "chars": 4847,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/context/AppContext.java",
    "chars": 2395,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/context/LogContext.java",
    "chars": 2409,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/DateAdapters.java",
    "chars": 4365,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/DateFormater.java",
    "chars": 1405,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/DateTimeFormater.java",
    "chars": 1842,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/DateTimeTypeAdapter.java",
    "chars": 1938,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/FullDateTimeFormater.java",
    "chars": 2216,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/SumkDateFormater.java",
    "chars": 808,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/SumkDateQuery.java",
    "chars": 1754,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/date/TimeUtil.java",
    "chars": 7765,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/matcher/BooleanMatcher.java",
    "chars": 422,
    "preview": "package org.yx.base.matcher;\n\nimport java.util.function.Predicate;\n\npublic enum BooleanMatcher implements Predicate<Stri"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/matcher/InOutMatcher.java",
    "chars": 1247,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/matcher/Matchers.java",
    "chars": 4306,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/matcher/WildcardMatcher.java",
    "chars": 4096,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/scaner/ClassScaner.java",
    "chars": 2247,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/scaner/FileNameScaner.java",
    "chars": 4847,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/scaner/JarFileUtil.java",
    "chars": 2454,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/sumk/UnmodifiableArrayList.java",
    "chars": 2403,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/sumk/UnsafeByteArrayOutputStream.java",
    "chars": 2365,
    "preview": "package org.yx.base.sumk;\n\nimport java.io.IOException;\nimport java.io.OutputStream;\nimport java.io.UnsupportedEncodingEx"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/sumk/UnsafeStringWriter.java",
    "chars": 1610,
    "preview": "package org.yx.base.sumk;\n\nimport java.io.IOException;\nimport java.io.Writer;\n\npublic class UnsafeStringWriter extends W"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/sumk/map/ListEntrySet.java",
    "chars": 1667,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/sumk/map/ListMap.java",
    "chars": 1976,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/sumk/map/UnmodifiableListMap.java",
    "chars": 1387,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/thread/PriorityRunnable.java",
    "chars": 1389,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/thread/SumkExecutorService.java",
    "chars": 1023,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/thread/ThreadPools.java",
    "chars": 4231,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/base/thread/ThresholdExecutor.java",
    "chars": 727,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/AbsoluteXmlFilesLoader.java",
    "chars": 1743,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/AbstractFilesLoader.java",
    "chars": 1906,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/AbstractRefreshableSystemConfig.java",
    "chars": 1474,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/AppConfig.java",
    "chars": 3504,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/AppInfo.java",
    "chars": 5433,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/ClassPathXmlFilesLoader.java",
    "chars": 3570,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/ComposedConfig.java",
    "chars": 3815,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/Const.java",
    "chars": 1697,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/FileModifyTime.java",
    "chars": 1072,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/LocalMultiResourceLoaderSupplier.java",
    "chars": 1209,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/LocalhostUtil.java",
    "chars": 4587,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/MapConfig.java",
    "chars": 1692,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/MultiNodeConfig.java",
    "chars": 1815,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/MultiResourceLoader.java",
    "chars": 858,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/RefreshableSystemConfig.java",
    "chars": 868,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/SimpleBeanUtil.java",
    "chars": 3124,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/SystemConfig.java",
    "chars": 781,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/SystemConfigHolder.java",
    "chars": 1015,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/conf/UrlSystemConfig.java",
    "chars": 3764,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/exception/BizException.java",
    "chars": 1598,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/exception/CodeException.java",
    "chars": 1524,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/exception/SimpleSumkException.java",
    "chars": 895,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/exception/SoaException.java",
    "chars": 3123,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/exception/SumkException.java",
    "chars": 1290,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/exception/SumkExceptionCode.java",
    "chars": 1006,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/CodeLineMarker.java",
    "chars": 1650,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/ConsoleLog.java",
    "chars": 2366,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/DelegateLogger.java",
    "chars": 8399,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/Log.java",
    "chars": 1754,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/LogKits.java",
    "chars": 2493,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/LogLevel.java",
    "chars": 695,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/LogSettings.java",
    "chars": 1619,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/Loggers.java",
    "chars": 4203,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/Logs.java",
    "chars": 1239,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/RawLog.java",
    "chars": 2680,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/SimpleLogger.java",
    "chars": 876,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/log/SumkLogger.java",
    "chars": 8985,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/BitUtil.java",
    "chars": 766,
    "preview": "package org.yx.util;\n\nimport org.yx.exception.SumkException;\n\npublic class BitUtil {\n\n\tpublic static int setBit(int flag"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/CollectionUtil.java",
    "chars": 7826,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/ExceptionUtil.java",
    "chars": 1108,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/FileUtil.java",
    "chars": 1409,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/IOUtil.java",
    "chars": 1976,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/Loader.java",
    "chars": 2277,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/StringUtil.java",
    "chars": 3326,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/SumkDate.java",
    "chars": 19124,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/SumkThreadPool.java",
    "chars": 6299,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/Task.java",
    "chars": 1334,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-base/src/main/java/org/yx/util/UUIDSeed.java",
    "chars": 3425,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/LICENSE",
    "chars": 11393,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "sumk-db/pom.xml",
    "chars": 2570,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLoca"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/annotation/db/AutoCreateTime.java",
    "chars": 1200,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/annotation/db/Box.java",
    "chars": 1248,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/annotation/db/Column.java",
    "chars": 1178,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/annotation/db/SoftDelete.java",
    "chars": 1576,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/annotation/db/Table.java",
    "chars": 1456,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/DB.java",
    "chars": 3630,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/DBJson.java",
    "chars": 1193,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/SDB.java",
    "chars": 2079,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/CommonConfigFactory.java",
    "chars": 2694,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/ConnectionPool.java",
    "chars": 8362,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DBCPDataSourceFactory.java",
    "chars": 3597,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DBConfig.java",
    "chars": 3731,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DBConfigFactory.java",
    "chars": 794,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DSFactory.java",
    "chars": 1604,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DataSourceFactory.java",
    "chars": 846,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DataSourceManager.java",
    "chars": 872,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DataSourceManagerImpl.java",
    "chars": 3087,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DataSourceManagerSelector.java",
    "chars": 220,
    "preview": "package org.yx.db.conn;\n\nimport java.util.Set;\n\npublic interface DataSourceManagerSelector {\n\n\tDataSourceManager select("
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DataSources.java",
    "chars": 1358,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/DefaultManagerSelector.java",
    "chars": 4061,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/HookContext.java",
    "chars": 1126,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/RouterFactory.java",
    "chars": 797,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/SqlSessionHook.java",
    "chars": 1751,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/SumkConnection.java",
    "chars": 10117,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/SumkDataSource.java",
    "chars": 4079,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/WeightedDataSource.java",
    "chars": 917,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/conn/WeightedRouterFactory.java",
    "chars": 3112,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/dao/AbstractCachable.java",
    "chars": 1005,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/dao/CountedResult.java",
    "chars": 1011,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/enums/CacheType.java",
    "chars": 687,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/enums/ColumnType.java",
    "chars": 1340,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/enums/DBType.java",
    "chars": 1027,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/enums/TransactionType.java",
    "chars": 765,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/enums/TxHook.java",
    "chars": 975,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/enums/ValidRecord.java",
    "chars": 780,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/DBEvent.java",
    "chars": 1023,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/DBEventPublisher.java",
    "chars": 1525,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/DeleteEvent.java",
    "chars": 976,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/EventLane.java",
    "chars": 1755,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/InsertEvent.java",
    "chars": 965,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/ModifyEvent.java",
    "chars": 1504,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/QueryEvent.java",
    "chars": 1078,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/event/UpdateEvent.java",
    "chars": 2220,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/exec/BoxAopExecutorSupplier.java",
    "chars": 1300,
    "preview": "package org.yx.db.exec;\n\nimport java.lang.reflect.Method;\n\nimport org.yx.annotation.Bean;\nimport org.yx.bean.aop.AopExec"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/exec/DBExecutor.java",
    "chars": 729,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/exec/DBSource.java",
    "chars": 809,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/exec/DBSources.java",
    "chars": 1973,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/exec/DBTransaction.java",
    "chars": 2479,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/exec/DefaultDBSource.java",
    "chars": 1642,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/kit/DBKits.java",
    "chars": 2492,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/kit/SDBuilder.java",
    "chars": 2190,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/listener/DeleteListener.java",
    "chars": 1725,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/listener/InsertListener.java",
    "chars": 1902,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/listener/SelectListener.java",
    "chars": 3115,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/listener/UpdateListener.java",
    "chars": 2963,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/log/SimpleSqlLogImpl.java",
    "chars": 3240,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/DBPlugin.java",
    "chars": 3409,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/ForeachParser.java",
    "chars": 4343,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/IFParser.java",
    "chars": 1511,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/ItemsParser.java",
    "chars": 1867,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/JoinerFactory.java",
    "chars": 1548,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/NamedExecutor.java",
    "chars": 3143,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/PureStringParser.java",
    "chars": 1227,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/RawExecutor.java",
    "chars": 2938,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/SqlHolder.java",
    "chars": 2127,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/SqlParser.java",
    "chars": 786,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/SqlParsers.java",
    "chars": 2022,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/SqlXmlBuilderFactory.java",
    "chars": 2420,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/mapper/SqlXmlParser.java",
    "chars": 4928,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/monitor/DBMonitor.java",
    "chars": 2789,
    "preview": "package org.yx.db.monitor;\n\nimport static org.yx.common.monitor.Monitors.BLANK;\nimport static org.yx.conf.AppInfo.LN;\n\ni"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/spec/BoxSpec.java",
    "chars": 1309,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  },
  {
    "path": "sumk-db/src/main/java/org/yx/db/spec/ColumnSpec.java",
    "chars": 1162,
    "preview": "/**\n * Copyright (C) 2016 - 2030 youtongluan.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * y"
  }
]

// ... and 489 more files (download for full content)

About this extraction

This page contains the full source code of the youtongluan/sumk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 689 files (1.5 MB), approximately 427.9k tokens, and a symbol index with 4794 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!