From 129169cb8755b73bbe86d26a9a4721e54a1be63d Mon Sep 17 00:00:00 2001
From: kamhung <22250530@qq.com>
Date: Wed, 9 Dec 2015 10:29:45 +0800
Subject: [PATCH]
---
src/org/redkale/boot/Application.java | 566 ++++++
src/org/redkale/boot/ClassFilter.java | 436 +++++
src/org/redkale/boot/LogFileHandler.java | 267 +++
src/org/redkale/boot/NodeHttpServer.java | 133 ++
src/org/redkale/boot/NodeProtocol.java | 19 +
src/org/redkale/boot/NodeServer.java | 442 +++++
src/org/redkale/boot/NodeSncpServer.java | 69 +
src/org/redkale/convert/AnyEncoder.java | 40 +
src/org/redkale/convert/ArrayDecoder.java | 79 +
src/org/redkale/convert/ArrayEncoder.java | 75 +
.../redkale/convert/CollectionDecoder.java | 69 +
.../redkale/convert/CollectionEncoder.java | 65 +
src/org/redkale/convert/Convert.java | 26 +
src/org/redkale/convert/ConvertColumn.java | 44 +
.../redkale/convert/ConvertColumnEntry.java | 67 +
src/org/redkale/convert/ConvertColumns.java | 24 +
src/org/redkale/convert/ConvertEntity.java | 25 +
src/org/redkale/convert/ConvertException.java | 28 +
src/org/redkale/convert/ConvertType.java | 28 +
src/org/redkale/convert/DeMember.java | 64 +
src/org/redkale/convert/Decodeable.java | 27 +
src/org/redkale/convert/EnMember.java | 76 +
src/org/redkale/convert/Encodeable.java | 27 +
src/org/redkale/convert/Factory.java | 385 ++++
src/org/redkale/convert/HashedMap.java | 70 +
src/org/redkale/convert/MapDecoder.java | 78 +
src/org/redkale/convert/MapEncoder.java | 62 +
src/org/redkale/convert/ObjectDecoder.java | 157 ++
src/org/redkale/convert/ObjectEncoder.java | 233 +++
src/org/redkale/convert/Reader.java | 112 ++
src/org/redkale/convert/SimpledCoder.java | 42 +
src/org/redkale/convert/Writer.java | 120 ++
.../convert/bson/BsonByteBufferWriter.java | 134 ++
src/org/redkale/convert/bson/BsonConvert.java | 155 ++
src/org/redkale/convert/bson/BsonFactory.java | 62 +
src/org/redkale/convert/bson/BsonReader.java | 323 ++++
.../convert/bson/BsonSimpledCoder.java | 17 +
src/org/redkale/convert/bson/BsonWriter.java | 297 ++++
.../convert/ext/BigIntegerSimpledCoder.java | 38 +
.../convert/ext/BoolArraySimpledCoder.java | 68 +
.../redkale/convert/ext/BoolSimpledCoder.java | 32 +
.../convert/ext/ByteArraySimpledCoder.java | 68 +
.../redkale/convert/ext/ByteSimpledCoder.java | 32 +
.../convert/ext/CharArraySimpledCoder.java | 68 +
.../redkale/convert/ext/CharSimpledCoder.java | 33 +
.../convert/ext/DLongSimpledCoder.java | 40 +
.../redkale/convert/ext/DateSimpledCoder.java | 33 +
.../convert/ext/DoubleArraySimpledCoder.java | 68 +
.../convert/ext/DoubleSimpledCoder.java | 32 +
.../redkale/convert/ext/EnumSimpledCoder.java | 44 +
.../convert/ext/FloatArraySimpledCoder.java | 68 +
.../convert/ext/FloatSimpledCoder.java | 32 +
.../convert/ext/InetAddressSimpledCoder.java | 70 +
.../convert/ext/IntArraySimpledCoder.java | 68 +
.../redkale/convert/ext/IntSimpledCoder.java | 32 +
.../convert/ext/LongArraySimpledCoder.java | 68 +
.../redkale/convert/ext/LongSimpledCoder.java | 33 +
.../convert/ext/NumberSimpledCoder.java | 32 +
.../convert/ext/PatternSimpledCoder.java | 38 +
.../convert/ext/ShortArraySimpledCoder.java | 68 +
.../convert/ext/ShortSimpledCoder.java | 32 +
.../convert/ext/StringArraySimpledCoder.java | 68 +
.../convert/ext/StringSimpledCoder.java | 32 +
.../redkale/convert/ext/TypeSimpledCoder.java | 42 +
.../json/InetAddressJsonSimpledCoder.java | 68 +
.../convert/json/JsonByteBufferWriter.java | 348 ++++
src/org/redkale/convert/json/JsonConvert.java | 137 ++
src/org/redkale/convert/json/JsonFactory.java | 60 +
src/org/redkale/convert/json/JsonReader.java | 577 ++++++
.../convert/json/JsonSimpledCoder.java | 17 +
src/org/redkale/convert/json/JsonWriter.java | 268 +++
src/org/redkale/net/Async.java | 25 +
src/org/redkale/net/AsyncConnection.java | 570 ++++++
src/org/redkale/net/AsyncDatagramChannel.java | 1327 ++++++++++++++
src/org/redkale/net/Context.java | 132 ++
src/org/redkale/net/PrepareRunner.java | 98 ++
src/org/redkale/net/PrepareServlet.java | 73 +
src/org/redkale/net/ProtocolServer.java | 185 ++
src/org/redkale/net/Request.java | 112 ++
src/org/redkale/net/Response.java | 228 +++
src/org/redkale/net/SSLBuilder.java | 160 ++
src/org/redkale/net/Server.java | 188 ++
src/org/redkale/net/Servlet.java | 27 +
src/org/redkale/net/Transport.java | 254 +++
src/org/redkale/net/WorkThread.java | 31 +
src/org/redkale/net/http/AuthIgnore.java | 22 +
.../redkale/net/http/BasedHttpServlet.java | 260 +++
src/org/redkale/net/http/HttpCacheable.java | 25 +
src/org/redkale/net/http/HttpContext.java | 59 +
.../redkale/net/http/HttpPrepareServlet.java | 152 ++
src/org/redkale/net/http/HttpRequest.java | 531 ++++++
.../redkale/net/http/HttpResourceServlet.java | 260 +++
src/org/redkale/net/http/HttpResponse.java | 561 ++++++
src/org/redkale/net/http/HttpServer.java | 127 ++
src/org/redkale/net/http/HttpServlet.java | 29 +
src/org/redkale/net/http/MimeType.java | 240 +++
src/org/redkale/net/http/MultiContext.java | 284 +++
src/org/redkale/net/http/MultiPart.java | 115 ++
src/org/redkale/net/http/WebAction.java | 22 +
src/org/redkale/net/http/WebInitParam.java | 24 +
src/org/redkale/net/http/WebServlet.java | 28 +
src/org/redkale/net/http/WebSocket.java | 387 ++++
src/org/redkale/net/http/WebSocketBinary.java | 23 +
src/org/redkale/net/http/WebSocketEngine.java | 92 +
src/org/redkale/net/http/WebSocketGroup.java | 128 ++
src/org/redkale/net/http/WebSocketNode.java | 196 +++
src/org/redkale/net/http/WebSocketPacket.java | 123 ++
src/org/redkale/net/http/WebSocketRunner.java | 529 ++++++
.../redkale/net/http/WebSocketServlet.java | 145 ++
src/org/redkale/net/sncp/ServiceWrapper.java | 92 +
src/org/redkale/net/sncp/Sncp.java | 1108 ++++++++++++
src/org/redkale/net/sncp/SncpCall.java | 24 +
src/org/redkale/net/sncp/SncpClient.java | 406 +++++
src/org/redkale/net/sncp/SncpDyn.java | 24 +
src/org/redkale/net/sncp/SncpDynServlet.java | 407 +++++
src/org/redkale/net/sncp/SncpFuture.java | 94 +
.../redkale/net/sncp/SncpPrepareServlet.java | 94 +
src/org/redkale/net/sncp/SncpRemote.java | 23 +
src/org/redkale/net/sncp/SncpRequest.java | 148 ++
src/org/redkale/net/sncp/SncpResponse.java | 83 +
src/org/redkale/net/sncp/SncpServer.java | 66 +
src/org/redkale/net/sncp/SncpServlet.java | 32 +
.../redkale/net/sncp/SncpTargetAddress.java | 24 +
.../service/DataCacheListenerService.java | 41 +
.../service/DataSQLListenerService.java | 118 ++
.../redkale/service/DataSourceService.java | 342 ++++
src/org/redkale/service/LocalService.java | 23 +
src/org/redkale/service/MultiRun.java | 30 +
src/org/redkale/service/RetResult.java | 113 ++
src/org/redkale/service/Service.java | 43 +
.../redkale/service/WebSocketNodeService.java | 76 +
src/org/redkale/source/DataCacheListener.java | 21 +
.../source/DataCallArrayAttribute.java | 57 +
src/org/redkale/source/DataCallAttribute.java | 72 +
src/org/redkale/source/DataConnection.java | 29 +
src/org/redkale/source/DataDefaultSource.java | 1554 +++++++++++++++++
src/org/redkale/source/DataSQLListener.java | 20 +
src/org/redkale/source/DataSource.java | 244 +++
.../redkale/source/DistributeGenerator.java | 44 +
src/org/redkale/source/EntityCache.java | 654 +++++++
src/org/redkale/source/EntityInfo.java | 371 ++++
src/org/redkale/source/FilterBean.java | 15 +
src/org/redkale/source/FilterColumn.java | 46 +
src/org/redkale/source/FilterExpress.java | 46 +
src/org/redkale/source/FilterGroup.java | 62 +
src/org/redkale/source/FilterGroups.java | 23 +
src/org/redkale/source/FilterJoinColumn.java | 50 +
src/org/redkale/source/FilterJoinNode.java | 315 ++++
src/org/redkale/source/FilterNode.java | 958 ++++++++++
src/org/redkale/source/FilterNodeBean.java | 353 ++++
src/org/redkale/source/Flipper.java | 111 ++
src/org/redkale/source/JDBCPoolSource.java | 238 +++
src/org/redkale/source/Range.java | 284 +++
src/org/redkale/source/ReckonType.java | 21 +
src/org/redkale/source/VirtualEntity.java | 21 +
src/org/redkale/util/AnyValue.java | 434 +++++
src/org/redkale/util/Attribute.java | 323 ++++
src/org/redkale/util/AutoLoad.java | 24 +
src/org/redkale/util/ByteArray.java | 161 ++
src/org/redkale/util/Creator.java | 207 +++
src/org/redkale/util/DLong.java | 81 +
src/org/redkale/util/DebugMethodVisitor.java | 150 ++
src/org/redkale/util/Ignore.java | 22 +
src/org/redkale/util/LogLevel.java | 24 +
src/org/redkale/util/Nameable.java | 15 +
src/org/redkale/util/ObjectNode.java | 26 +
src/org/redkale/util/ObjectPool.java | 99 ++
src/org/redkale/util/Reproduce.java | 132 ++
src/org/redkale/util/ResourceFactory.java | 240 +++
src/org/redkale/util/SelectColumn.java | 136 ++
src/org/redkale/util/Sheet.java | 88 +
src/org/redkale/util/TypeToken.java | 26 +
src/org/redkale/util/Utility.java | 517 ++++++
src/org/redkale/watch/WatchFactory.java | 99 ++
src/org/redkale/watch/WatchNode.java | 21 +
src/org/redkale/watch/WatchNumber.java | 49 +
src/org/redkale/watch/WatchSupplier.java | 47 +
src/org/redkale/watch/Watchable.java | 34 +
178 files changed, 27404 insertions(+)
create mode 100644 src/org/redkale/boot/Application.java
create mode 100644 src/org/redkale/boot/ClassFilter.java
create mode 100644 src/org/redkale/boot/LogFileHandler.java
create mode 100644 src/org/redkale/boot/NodeHttpServer.java
create mode 100644 src/org/redkale/boot/NodeProtocol.java
create mode 100644 src/org/redkale/boot/NodeServer.java
create mode 100644 src/org/redkale/boot/NodeSncpServer.java
create mode 100644 src/org/redkale/convert/AnyEncoder.java
create mode 100644 src/org/redkale/convert/ArrayDecoder.java
create mode 100644 src/org/redkale/convert/ArrayEncoder.java
create mode 100644 src/org/redkale/convert/CollectionDecoder.java
create mode 100644 src/org/redkale/convert/CollectionEncoder.java
create mode 100644 src/org/redkale/convert/Convert.java
create mode 100644 src/org/redkale/convert/ConvertColumn.java
create mode 100644 src/org/redkale/convert/ConvertColumnEntry.java
create mode 100644 src/org/redkale/convert/ConvertColumns.java
create mode 100644 src/org/redkale/convert/ConvertEntity.java
create mode 100644 src/org/redkale/convert/ConvertException.java
create mode 100644 src/org/redkale/convert/ConvertType.java
create mode 100644 src/org/redkale/convert/DeMember.java
create mode 100644 src/org/redkale/convert/Decodeable.java
create mode 100644 src/org/redkale/convert/EnMember.java
create mode 100644 src/org/redkale/convert/Encodeable.java
create mode 100644 src/org/redkale/convert/Factory.java
create mode 100644 src/org/redkale/convert/HashedMap.java
create mode 100644 src/org/redkale/convert/MapDecoder.java
create mode 100644 src/org/redkale/convert/MapEncoder.java
create mode 100644 src/org/redkale/convert/ObjectDecoder.java
create mode 100644 src/org/redkale/convert/ObjectEncoder.java
create mode 100644 src/org/redkale/convert/Reader.java
create mode 100644 src/org/redkale/convert/SimpledCoder.java
create mode 100644 src/org/redkale/convert/Writer.java
create mode 100644 src/org/redkale/convert/bson/BsonByteBufferWriter.java
create mode 100644 src/org/redkale/convert/bson/BsonConvert.java
create mode 100644 src/org/redkale/convert/bson/BsonFactory.java
create mode 100644 src/org/redkale/convert/bson/BsonReader.java
create mode 100644 src/org/redkale/convert/bson/BsonSimpledCoder.java
create mode 100644 src/org/redkale/convert/bson/BsonWriter.java
create mode 100644 src/org/redkale/convert/ext/BigIntegerSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/BoolArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/BoolSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/ByteArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/ByteSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/CharArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/CharSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/DLongSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/DateSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/DoubleArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/DoubleSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/EnumSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/FloatArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/FloatSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/InetAddressSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/IntArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/IntSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/LongArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/LongSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/NumberSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/PatternSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/ShortArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/ShortSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/StringArraySimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/StringSimpledCoder.java
create mode 100644 src/org/redkale/convert/ext/TypeSimpledCoder.java
create mode 100644 src/org/redkale/convert/json/InetAddressJsonSimpledCoder.java
create mode 100644 src/org/redkale/convert/json/JsonByteBufferWriter.java
create mode 100644 src/org/redkale/convert/json/JsonConvert.java
create mode 100644 src/org/redkale/convert/json/JsonFactory.java
create mode 100644 src/org/redkale/convert/json/JsonReader.java
create mode 100644 src/org/redkale/convert/json/JsonSimpledCoder.java
create mode 100644 src/org/redkale/convert/json/JsonWriter.java
create mode 100644 src/org/redkale/net/Async.java
create mode 100644 src/org/redkale/net/AsyncConnection.java
create mode 100644 src/org/redkale/net/AsyncDatagramChannel.java
create mode 100644 src/org/redkale/net/Context.java
create mode 100644 src/org/redkale/net/PrepareRunner.java
create mode 100644 src/org/redkale/net/PrepareServlet.java
create mode 100644 src/org/redkale/net/ProtocolServer.java
create mode 100644 src/org/redkale/net/Request.java
create mode 100644 src/org/redkale/net/Response.java
create mode 100644 src/org/redkale/net/SSLBuilder.java
create mode 100644 src/org/redkale/net/Server.java
create mode 100644 src/org/redkale/net/Servlet.java
create mode 100644 src/org/redkale/net/Transport.java
create mode 100644 src/org/redkale/net/WorkThread.java
create mode 100644 src/org/redkale/net/http/AuthIgnore.java
create mode 100644 src/org/redkale/net/http/BasedHttpServlet.java
create mode 100644 src/org/redkale/net/http/HttpCacheable.java
create mode 100644 src/org/redkale/net/http/HttpContext.java
create mode 100644 src/org/redkale/net/http/HttpPrepareServlet.java
create mode 100644 src/org/redkale/net/http/HttpRequest.java
create mode 100644 src/org/redkale/net/http/HttpResourceServlet.java
create mode 100644 src/org/redkale/net/http/HttpResponse.java
create mode 100644 src/org/redkale/net/http/HttpServer.java
create mode 100644 src/org/redkale/net/http/HttpServlet.java
create mode 100644 src/org/redkale/net/http/MimeType.java
create mode 100644 src/org/redkale/net/http/MultiContext.java
create mode 100644 src/org/redkale/net/http/MultiPart.java
create mode 100644 src/org/redkale/net/http/WebAction.java
create mode 100644 src/org/redkale/net/http/WebInitParam.java
create mode 100644 src/org/redkale/net/http/WebServlet.java
create mode 100644 src/org/redkale/net/http/WebSocket.java
create mode 100644 src/org/redkale/net/http/WebSocketBinary.java
create mode 100644 src/org/redkale/net/http/WebSocketEngine.java
create mode 100644 src/org/redkale/net/http/WebSocketGroup.java
create mode 100644 src/org/redkale/net/http/WebSocketNode.java
create mode 100644 src/org/redkale/net/http/WebSocketPacket.java
create mode 100644 src/org/redkale/net/http/WebSocketRunner.java
create mode 100644 src/org/redkale/net/http/WebSocketServlet.java
create mode 100644 src/org/redkale/net/sncp/ServiceWrapper.java
create mode 100644 src/org/redkale/net/sncp/Sncp.java
create mode 100644 src/org/redkale/net/sncp/SncpCall.java
create mode 100644 src/org/redkale/net/sncp/SncpClient.java
create mode 100644 src/org/redkale/net/sncp/SncpDyn.java
create mode 100644 src/org/redkale/net/sncp/SncpDynServlet.java
create mode 100644 src/org/redkale/net/sncp/SncpFuture.java
create mode 100644 src/org/redkale/net/sncp/SncpPrepareServlet.java
create mode 100644 src/org/redkale/net/sncp/SncpRemote.java
create mode 100644 src/org/redkale/net/sncp/SncpRequest.java
create mode 100644 src/org/redkale/net/sncp/SncpResponse.java
create mode 100644 src/org/redkale/net/sncp/SncpServer.java
create mode 100644 src/org/redkale/net/sncp/SncpServlet.java
create mode 100644 src/org/redkale/net/sncp/SncpTargetAddress.java
create mode 100644 src/org/redkale/service/DataCacheListenerService.java
create mode 100644 src/org/redkale/service/DataSQLListenerService.java
create mode 100644 src/org/redkale/service/DataSourceService.java
create mode 100644 src/org/redkale/service/LocalService.java
create mode 100644 src/org/redkale/service/MultiRun.java
create mode 100644 src/org/redkale/service/RetResult.java
create mode 100644 src/org/redkale/service/Service.java
create mode 100644 src/org/redkale/service/WebSocketNodeService.java
create mode 100644 src/org/redkale/source/DataCacheListener.java
create mode 100644 src/org/redkale/source/DataCallArrayAttribute.java
create mode 100644 src/org/redkale/source/DataCallAttribute.java
create mode 100644 src/org/redkale/source/DataConnection.java
create mode 100644 src/org/redkale/source/DataDefaultSource.java
create mode 100644 src/org/redkale/source/DataSQLListener.java
create mode 100644 src/org/redkale/source/DataSource.java
create mode 100644 src/org/redkale/source/DistributeGenerator.java
create mode 100644 src/org/redkale/source/EntityCache.java
create mode 100644 src/org/redkale/source/EntityInfo.java
create mode 100644 src/org/redkale/source/FilterBean.java
create mode 100644 src/org/redkale/source/FilterColumn.java
create mode 100644 src/org/redkale/source/FilterExpress.java
create mode 100644 src/org/redkale/source/FilterGroup.java
create mode 100644 src/org/redkale/source/FilterGroups.java
create mode 100644 src/org/redkale/source/FilterJoinColumn.java
create mode 100644 src/org/redkale/source/FilterJoinNode.java
create mode 100644 src/org/redkale/source/FilterNode.java
create mode 100644 src/org/redkale/source/FilterNodeBean.java
create mode 100644 src/org/redkale/source/Flipper.java
create mode 100644 src/org/redkale/source/JDBCPoolSource.java
create mode 100644 src/org/redkale/source/Range.java
create mode 100644 src/org/redkale/source/ReckonType.java
create mode 100644 src/org/redkale/source/VirtualEntity.java
create mode 100644 src/org/redkale/util/AnyValue.java
create mode 100644 src/org/redkale/util/Attribute.java
create mode 100644 src/org/redkale/util/AutoLoad.java
create mode 100644 src/org/redkale/util/ByteArray.java
create mode 100644 src/org/redkale/util/Creator.java
create mode 100644 src/org/redkale/util/DLong.java
create mode 100644 src/org/redkale/util/DebugMethodVisitor.java
create mode 100644 src/org/redkale/util/Ignore.java
create mode 100644 src/org/redkale/util/LogLevel.java
create mode 100644 src/org/redkale/util/Nameable.java
create mode 100644 src/org/redkale/util/ObjectNode.java
create mode 100644 src/org/redkale/util/ObjectPool.java
create mode 100644 src/org/redkale/util/Reproduce.java
create mode 100644 src/org/redkale/util/ResourceFactory.java
create mode 100644 src/org/redkale/util/SelectColumn.java
create mode 100644 src/org/redkale/util/Sheet.java
create mode 100644 src/org/redkale/util/TypeToken.java
create mode 100644 src/org/redkale/util/Utility.java
create mode 100644 src/org/redkale/watch/WatchFactory.java
create mode 100644 src/org/redkale/watch/WatchNode.java
create mode 100644 src/org/redkale/watch/WatchNumber.java
create mode 100644 src/org/redkale/watch/WatchSupplier.java
create mode 100644 src/org/redkale/watch/Watchable.java
diff --git a/src/org/redkale/boot/Application.java b/src/org/redkale/boot/Application.java
new file mode 100644
index 000000000..01523cd17
--- /dev/null
+++ b/src/org/redkale/boot/Application.java
@@ -0,0 +1,566 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.redkale.boot;
+
+import org.redkale.boot.ClassFilter.FilterEntry;
+import org.redkale.util.AnyValue.DefaultAnyValue;
+import java.io.*;
+import java.net.*;
+import java.nio.*;
+import java.nio.channels.*;
+import java.nio.file.*;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.*;
+import java.util.function.*;
+import java.util.logging.*;
+import javax.xml.parsers.*;
+import org.redkale.convert.bson.*;
+import org.redkale.convert.json.*;
+import org.redkale.net.*;
+import org.redkale.net.sncp.*;
+import org.redkale.service.*;
+import org.redkale.source.*;
+import org.redkale.util.*;
+import org.redkale.watch.*;
+import org.w3c.dom.*;
+
+/**
+ * 编译时需要加入: -XDignore.symbol.file=true
+ *
+ * 进程启动类,程序启动后读取application.xml,进行classpath扫描动态加载Service与Servlet
+ * 优先加载所有SNCP协议的服务, 再加载其他协议服务,
+ * 最后进行Service、Servlet与其他资源之间的依赖注入。
+ *
+ *
+ * @author zhangjx
+ */
+public final class Application {
+
+ //当前进程启动的时间, 类型: long
+ public static final String RESNAME_APP_TIME = "APP_TIME";
+
+ //当前进程的根目录, 类型:String
+ public static final String RESNAME_APP_HOME = "APP_HOME";
+
+ //application.xml 文件中resources节点的内容, 类型: AnyValue
+ public static final String RESNAME_APP_GRES = "APP_GRES";
+
+ //当前进程节点的name, 类型:String
+ public static final String RESNAME_APP_NODE = "APP_NODE";
+
+ //当前进程节点的IP地址, 类型:InetAddress、String
+ public static final String RESNAME_APP_ADDR = "APP_ADDR";
+
+ //当前SNCP Server的IP地址+端口集合 类型: Map、HashMap
+ public static final String RESNAME_APP_NODES = "APP_NODES";
+
+ //当前Service的IP地址+端口 类型: SocketAddress、InetSocketAddress、String
+ public static final String RESNAME_SERVER_ADDR = "SERVER_ADDR"; // SERVER_ADDR
+
+ //当前SNCP Server所属的组 类型: String
+ public static final String RESNAME_SERVER_GROUP = "SERVER_GROUP";
+
+ //当前Service所属的组 类型: Set、String[]
+ public static final String RESNAME_SNCP_GROUPS = Sncp.RESNAME_SNCP_GROUPS; // SNCP_GROUPS
+
+ protected final Map globalNodes = new HashMap<>();
+
+ private final Map> globalGroups = new HashMap<>();
+
+ protected final List transports = new ArrayList<>();
+
+ protected final InetAddress localAddress;
+
+ protected final List sources = new CopyOnWriteArrayList<>();
+
+ protected final List servers = new CopyOnWriteArrayList<>();
+
+ protected CountDownLatch servicecdl; //会出现两次赋值
+
+ //--------------------------------------------------------------------------------------------
+ private final ResourceFactory factory = ResourceFactory.root();
+
+ private final WatchFactory watch = WatchFactory.root();
+
+ private File home;
+
+ private final Logger logger;
+
+ private final AnyValue config;
+
+ private final long startTime = System.currentTimeMillis();
+
+ private final CountDownLatch serversLatch;
+
+ private Application(final AnyValue config) {
+ this.config = config;
+
+ final File root = new File(System.getProperty(RESNAME_APP_HOME));
+ this.factory.register(RESNAME_APP_TIME, long.class, this.startTime);
+ this.factory.register(RESNAME_APP_HOME, Path.class, root.toPath());
+ this.factory.register(RESNAME_APP_HOME, File.class, root);
+ try {
+ this.factory.register(RESNAME_APP_HOME, root.getCanonicalPath());
+ this.home = root.getCanonicalFile();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ String localaddr = config.getValue("address", "").trim();
+ this.localAddress = localaddr.isEmpty() ? Utility.localInetAddress() : new InetSocketAddress(localaddr, 0).getAddress();
+ Application.this.factory.register(RESNAME_APP_ADDR, Application.this.localAddress.getHostAddress());
+ Application.this.factory.register(RESNAME_APP_ADDR, InetAddress.class, Application.this.localAddress);
+ {
+ String node = config.getValue("node", "").trim();
+ if (node.isEmpty()) {
+ StringBuilder sb = new StringBuilder();
+ byte[] bs = this.localAddress.getAddress();
+ int v1 = bs[bs.length - 2] & 0xff;
+ int v2 = bs[bs.length - 1] & 0xff;
+ if (v1 <= 0xf) sb.append('0');
+ sb.append(Integer.toHexString(v1));
+ if (v2 <= 0xf) sb.append('0');
+ sb.append(Integer.toHexString(v2));
+ node = sb.toString();
+ }
+ Application.this.factory.register(RESNAME_APP_NODE, node);
+ System.setProperty(RESNAME_APP_NODE, node);
+ }
+ //以下是初始化日志配置
+ final File logconf = new File(root, "conf/logging.properties");
+ if (logconf.isFile() && logconf.canRead()) {
+ try {
+ final String rootpath = root.getCanonicalPath().replace('\\', '/');
+ FileInputStream fin = new FileInputStream(logconf);
+ Properties properties = new Properties();
+ properties.load(fin);
+ fin.close();
+ properties.entrySet().stream().forEach(x -> {
+ x.setValue(x.getValue().toString().replace("${APP_HOME}", rootpath));
+ });
+
+ if (properties.getProperty("java.util.logging.FileHandler.formatter") == null) {
+ properties.setProperty("java.util.logging.FileHandler.formatter", LogFileHandler.LoggingFormater.class.getName());
+ }
+ if (properties.getProperty("java.util.logging.ConsoleHandler.formatter") == null) {
+ properties.setProperty("java.util.logging.ConsoleHandler.formatter", LogFileHandler.LoggingFormater.class.getName());
+ }
+ String fileHandlerPattern = properties.getProperty("java.util.logging.FileHandler.pattern");
+ if (fileHandlerPattern != null && fileHandlerPattern.contains("%d")) {
+ final String fileHandlerClass = LogFileHandler.class.getName();
+ Properties prop = new Properties();
+ final String handlers = properties.getProperty("handlers");
+ if (handlers != null && handlers.contains("java.util.logging.FileHandler")) {
+ prop.setProperty("handlers", handlers.replace("java.util.logging.FileHandler", fileHandlerClass));
+ }
+ if (!prop.isEmpty()) {
+ String prefix = fileHandlerClass + ".";
+ properties.entrySet().stream().forEach(x -> {
+ if (x.getKey().toString().startsWith("java.util.logging.FileHandler.")) {
+ prop.put(x.getKey().toString().replace("java.util.logging.FileHandler.", prefix), x.getValue());
+ }
+ });
+ prop.entrySet().stream().forEach(x -> {
+ properties.put(x.getKey(), x.getValue());
+ });
+ }
+ properties.put(SncpClient.class.getSimpleName() + ".handlers", LogFileHandler.SncpLogFileHandler.class.getName());
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ final PrintStream ps = new PrintStream(out);
+ properties.forEach((x, y) -> ps.println(x + "=" + y));
+ LogManager.getLogManager().readConfiguration(new ByteArrayInputStream(out.toByteArray()));
+ } catch (Exception e) {
+ Logger.getLogger(this.getClass().getSimpleName()).log(Level.WARNING, "init logger configuration error", e);
+ }
+ }
+ this.logger = Logger.getLogger(this.getClass().getSimpleName());
+ this.serversLatch = new CountDownLatch(config.getAnyValues("server").length + 1);
+ }
+
+ public ResourceFactory getResourceFactory() {
+ return factory;
+ }
+
+ public WatchFactory getWatchFactory() {
+ return watch;
+ }
+
+ public File getHome() {
+ return home;
+ }
+
+ public long getStartTime() {
+ return startTime;
+ }
+
+ private void initLogging() {
+
+ }
+
+ public void init() throws Exception {
+ System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "" + Runtime.getRuntime().availableProcessors() * 4);
+ System.setProperty("convert.bson.pool.size", "128");
+ System.setProperty("convert.json.pool.size", "128");
+ System.setProperty("convert.bson.writer.buffer.defsize", "4096");
+ System.setProperty("convert.json.writer.buffer.defsize", "4096");
+
+ File persist = new File(this.home, "conf/persistence.xml");
+ final String homepath = this.home.getCanonicalPath();
+ if (persist.isFile()) System.setProperty(DataDefaultSource.DATASOURCE_CONFPATH, persist.getCanonicalPath());
+ logger.log(Level.INFO, RESNAME_APP_HOME + "=" + homepath + "\r\n" + RESNAME_APP_ADDR + "=" + this.localAddress.getHostAddress());
+ String lib = config.getValue("lib", "").trim().replace("${APP_HOME}", homepath);
+ lib = lib.isEmpty() ? (homepath + "/conf") : (lib + ";" + homepath + "/conf");
+ Server.loadLib(logger, lib);
+ initLogging();
+ if (this.localAddress != null) {
+ byte[] bs = this.localAddress.getAddress();
+ int v = (0xff & bs[bs.length - 2]) % 10 * 100 + (0xff & bs[bs.length - 1]);
+ this.factory.register("property.datasource.nodeid", "" + v);
+ }
+ //------------------------------------------------------------------------
+ final AnyValue resources = config.getAnyValue("resources");
+ if (resources != null) {
+ factory.register(RESNAME_APP_GRES, AnyValue.class, resources);
+ final AnyValue properties = resources.getAnyValue("properties");
+ if (properties != null) {
+ String dfloads = properties.getValue("load");
+ if (dfloads != null) {
+ for (String dfload : dfloads.split(";")) {
+ if (dfload.trim().isEmpty()) continue;
+ dfload = dfload.trim().replace("${APP_HOME}", home.getCanonicalPath()).replace('\\', '/');
+ final File df = (dfload.indexOf('/') < 0) ? new File(home, "conf/" + dfload) : new File(dfload);
+ if (df.isFile()) {
+ Properties ps = new Properties();
+ InputStream in = new FileInputStream(df);
+ ps.load(in);
+ in.close();
+ ps.forEach((x, y) -> factory.register("property." + x, y));
+ }
+ }
+ }
+ for (AnyValue prop : properties.getAnyValues("property")) {
+ String name = prop.getValue("name");
+ String value = prop.getValue("value");
+ if (name == null || value == null) continue;
+ if (name.startsWith("system.property.")) {
+ System.setProperty(name.substring("system.property.".length()), value);
+ } else {
+ factory.register("property." + name, value);
+ }
+ }
+ }
+ }
+ this.factory.register(BsonFactory.root());
+ this.factory.register(JsonFactory.root());
+ this.factory.register(BsonFactory.root().getConvert());
+ this.factory.register(JsonFactory.root().getConvert());
+ initResources();
+ }
+
+ private void initResources() throws Exception {
+ //-------------------------------------------------------------------------
+ final AnyValue resources = config.getAnyValue("resources");
+ if (resources != null) {
+ //------------------------------------------------------------------------
+
+ for (AnyValue conf : resources.getAnyValues("group")) {
+ final String group = conf.getValue("name", "");
+ String protocol = conf.getValue("protocol", Transport.DEFAULT_PROTOCOL).toUpperCase();
+ if (!"TCP".equalsIgnoreCase(protocol) && !"UDP".equalsIgnoreCase(protocol)) {
+ throw new RuntimeException("Not supported Transport Protocol " + conf.getValue("protocol"));
+ }
+ Set addrs = globalGroups.get(group);
+ if (addrs == null) {
+ addrs = new LinkedHashSet<>();
+ globalGroups.put(group, addrs);
+ }
+ for (AnyValue node : conf.getAnyValues("node")) {
+ final InetSocketAddress addr = new InetSocketAddress(node.getValue("addr"), node.getIntValue("port"));
+ addrs.add(addr);
+ String oldgroup = globalNodes.get(addr);
+ if (oldgroup != null) throw new RuntimeException(addr + " had one more group " + (globalNodes.get(addr)));
+ globalNodes.put(addr, group);
+ }
+ }
+ }
+ //------------------------------------------------------------------------
+ }
+
+ private void startSelfServer() throws Exception {
+ final Application application = this;
+ new Thread() {
+ {
+ setName("Application-Control-Thread");
+ }
+
+ @Override
+ public void run() {
+ try {
+ final DatagramChannel channel = DatagramChannel.open();
+ channel.configureBlocking(true);
+ channel.socket().setSoTimeout(3000);
+ channel.bind(new InetSocketAddress(config.getValue("host", "127.0.0.1"), config.getIntValue("port")));
+ boolean loop = true;
+ ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
+ while (loop) {
+ buffer.clear();
+ SocketAddress address = channel.receive(buffer);
+ buffer.flip();
+ byte[] bytes = new byte[buffer.remaining()];
+ buffer.get(bytes);
+ if ("SHUTDOWN".equalsIgnoreCase(new String(bytes))) {
+ try {
+ long s = System.currentTimeMillis();
+ logger.info(application.getClass().getSimpleName() + " shutdowning");
+ application.shutdown();
+ buffer.clear();
+ buffer.put("SHUTDOWN OK".getBytes());
+ buffer.flip();
+ channel.send(buffer, address);
+ long e = System.currentTimeMillis() - s;
+ logger.info(application.getClass().getSimpleName() + " shutdown in " + e + " ms");
+ application.serversLatch.countDown();
+ System.exit(0);
+ } catch (Exception ex) {
+ logger.log(Level.INFO, "SHUTDOWN FAIL", ex);
+ buffer.clear();
+ buffer.put("SHUTDOWN FAIL".getBytes());
+ buffer.flip();
+ channel.send(buffer, address);
+ }
+ }
+ }
+ } catch (Exception e) {
+ logger.log(Level.INFO, "Control fail", e);
+ System.exit(1);
+ }
+ }
+ }.start();
+ }
+
+ private void sendShutDown() throws Exception {
+ final DatagramChannel channel = DatagramChannel.open();
+ channel.configureBlocking(true);
+ channel.connect(new InetSocketAddress(config.getValue("host", "127.0.0.1"), config.getIntValue("port")));
+ ByteBuffer buffer = ByteBuffer.allocate(128);
+ buffer.put("SHUTDOWN".getBytes());
+ buffer.flip();
+ channel.write(buffer);
+ buffer.clear();
+ channel.configureBlocking(false);
+ channel.read(buffer);
+ buffer.flip();
+ byte[] bytes = new byte[buffer.remaining()];
+ buffer.get(bytes);
+ channel.close();
+ logger.info(new String(bytes));
+ Thread.sleep(500);
+ }
+
+ public void start() throws Exception {
+ final AnyValue[] entrys = config.getAnyValues("server");
+ CountDownLatch timecd = new CountDownLatch(entrys.length);
+ final List sncps = new ArrayList<>();
+ final List others = new ArrayList<>();
+ for (final AnyValue entry : entrys) {
+ if (entry.getValue("protocol", "").toUpperCase().startsWith("SNCP")) {
+ sncps.add(entry);
+ } else {
+ others.add(entry);
+ }
+ }
+ if (!sncps.isEmpty() && globalNodes.isEmpty()) throw new RuntimeException("found SNCP Server node but not found node info.");
+
+ factory.register(RESNAME_APP_NODES, new TypeToken