From 89edaea57522ae3b968a8fea697ad9c3ef8206c3 Mon Sep 17 00:00:00 2001 From: wentch <22250530@qq.com> Date: Tue, 15 Dec 2015 16:24:06 +0800 Subject: [PATCH] --- .../src/javax/annotation/Resource.java | 132 ++++++ .../src/org/redkale/convert/AnyEncoder.java | 1 + .../src/org/redkale/convert/ArrayDecoder.java | 1 + .../src/org/redkale/convert/ArrayEncoder.java | 3 +- .../redkale/convert/CollectionDecoder.java | 1 + .../redkale/convert/CollectionEncoder.java | 1 + .../src/org/redkale/convert/Convert.java | 1 + .../org/redkale/convert/ConvertColumn.java | 1 + .../redkale/convert/ConvertColumnEntry.java | 1 + .../org/redkale/convert/ConvertColumns.java | 1 + .../org/redkale/convert/ConvertEntity.java | 1 + .../org/redkale/convert/ConvertException.java | 1 + .../src/org/redkale/convert/ConvertType.java | 1 + .../src/org/redkale/convert/DeMember.java | 1 + .../src/org/redkale/convert/Decodeable.java | 1 + .../src/org/redkale/convert/EnMember.java | 1 + .../src/org/redkale/convert/Encodeable.java | 1 + .../src/org/redkale/convert/Factory.java | 5 +- .../src/org/redkale/convert/HashedMap.java | 4 +- .../src/org/redkale/convert/MapDecoder.java | 1 + .../src/org/redkale/convert/MapEncoder.java | 1 + .../org/redkale/convert/ObjectDecoder.java | 1 + .../org/redkale/convert/ObjectEncoder.java | 3 +- .../src/org/redkale/convert/Reader.java | 1 + .../src/org/redkale/convert/SimpledCoder.java | 1 + .../src/org/redkale/convert/Writer.java | 1 + .../convert/bson/BsonByteBufferWriter.java | 1 + .../org/redkale/convert/bson/BsonConvert.java | 1 + .../org/redkale/convert/bson/BsonFactory.java | 1 + .../org/redkale/convert/bson/BsonReader.java | 1 + .../convert/bson/BsonSimpledCoder.java | 1 + .../org/redkale/convert/bson/BsonWriter.java | 1 + .../convert/ext/BigIntegerSimpledCoder.java | 1 + .../convert/ext/BoolArraySimpledCoder.java | 6 +- .../redkale/convert/ext/BoolSimpledCoder.java | 1 + .../convert/ext/ByteArraySimpledCoder.java | 6 +- .../redkale/convert/ext/ByteSimpledCoder.java | 1 + .../convert/ext/CharArraySimpledCoder.java | 6 +- .../redkale/convert/ext/CharSimpledCoder.java | 1 + .../convert/ext/DLongSimpledCoder.java | 14 +- .../redkale/convert/ext/DateSimpledCoder.java | 1 + .../convert/ext/DoubleArraySimpledCoder.java | 6 +- .../convert/ext/DoubleSimpledCoder.java | 1 + .../redkale/convert/ext/EnumSimpledCoder.java | 1 + .../convert/ext/FloatArraySimpledCoder.java | 6 +- .../convert/ext/FloatSimpledCoder.java | 1 + .../convert/ext/InetAddressSimpledCoder.java | 1 + .../convert/ext/IntArraySimpledCoder.java | 6 +- .../redkale/convert/ext/IntSimpledCoder.java | 1 + .../convert/ext/LongArraySimpledCoder.java | 6 +- .../redkale/convert/ext/LongSimpledCoder.java | 1 + .../convert/ext/NumberSimpledCoder.java | 1 + .../convert/ext/PatternSimpledCoder.java | 1 + .../convert/ext/ShortArraySimpledCoder.java | 6 +- .../convert/ext/ShortSimpledCoder.java | 1 + .../convert/ext/StringArraySimpledCoder.java | 6 +- .../convert/ext/StringSimpledCoder.java | 1 + .../redkale/convert/ext/TypeSimpledCoder.java | 1 + .../convert/json/DLongJsonSimpledCoder.java | 34 ++ .../json/InetAddressJsonSimpledCoder.java | 1 + .../convert/json/JsonByteBufferWriter.java | 1 + .../org/redkale/convert/json/JsonConvert.java | 1 + .../org/redkale/convert/json/JsonFactory.java | 3 + .../org/redkale/convert/json/JsonReader.java | 1 + .../convert/json/JsonSimpledCoder.java | 1 + .../org/redkale/convert/json/JsonWriter.java | 1 + .../org/redkale/net/client/HttpClient.java | 1 + .../org/redkale/net/client/HttpFactory.java | 1 + .../redkale/net/client/WebSocketClient.java | 1 + .../src/org/redkale/util/AnyValue.java | 446 ++++++++++++++++++ .../org/redkale/util/AsmMethodVisitor.java | 10 +- .../src/org/redkale/util/Attribute.java | 93 +++- .../src/org/redkale/util/AutoLoad.java | 28 ++ .../src/org/redkale/util/ByteArray.java | 18 +- .../src/org/redkale/util/Creator.java | 26 +- .../src/org/redkale/util/DLong.java | 65 ++- .../src/org/redkale/util/Ignore.java | 28 ++ .../src/org/redkale/util/LogLevel.java | 25 + .../src/org/redkale/util/Nameable.java | 16 + .../src/org/redkale/util/ObjectPool.java | 5 +- .../src/org/redkale/util/Reproduce.java | 135 ++++++ .../src/org/redkale/util/ResourceFactory.java | 245 ++++++++++ .../src/org/redkale/util/SelectColumn.java | 137 ++++++ .../src/org/redkale/util/Sheet.java | 7 +- .../src/org/redkale/util/TypeToken.java | 3 + .../src/org/redkale/util/Utility.java | 113 ++++- 86 files changed, 1604 insertions(+), 100 deletions(-) create mode 100644 android-jdk6-redkale/src/javax/annotation/Resource.java create mode 100644 android-jdk6-redkale/src/org/redkale/convert/json/DLongJsonSimpledCoder.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/AnyValue.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/AutoLoad.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/Ignore.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/LogLevel.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/Nameable.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/Reproduce.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/ResourceFactory.java create mode 100644 android-jdk6-redkale/src/org/redkale/util/SelectColumn.java diff --git a/android-jdk6-redkale/src/javax/annotation/Resource.java b/android-jdk6-redkale/src/javax/annotation/Resource.java new file mode 100644 index 000000000..3b8963bc9 --- /dev/null +++ b/android-jdk6-redkale/src/javax/annotation/Resource.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.annotation; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.*; + +/** + * The Resource annotation marks a resource that is needed + * by the application. This annotation may be applied to an + * application component class, or to fields or methods of the + * component class. When the annotation is applied to a + * field or method, the container will inject an instance + * of the requested resource into the application component + * when the component is initialized. If the annotation is + * applied to the component class, the annotation declares a + * resource that the application will look up at runtime.

+ * + * Even though this annotation is not marked Inherited, deployment + * tools are required to examine all superclasses of any component + * class to discover all uses of this annotation in all superclasses. + * All such annotation instances specify resources that are needed + * by the application component. Note that this annotation may + * appear on private fields and methods of superclasses; the container + * is required to perform injection in these cases as well. + * + * @since Common Annotations 1.0 + */ +@Target({TYPE, FIELD, METHOD}) +@Retention(RUNTIME) +public @interface Resource { + /** + * The JNDI name of the resource. For field annotations, + * the default is the field name. For method annotations, + * the default is the JavaBeans property name corresponding + * to the method. For class annotations, there is no default + * and this must be specified. + */ + String name() default ""; + + /** + * The name of the resource that the reference points to. It can + * link to any compatible resource using the global JNDI names. + * + * @since Common Annotations 1.1 + */ + + String lookup() default ""; + + /** + * The Java type of the resource. For field annotations, + * the default is the type of the field. For method annotations, + * the default is the type of the JavaBeans property. + * For class annotations, there is no default and this must be + * specified. + */ + Class type() default java.lang.Object.class; + + /** + * The two possible authentication types for a resource. + */ + enum AuthenticationType { + CONTAINER, + APPLICATION + } + + /** + * The authentication type to use for this resource. + * This may be specified for resources representing a + * connection factory of any supported type, and must + * not be specified for resources of other types. + */ + AuthenticationType authenticationType() default AuthenticationType.CONTAINER; + + /** + * Indicates whether this resource can be shared between + * this component and other components. + * This may be specified for resources representing a + * connection factory of any supported type, and must + * not be specified for resources of other types. + */ + boolean shareable() default true; + + /** + * A product specific name that this resource should be mapped to. + * The name of this resource, as defined by the name + * element or defaulted, is a name that is local to the application + * component using the resource. (It's a name in the JNDI + * java:comp/env namespace.) Many application servers + * provide a way to map these local names to names of resources + * known to the application server. This mapped name is often a + * global JNDI name, but may be a name of any form.

+ * + * Application servers are not required to support any particular + * form or type of mapped name, nor the ability to use mapped names. + * The mapped name is product-dependent and often installation-dependent. + * No use of a mapped name is portable. + */ + String mappedName() default ""; + + /** + * Description of this resource. The description is expected + * to be in the default language of the system on which the + * application is deployed. The description can be presented + * to the Deployer to help in choosing the correct resource. + */ + String description() default ""; +} diff --git a/android-jdk6-redkale/src/org/redkale/convert/AnyEncoder.java b/android-jdk6-redkale/src/org/redkale/convert/AnyEncoder.java index 72685f9a8..c99d155c2 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/AnyEncoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/AnyEncoder.java @@ -10,6 +10,7 @@ import java.lang.reflect.Type; /** * 对不明类型的对象进行序列化; BSON序列化时将对象的类名写入Writer,JSON则不写入。 * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/ArrayDecoder.java b/android-jdk6-redkale/src/org/redkale/convert/ArrayDecoder.java index 4259402d4..2d7541ac8 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ArrayDecoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ArrayDecoder.java @@ -13,6 +13,7 @@ import java.util.*; * 数组长度不能超过 32767。 在BSON中数组长度设定的是short,对于大于32767长度的数组传输会影响性能,所以没有采用int存储。 * 支持一定程度的泛型。 * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/ArrayEncoder.java b/android-jdk6-redkale/src/org/redkale/convert/ArrayEncoder.java index 31421784c..d3e7f90a6 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ArrayEncoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ArrayEncoder.java @@ -9,9 +9,10 @@ import java.lang.reflect.*; /** * 对象数组的反序列化,不包含int[]、long[]这样的primitive class数组. - * 数组长度不能超过 32767。 在BSON中数组长度设定的是short,对于大于32767长度的数组传输会影响性能,所以没有采用int存储。 + * 数组长度不能超过 32767。 在BSON中数组长度设定的是short,对于大于32767长度的数组传输会影响性能,所以没有必要采用int存储。 * 支持一定程度的泛型。 * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/CollectionDecoder.java b/android-jdk6-redkale/src/org/redkale/convert/CollectionDecoder.java index 95d7613e7..073794650 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/CollectionDecoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/CollectionDecoder.java @@ -15,6 +15,7 @@ import java.util.Collection; * 集合大小不能超过 32767。 在BSON中集合大小设定的是short,对于大于32767长度的集合传输会影响性能,所以没有采用int存储。 * 支持一定程度的泛型。 * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/CollectionEncoder.java b/android-jdk6-redkale/src/org/redkale/convert/CollectionEncoder.java index fe6206d17..46d901068 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/CollectionEncoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/CollectionEncoder.java @@ -13,6 +13,7 @@ import java.util.Collection; * 集合大小不能超过 32767。 在BSON中集合大小设定的是short,对于大于32767长度的集合传输会影响性能,所以没有采用int存储。 * 支持一定程度的泛型。 * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/Convert.java b/android-jdk6-redkale/src/org/redkale/convert/Convert.java index 5e93b5f37..f63681e23 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/Convert.java +++ b/android-jdk6-redkale/src/org/redkale/convert/Convert.java @@ -8,6 +8,7 @@ package org.redkale.convert; /** * 序列化操作类 * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ConvertColumn.java b/android-jdk6-redkale/src/org/redkale/convert/ConvertColumn.java index 974b0db73..336734898 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ConvertColumn.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ConvertColumn.java @@ -12,6 +12,7 @@ import static java.lang.annotation.RetentionPolicy.*; /** * 依附在setter、getter方法、字段进行简单的配置 * + * @see http://www.redkale.org * @author zhangjx */ @Inherited diff --git a/android-jdk6-redkale/src/org/redkale/convert/ConvertColumnEntry.java b/android-jdk6-redkale/src/org/redkale/convert/ConvertColumnEntry.java index 273139d26..08bbe6d70 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ConvertColumnEntry.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ConvertColumnEntry.java @@ -8,6 +8,7 @@ package org.redkale.convert; /** * ConvertColumn 对应的实体类 * + * @see http://www.redkale.org * @author zhangjx */ public final class ConvertColumnEntry { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ConvertColumns.java b/android-jdk6-redkale/src/org/redkale/convert/ConvertColumns.java index 9e4fbb4eb..1c62d5539 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ConvertColumns.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ConvertColumns.java @@ -12,6 +12,7 @@ import static java.lang.annotation.RetentionPolicy.*; /** * ConvertColumn 的多用类 * + * @see http://www.redkale.org * @author zhangjx */ @Inherited diff --git a/android-jdk6-redkale/src/org/redkale/convert/ConvertEntity.java b/android-jdk6-redkale/src/org/redkale/convert/ConvertEntity.java index 6449df6cd..329c8440c 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ConvertEntity.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ConvertEntity.java @@ -13,6 +13,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; * 用于类名的别名, 类似javax.persistence.Table * 该值必须是全局唯一 * + * @see http://www.redkale.org * @author zhangjx */ @Inherited diff --git a/android-jdk6-redkale/src/org/redkale/convert/ConvertException.java b/android-jdk6-redkale/src/org/redkale/convert/ConvertException.java index 4fdc3f6ce..0d45e0829 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ConvertException.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ConvertException.java @@ -6,6 +6,7 @@ package org.redkale.convert; /** * + * @see http://www.redkale.org * @author zhangjx */ public class ConvertException extends RuntimeException { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ConvertType.java b/android-jdk6-redkale/src/org/redkale/convert/ConvertType.java index e079007d6..15d0833c5 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ConvertType.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ConvertType.java @@ -7,6 +7,7 @@ package org.redkale.convert; /** * + * @see http://www.redkale.org * @author zhangjx */ public enum ConvertType { diff --git a/android-jdk6-redkale/src/org/redkale/convert/DeMember.java b/android-jdk6-redkale/src/org/redkale/convert/DeMember.java index 75de5e173..6e31ce2df 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/DeMember.java +++ b/android-jdk6-redkale/src/org/redkale/convert/DeMember.java @@ -9,6 +9,7 @@ import org.redkale.util.Attribute; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/Decodeable.java b/android-jdk6-redkale/src/org/redkale/convert/Decodeable.java index a3c02cec1..6dbc8458b 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/Decodeable.java +++ b/android-jdk6-redkale/src/org/redkale/convert/Decodeable.java @@ -9,6 +9,7 @@ import java.lang.reflect.Type; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/EnMember.java b/android-jdk6-redkale/src/org/redkale/convert/EnMember.java index 5d2c24b57..99f2cd667 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/EnMember.java +++ b/android-jdk6-redkale/src/org/redkale/convert/EnMember.java @@ -9,6 +9,7 @@ import org.redkale.util.Attribute; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/Encodeable.java b/android-jdk6-redkale/src/org/redkale/convert/Encodeable.java index 9d5f1eb29..4b95c8d01 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/Encodeable.java +++ b/android-jdk6-redkale/src/org/redkale/convert/Encodeable.java @@ -9,6 +9,7 @@ import java.lang.reflect.Type; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/Factory.java b/android-jdk6-redkale/src/org/redkale/convert/Factory.java index 1e29ec078..b8b308a84 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/Factory.java +++ b/android-jdk6-redkale/src/org/redkale/convert/Factory.java @@ -12,15 +12,16 @@ import java.lang.reflect.*; import java.math.BigInteger; import java.net.*; import static org.redkale.convert.ext.InetAddressSimpledCoder.*; -import org.redkale.util.Creator.Creators; import java.util.*; import java.util.concurrent.*; import java.util.regex.*; import org.redkale.convert.ext.*; import org.redkale.util.*; +import org.redkale.util.Creator.Creators; /** - * + * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/HashedMap.java b/android-jdk6-redkale/src/org/redkale/convert/HashedMap.java index f30dd9385..a0f8db5a9 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/HashedMap.java +++ b/android-jdk6-redkale/src/org/redkale/convert/HashedMap.java @@ -9,6 +9,7 @@ import java.lang.reflect.*; /** * 只增不减的伪Map类 * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -44,8 +45,9 @@ public final class HashedMap { Entry entry = data[index]; while (entry != null) { if (k == entry.key) { + V old = entry.value; entry.value = value; - return entry.value; + return old; } entry = entry.next; } diff --git a/android-jdk6-redkale/src/org/redkale/convert/MapDecoder.java b/android-jdk6-redkale/src/org/redkale/convert/MapDecoder.java index 8dc6bd6e6..addecb82d 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/MapDecoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/MapDecoder.java @@ -12,6 +12,7 @@ import java.util.Map; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/MapEncoder.java b/android-jdk6-redkale/src/org/redkale/convert/MapEncoder.java index c8ba007e4..544100d71 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/MapEncoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/MapEncoder.java @@ -11,6 +11,7 @@ import java.util.Map; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ObjectDecoder.java b/android-jdk6-redkale/src/org/redkale/convert/ObjectDecoder.java index ebe16a2e0..5118c925f 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ObjectDecoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ObjectDecoder.java @@ -15,6 +15,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ObjectEncoder.java b/android-jdk6-redkale/src/org/redkale/convert/ObjectEncoder.java index 897fb8051..87d75aee1 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ObjectEncoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ObjectEncoder.java @@ -6,12 +6,13 @@ package org.redkale.convert; import org.redkale.util.Attribute; -import org.redkale.util.Attribute.Attributes; import java.lang.reflect.*; import java.util.*; +import org.redkale.util.Attribute.Attributes; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/Reader.java b/android-jdk6-redkale/src/org/redkale/convert/Reader.java index 743474ac4..fb6114d5d 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/Reader.java +++ b/android-jdk6-redkale/src/org/redkale/convert/Reader.java @@ -9,6 +9,7 @@ import java.util.concurrent.atomic.AtomicInteger; /** * + * @see http://www.redkale.org * @author zhangjx */ public interface Reader { diff --git a/android-jdk6-redkale/src/org/redkale/convert/SimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/SimpledCoder.java index fef1ec2cc..645befaf9 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/SimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/SimpledCoder.java @@ -10,6 +10,7 @@ import java.lang.reflect.Type; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/Writer.java b/android-jdk6-redkale/src/org/redkale/convert/Writer.java index 4da8710b8..e295d60a1 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/Writer.java +++ b/android-jdk6-redkale/src/org/redkale/convert/Writer.java @@ -9,6 +9,7 @@ import org.redkale.util.Attribute; /** * + * @see http://www.redkale.org * @author zhangjx */ public interface Writer { diff --git a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonByteBufferWriter.java b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonByteBufferWriter.java index ba724bbc1..0cc0b5c04 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonByteBufferWriter.java +++ b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonByteBufferWriter.java @@ -10,6 +10,7 @@ import java.util.function.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class BsonByteBufferWriter extends BsonWriter { diff --git a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonConvert.java b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonConvert.java index 38618f675..f60a23b33 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonConvert.java +++ b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonConvert.java @@ -29,6 +29,7 @@ import org.redkale.util.*; * 5. SIGN_NONEXT 标记位,值固定为0 (byte) * 6. SIGN_OBJECTE 标记位,值固定为0xEE (short) * + * @see http://www.redkale.org * @author zhangjx */ public final class BsonConvert extends Convert { diff --git a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonFactory.java b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonFactory.java index 7b2dba377..ecf3a15ee 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonFactory.java +++ b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonFactory.java @@ -10,6 +10,7 @@ import org.redkale.convert.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class BsonFactory extends Factory { diff --git a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonReader.java b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonReader.java index 5596e7677..57fda8155 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonReader.java +++ b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonReader.java @@ -14,6 +14,7 @@ import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class BsonReader implements Reader { diff --git a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonSimpledCoder.java index 2a4e5950f..8304be26e 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonSimpledCoder.java @@ -9,6 +9,7 @@ import org.redkale.convert.SimpledCoder; /** * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonWriter.java b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonWriter.java index c10e2f204..895b5525d 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/bson/BsonWriter.java +++ b/android-jdk6-redkale/src/org/redkale/convert/bson/BsonWriter.java @@ -12,6 +12,7 @@ import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public class BsonWriter implements Writer { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/BigIntegerSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/BigIntegerSimpledCoder.java index 8a6dd5284..f9d076cdf 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/BigIntegerSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/BigIntegerSimpledCoder.java @@ -12,6 +12,7 @@ import java.math.BigInteger; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/BoolArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/BoolArraySimpledCoder.java index bf9f2e2c2..821e74974 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/BoolArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/BoolArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class BoolArraySimpledCoder ext @Override public boolean[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; boolean[] data = new boolean[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/BoolSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/BoolSimpledCoder.java index e25feca7d..90157a266 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/BoolSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/BoolSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/ByteArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/ByteArraySimpledCoder.java index d642e726c..7349117f7 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/ByteArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/ByteArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class ByteArraySimpledCoder ext @Override public byte[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; byte[] data = new byte[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/ByteSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/ByteSimpledCoder.java index 74861c7a8..9042c29a1 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/ByteSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/ByteSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/CharArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/CharArraySimpledCoder.java index efac0785f..14ab2e881 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/CharArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/CharArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class CharArraySimpledCoder ext @Override public char[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; char[] data = new char[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/CharSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/CharSimpledCoder.java index 8e3803945..747b2760a 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/CharSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/CharSimpledCoder.java @@ -12,6 +12,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/DLongSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/DLongSimpledCoder.java index 9df4bb726..d0f8844d5 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/DLongSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/DLongSimpledCoder.java @@ -8,16 +8,19 @@ package org.redkale.convert.ext; import org.redkale.convert.Reader; import org.redkale.convert.Writer; import org.redkale.convert.SimpledCoder; -import org.redkale.util.DLong; +import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param */ public final class DLongSimpledCoder extends SimpledCoder { + private static final ByteArraySimpledCoder bsSimpledCoder = ByteArraySimpledCoder.instance; + public static final DLongSimpledCoder instance = new DLongSimpledCoder(); @Override @@ -25,16 +28,15 @@ public final class DLongSimpledCoder extends if (value == null) { out.writeNull(); } else { - out.writeSmallString(value.getFirst() + "_" + value.getSecond()); + bsSimpledCoder.convertTo(out, value.directBytes()); } } @Override public DLong convertFrom(R in) { - String str = in.readString(); - if (str == null) return null; - int pos = str.indexOf('_'); - return new DLong(Long.parseLong(str.substring(0, pos)), Long.parseLong(str.substring(pos + 1))); + byte[] bs = bsSimpledCoder.convertFrom(in); + if (bs == null) return null; + return new DLong(bs); } } diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/DateSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/DateSimpledCoder.java index d884167e4..1da0f693d 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/DateSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/DateSimpledCoder.java @@ -12,6 +12,7 @@ import java.util.Date; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java index 9005ab25d..cd36fd6a7 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class DoubleArraySimpledCoder e @Override public double[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; double[] data = new double[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleSimpledCoder.java index 613877115..5b864c6ef 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/DoubleSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/EnumSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/EnumSimpledCoder.java index aa6b0ee10..a988088bd 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/EnumSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/EnumSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/FloatArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/FloatArraySimpledCoder.java index 84eaf45f8..e3664a4ad 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/FloatArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/FloatArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class FloatArraySimpledCoder ex @Override public float[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; float[] data = new float[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/FloatSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/FloatSimpledCoder.java index 265eddbeb..65c86c5dc 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/FloatSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/FloatSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/InetAddressSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/InetAddressSimpledCoder.java index f2eee328a..a057cf2b5 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/InetAddressSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/InetAddressSimpledCoder.java @@ -12,6 +12,7 @@ import java.net.*; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/IntArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/IntArraySimpledCoder.java index ca9b60000..5e9cb18fc 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/IntArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/IntArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class IntArraySimpledCoder exte @Override public int[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; int[] data = new int[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/IntSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/IntSimpledCoder.java index 13815f424..f007ca0e0 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/IntSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/IntSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/LongArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/LongArraySimpledCoder.java index b9f21a145..879157c03 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/LongArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/LongArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class LongArraySimpledCoder ext @Override public long[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; long[] data = new long[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/LongSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/LongSimpledCoder.java index 0c578ceea..ffbbb9552 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/LongSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/LongSimpledCoder.java @@ -12,6 +12,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/NumberSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/NumberSimpledCoder.java index 28c809fa8..96c5c4dca 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/NumberSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/NumberSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/PatternSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/PatternSimpledCoder.java index fd652a3ac..c79c72b07 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/PatternSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/PatternSimpledCoder.java @@ -10,6 +10,7 @@ import org.redkale.convert.*; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/ShortArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/ShortArraySimpledCoder.java index af726f8bc..5a9cd1929 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/ShortArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/ShortArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class ShortArraySimpledCoder ex @Override public short[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; short[] data = new short[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/ShortSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/ShortSimpledCoder.java index 1b6f08221..18c7ca5cd 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/ShortSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/ShortSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/StringArraySimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/StringArraySimpledCoder.java index c07cbc979..4ddc174b3 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/StringArraySimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/StringArraySimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param @@ -38,9 +39,8 @@ public final class StringArraySimpledCoder e @Override public String[] convertFrom(R in) { int len = in.readArrayB(); - if (len == Reader.SIGN_NULL) { - return null; - } else if (len == Reader.SIGN_NOLENGTH) { + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { int size = 0; String[] data = new String[8]; while (in.hasNext()) { diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/StringSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/StringSimpledCoder.java index 189e557ec..f41425233 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/StringSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/StringSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.Writer; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/ext/TypeSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/ext/TypeSimpledCoder.java index f1a93b4e4..0dc4349c9 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/ext/TypeSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/ext/TypeSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.SimpledCoder; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/DLongJsonSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/json/DLongJsonSimpledCoder.java new file mode 100644 index 000000000..a68019866 --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/convert/json/DLongJsonSimpledCoder.java @@ -0,0 +1,34 @@ +/* + * 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.convert.json; + +import org.redkale.util.*; + +/** + * + * @see http://www.redkale.org + * @author zhangjx + */ +public class DLongJsonSimpledCoder extends JsonSimpledCoder { + + public static final DLongJsonSimpledCoder instance = new DLongJsonSimpledCoder(); + + @Override + public void convertTo(final JsonWriter out, final DLong value) { + if (value == null) { + out.writeNull(); + } else { + out.writeSmallString(value.toString()); + } + } + + @Override + public DLong convertFrom(JsonReader in) { + final String str = in.readString(); + if (str == null) return null; + return new DLong(Utility.hexToBin(str)); + } +} diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/InetAddressJsonSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/json/InetAddressJsonSimpledCoder.java index 2720284fd..d65032255 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/InetAddressJsonSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/InetAddressJsonSimpledCoder.java @@ -11,6 +11,7 @@ import org.redkale.convert.ext.*; /** * + * @see http://www.redkale.org * @author zhangjx * @param * @param diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/JsonByteBufferWriter.java b/android-jdk6-redkale/src/org/redkale/convert/json/JsonByteBufferWriter.java index 20835b1a9..1249de9ca 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/JsonByteBufferWriter.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/JsonByteBufferWriter.java @@ -13,6 +13,7 @@ import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class JsonByteBufferWriter extends JsonWriter { diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/JsonConvert.java b/android-jdk6-redkale/src/org/redkale/convert/json/JsonConvert.java index d4d1786c8..4f7089ad5 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/JsonConvert.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/JsonConvert.java @@ -14,6 +14,7 @@ import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ @SuppressWarnings("unchecked") diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/JsonFactory.java b/android-jdk6-redkale/src/org/redkale/convert/json/JsonFactory.java index 435ab3496..88753f691 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/JsonFactory.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/JsonFactory.java @@ -9,9 +9,11 @@ import org.redkale.convert.ConvertType; import org.redkale.convert.Factory; import java.io.Serializable; import java.net.*; +import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class JsonFactory extends Factory { @@ -21,6 +23,7 @@ public final class JsonFactory extends Factory { static { instance.register(InetAddress.class, InetAddressJsonSimpledCoder.instance); instance.register(InetSocketAddress.class, InetAddressJsonSimpledCoder.InetSocketAddressJsonSimpledCoder.instance); + instance.register(DLong.class, DLongJsonSimpledCoder.instance); instance.register(Serializable.class, instance.loadEncoder(Object.class)); } diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/JsonReader.java b/android-jdk6-redkale/src/org/redkale/convert/json/JsonReader.java index 4a61d6c85..1789faa0e 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/JsonReader.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/JsonReader.java @@ -13,6 +13,7 @@ import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class JsonReader implements Reader { diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/JsonSimpledCoder.java b/android-jdk6-redkale/src/org/redkale/convert/json/JsonSimpledCoder.java index 396cba71a..d8049e80c 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/JsonSimpledCoder.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/JsonSimpledCoder.java @@ -9,6 +9,7 @@ import org.redkale.convert.SimpledCoder; /** * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/convert/json/JsonWriter.java b/android-jdk6-redkale/src/org/redkale/convert/json/JsonWriter.java index 6766406af..377aab23f 100644 --- a/android-jdk6-redkale/src/org/redkale/convert/json/JsonWriter.java +++ b/android-jdk6-redkale/src/org/redkale/convert/json/JsonWriter.java @@ -14,6 +14,7 @@ import org.redkale.util.*; * * writeTo系列的方法输出的字符不能含特殊字符 * + * @see http://www.redkale.org * @author zhangjx */ public class JsonWriter implements Writer { diff --git a/android-jdk6-redkale/src/org/redkale/net/client/HttpClient.java b/android-jdk6-redkale/src/org/redkale/net/client/HttpClient.java index d27696719..06f42f0f6 100644 --- a/android-jdk6-redkale/src/org/redkale/net/client/HttpClient.java +++ b/android-jdk6-redkale/src/org/redkale/net/client/HttpClient.java @@ -10,6 +10,7 @@ import java.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class HttpClient { diff --git a/android-jdk6-redkale/src/org/redkale/net/client/HttpFactory.java b/android-jdk6-redkale/src/org/redkale/net/client/HttpFactory.java index af276593e..0a31702cc 100644 --- a/android-jdk6-redkale/src/org/redkale/net/client/HttpFactory.java +++ b/android-jdk6-redkale/src/org/redkale/net/client/HttpFactory.java @@ -11,6 +11,7 @@ import java.util.concurrent.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public class HttpFactory { diff --git a/android-jdk6-redkale/src/org/redkale/net/client/WebSocketClient.java b/android-jdk6-redkale/src/org/redkale/net/client/WebSocketClient.java index eca39a863..f6e283251 100644 --- a/android-jdk6-redkale/src/org/redkale/net/client/WebSocketClient.java +++ b/android-jdk6-redkale/src/org/redkale/net/client/WebSocketClient.java @@ -14,6 +14,7 @@ import org.redkale.util.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public class WebSocketClient { diff --git a/android-jdk6-redkale/src/org/redkale/util/AnyValue.java b/android-jdk6-redkale/src/org/redkale/util/AnyValue.java new file mode 100644 index 000000000..737753c38 --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/AnyValue.java @@ -0,0 +1,446 @@ +/* + * 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.util; + +import java.lang.reflect.Array; +import java.util.*; +import java.util.function.BiPredicate; + +/** + * 该类提供类似JSONObject的数据结构,主要用于读取xml配置文件和http-header存储 + * + * @see http://www.redkale.org + * @author zhangjx + */ +@SuppressWarnings("unchecked") +public abstract class AnyValue { + + /** + * 可读写的AnyValue默认实现类 + * + * @see http://www.redkale.org + * @author zhangjx + */ + @SuppressWarnings("unchecked") + public static final class DefaultAnyValue extends AnyValue { + + public static final BiPredicate EQUALS = new BiPredicate() { + @Override + public boolean test(String name1, String name2) { + return name1.equals(name2); + } + }; + + public static final BiPredicate EQUALSIGNORE = new BiPredicate() { + @Override + public boolean test(String name1, String name2) { + return name1.equalsIgnoreCase(name2); + } + }; + + private final BiPredicate predicate; + + private Entry[] stringValues = new Entry[0]; + + private Entry[] entityValues = new Entry[0]; + + public static final DefaultAnyValue create() { + return new DefaultAnyValue(); + } + + public static final DefaultAnyValue create(String name, String value) { + DefaultAnyValue conf = new DefaultAnyValue(); + conf.addValue(name, value); + return conf; + } + + public static final DefaultAnyValue create(String name, AnyValue value) { + DefaultAnyValue conf = new DefaultAnyValue(); + conf.addValue(name, value); + return conf; + } + + public DefaultAnyValue() { + this(false); + } + + public DefaultAnyValue(boolean ignoreCase) { + this.predicate = ignoreCase ? EQUALSIGNORE : EQUALS; + } + + public DefaultAnyValue(BiPredicate predicate) { + this.predicate = predicate; + } + + public DefaultAnyValue duplicate() { + DefaultAnyValue rs = new DefaultAnyValue(this.predicate); + rs.stringValues = this.stringValues; + rs.entityValues = this.entityValues; + return rs; + } + + public DefaultAnyValue addAll(final AnyValue av) { + if (av == null) return this; + if (av instanceof DefaultAnyValue) { + final DefaultAnyValue adv = (DefaultAnyValue) av; + if (adv.stringValues != null) { + for (Entry en : adv.stringValues) { + this.addValue(en.name, en.value); + } + } + if (adv.entityValues != null) { + for (Entry en : adv.entityValues) { + this.addValue(en.name, en.value); + } + } + } else { + final Entry[] strings = av.getStringEntrys(); + if (strings != null) { + for (Entry en : strings) { + this.addValue(en.name, en.value); + } + } + final Entry[] anys = av.getAnyEntrys(); + if (anys != null) { + for (Entry en : anys) { + this.addValue(en.name, en.value); + } + } + } + return this; + } + + public DefaultAnyValue setAll(final AnyValue av) { + if (av == null) return this; + if (av instanceof DefaultAnyValue) { + final DefaultAnyValue adv = (DefaultAnyValue) av; + if (adv.stringValues != null) { + for (Entry en : adv.stringValues) { + this.setValue(en.name, en.value); + } + } + if (adv.entityValues != null) { + for (Entry en : adv.entityValues) { + this.setValue(en.name, en.value); + } + } + } else { + final Entry[] strings = av.getStringEntrys(); + if (strings != null) { + for (Entry en : strings) { + this.setValue(en.name, en.value); + } + } + final Entry[] anys = av.getAnyEntrys(); + if (anys != null) { + for (Entry en : anys) { + this.setValue(en.name, en.value); + } + } + } + return this; + } + + @Override + public Entry[] getStringEntrys() { + return stringValues; + } + + @Override + public Entry[] getAnyEntrys() { + return entityValues; + } + + @Override + public String[] getNames() { + Set set = new LinkedHashSet(); + for (Entry en : this.stringValues) { + set.add(en.name); + } + for (Entry en : this.entityValues) { + set.add(en.name); + } + return set.toArray(new String[set.size()]); + } + + @Override + public String[] getValues(String... names) { + return Entry.getValues(this.predicate, String.class, this.stringValues, names); + } + + @Override + public AnyValue[] getAnyValues(String... names) { + return Entry.getValues(this.predicate, AnyValue.class, this.entityValues, names); + } + + @Override + public String toString() { + return toString(0); + } + + public DefaultAnyValue clear() { + this.stringValues = new Entry[0]; + this.entityValues = new Entry[0]; + return this; + } + + public DefaultAnyValue setValue(String name, String value) { + if (name == null) return this; + if (getValue(name) == null) { + this.addValue(name, value); + } else { + for (Entry en : this.stringValues) { + if (predicate.test(en.name, name)) { + en.value = value; + return this; + } + } + } + return this; + } + + public DefaultAnyValue setValue(String name, AnyValue value) { + if (name == null) return this; + if (getValue(name) == null) { + this.addValue(name, value); + } else { + for (Entry en : this.entityValues) { + if (predicate.test(en.name, name)) { + en.value = value; + return this; + } + } + } + return this; + } + + public DefaultAnyValue addValue(String name, String value) { + if (name == null) return this; + int len = this.stringValues.length; + Entry[] news = new Entry[len + 1]; + System.arraycopy(this.stringValues, 0, news, 0, len); + news[len] = new Entry(name, value); + this.stringValues = news; + return this; + } + + public DefaultAnyValue addValue(String name, AnyValue value) { + if (name == null || value == null) return this; + int len = this.entityValues.length; + Entry[] news = new Entry[len + 1]; + System.arraycopy(this.entityValues, 0, news, 0, len); + news[len] = new Entry(name, value); + this.entityValues = news; + return this; + } + + @Override + public AnyValue getAnyValue(String name) { + for (Entry en : this.entityValues) { + if (predicate.test(en.name, name)) { + return en.value; + } + } + return null; + } + + @Override + public String getValue(String name) { + for (Entry en : this.stringValues) { + if (predicate.test(en.name, name)) { + return en.value; + } + } + return null; + } + + @Override + public String[] getValues(String name) { + return Entry.getValues(this.predicate, String.class, this.stringValues, name); + } + + @Override + public AnyValue[] getAnyValues(String name) { + return Entry.getValues(this.predicate, AnyValue.class, this.entityValues, name); + } + + } + + public static final class Entry { + + public final String name; + + T value; + + public Entry(String name0, T value0) { + this.name = name0; + this.value = value0; + } + + public T getValue() { + return value; + } + + static T[] getValues(BiPredicate comparison, Class clazz, Entry[] entitys, String name) { + int len = 0; + for (Entry en : entitys) { + if (comparison.test(en.name, name)) { + ++len; + } + } + if (len == 0) return (T[]) Array.newInstance(clazz, len); + T[] rs = (T[]) Array.newInstance(clazz, len); + int i = 0; + for (Entry en : entitys) { + if (comparison.test(en.name, name)) { + rs[i++] = en.value; + } + } + return rs; + } + + static T[] getValues(BiPredicate comparison, Class clazz, Entry[] entitys, String... names) { + int len = 0; + for (Entry en : entitys) { + for (String name : names) { + if (comparison.test(en.name, name)) { + ++len; + break; + } + } + } + if (len == 0) return (T[]) Array.newInstance(clazz, len); + T[] rs = (T[]) Array.newInstance(clazz, len); + int i = 0; + for (Entry en : entitys) { + for (String name : names) { + if (comparison.test(en.name, name)) { + rs[i++] = en.value; + break; + } + } + } + return rs; + } + } + + public static AnyValue create() { + return new DefaultAnyValue(); + } + + protected String toString(int len) { + if (len < 0) len = 0; + char[] chars = new char[len]; + Arrays.fill(chars, ' '); + final String space = new String(chars); + StringBuilder sb = new StringBuilder(); + sb.append("{\r\n"); + for (Entry en : getStringEntrys()) { + sb.append(space).append(" '").append(en.name).append("': '").append(en.value).append("',\r\n"); + } + for (Entry en : getAnyEntrys()) { + sb.append(space).append(" '").append(en.name).append("': '").append(en.value.toString(len + 4)).append("',\r\n"); + } + sb.append(space).append('}'); + return sb.toString(); + } + + public abstract Entry[] getStringEntrys(); + + public abstract Entry[] getAnyEntrys(); + + public abstract String[] getNames(); + + public abstract String[] getValues(String name); + + public abstract String[] getValues(String... names); + + public abstract AnyValue[] getAnyValues(String name); + + public abstract AnyValue[] getAnyValues(String... names); + + public abstract AnyValue getAnyValue(String name); + + public abstract String getValue(String name); + + public boolean getBoolValue(String name) { + return Boolean.parseBoolean(getValue(name)); + } + + public boolean getBoolValue(String name, boolean defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Boolean.parseBoolean(value); + } + + public byte getByteValue(String name) { + return Byte.parseByte(getValue(name)); + } + + public byte getByteValue(String name, byte defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Byte.decode(value); + } + + public char getCharValue(String name) { + return getValue(name).charAt(0); + } + + public char getCharValue(String name, char defaultValue) { + String value = getValue(name); + return value == null || value.length() == 0 ? defaultValue : value.charAt(0); + } + + public short getShortValue(String name) { + return Short.decode(getValue(name)); + } + + public short getShortValue(String name, short defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Short.decode(value); + } + + public int getIntValue(String name) { + return Integer.decode(getValue(name)); + } + + public int getIntValue(String name, int defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Integer.decode(value); + } + + public long getLongValue(String name) { + return Long.decode(getValue(name)); + } + + public long getLongValue(String name, long defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Long.decode(value); + } + + public float getFloatValue(String name) { + return Float.parseFloat(getValue(name)); + } + + public float getFloatValue(String name, float defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Float.parseFloat(value); + } + + public double getDoubleValue(String name) { + return Double.parseDouble(getValue(name)); + } + + public double getDoubleValue(String name, double defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : Double.parseDouble(value); + } + + public String getValue(String name, String defaultValue) { + String value = getValue(name); + return value == null ? defaultValue : value; + } + +} diff --git a/android-jdk6-redkale/src/org/redkale/util/AsmMethodVisitor.java b/android-jdk6-redkale/src/org/redkale/util/AsmMethodVisitor.java index c53b8f5b3..41f966d98 100644 --- a/android-jdk6-redkale/src/org/redkale/util/AsmMethodVisitor.java +++ b/android-jdk6-redkale/src/org/redkale/util/AsmMethodVisitor.java @@ -10,6 +10,7 @@ import org.objectweb.asm.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public class AsmMethodVisitor { @@ -18,8 +19,9 @@ public class AsmMethodVisitor { private boolean debug = false; - public void setDebug(boolean d) { + public AsmMethodVisitor setDebug(boolean d) { debug = d; + return this; } private final Map labels = new LinkedHashMap(); @@ -49,6 +51,12 @@ public class AsmMethodVisitor { this.visitor = visitor; } + public AnnotationVisitor visitParameterAnnotation(int i, String string, boolean bln) { + AnnotationVisitor av = visitor.visitParameterAnnotation(i, string, bln); + if (debug) System.out.println("mv.visitParameterAnnotation(" + i + ", \"" + string + "\", " + bln + ");"); + return av; + } + public AnnotationVisitor visitAnnotation(String desc, boolean flag) { AnnotationVisitor av = visitor.visitAnnotation(desc, flag); if (debug) System.out.println("mv.visitAnnotation(\"" + desc + "\", " + flag + ");"); diff --git a/android-jdk6-redkale/src/org/redkale/util/Attribute.java b/android-jdk6-redkale/src/org/redkale/util/Attribute.java index 432365320..8bcc12eb7 100644 --- a/android-jdk6-redkale/src/org/redkale/util/Attribute.java +++ b/android-jdk6-redkale/src/org/redkale/util/Attribute.java @@ -11,17 +11,22 @@ import org.objectweb.asm.Type; /** * 该类功能是动态映射一个Data类中成员对应的getter、setter方法; 代替低效的反射实现方式。 - * 映射Field时,field要么是public非final,要么存在对应的getter、setter方法。 + * 映射Field时,field必须满足以下条件之一: + * 1、field属性是public且非final + * 2、至少存在对应的getter、setter方法中的一个 + * 当不存在getter方法时,get操作规定返回null + * 当不存在setter方法时,set操作为空方法 * + * @see http://www.redkale.org * @author zhangjx * @param * @param */ public interface Attribute { - public Class type(); + public Class type(); - public Class declaringClass(); + public Class declaringClass(); public String field(); @@ -29,23 +34,49 @@ public interface Attribute { public void set(T obj, F value); - public static final class Attributes { + public static abstract class Attributes { + /** + * 根据一个Field生成 Attribute 对象。 + * + * @param + * @param + * @param field + * @return + */ public static Attribute create(final Field field) { return create((Class) field.getDeclaringClass(), field.getName(), field, null, null); } + /** + * 根据一个Field和field的别名生成 Attribute 对象。 + * + * @param + * @param + * @param fieldname 别名 + * @param field + * @return + */ public static Attribute create(String fieldname, final Field field) { return create((Class) field.getDeclaringClass(), fieldname, field, null, null); } + /** + * 根据一个Class和field名生成 Attribute 对象。 + * + * @param + * @param + * @param clazz + * @param fieldname 字段名, 如果该字段不存在则抛异常 + * @return + */ public static Attribute create(Class clazz, final String fieldname) { try { return create(clazz, fieldname, clazz.getDeclaredField(fieldname), null, null); } catch (NoSuchFieldException ex) { throw new RuntimeException(ex); - } catch (SecurityException ex2) { - throw new RuntimeException(ex2); + } catch (SecurityException ex) { + throw new RuntimeException(ex); } } @@ -57,18 +88,60 @@ public interface Attribute { return create(clazz, fieldname, field, null, null); } + /** + * getter、setter不能全为null + * + * @param + * @param + * @param getter + * @param setter + * @return + */ public static Attribute create(final Method getter, final Method setter) { return create((Class) (getter == null ? setter.getDeclaringClass() : getter.getDeclaringClass()), null, null, getter, setter); } + /** + * getter、setter不能全为null + * + * @param + * @param + * @param clazz + * @param getter + * @param setter + * @return + */ public static Attribute create(Class clazz, final Method getter, final Method setter) { return create(clazz, null, null, getter, setter); } + /** + * getter、setter不能全为null + * + * @param + * @param + * @param clazz + * @param fieldalias + * @param getter + * @param setter + * @return + */ public static Attribute create(Class clazz, final String fieldalias, final Method getter, final Method setter) { return create(clazz, fieldalias, null, getter, setter); } + /** + * field、getter、setter不能全为null + * + * @param + * @param + * @param clazz + * @param fieldalias0 + * @param field0 + * @param getter0 + * @param setter0 + * @return + */ @SuppressWarnings("unchecked") public static Attribute create(final Class clazz, String fieldalias0, final Field field0, Method getter0, Method setter0) { if (fieldalias0 != null && fieldalias0.isEmpty()) fieldalias0 = null; @@ -145,10 +218,10 @@ public interface Attribute { } catch (Exception ex) { } //--------------------------------------------------- - final org.objectweb.asm.ClassWriter cw = new org.objectweb.asm.ClassWriter(0); - org.objectweb.asm.MethodVisitor mv; + final jdk.internal.org.objectweb.asm.ClassWriter cw = new jdk.internal.org.objectweb.asm.ClassWriter(0); + jdk.internal.org.objectweb.asm.MethodVisitor mv; - cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, "Ljava/lang/Object;L" + supDynName + "<" + interDesc + columnDesc + ">;", "java/lang/Object", new String[]{supDynName}); + cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, "Ljava/lang/Object;L" + supDynName + "<" + interDesc + columnDesc + ">;", "java/lang/Object", new String[]{supDynName}); { //构造方法 mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); @@ -209,6 +282,7 @@ public interface Attribute { mv.visitFieldInsn(GETFIELD, interName, field.getName(), Type.getDescriptor(pcolumn)); if (pcolumn != column) { mv.visitMethodInsn(INVOKESTATIC, columnName, "valueOf", "(" + Type.getDescriptor(pcolumn) + ")" + columnDesc, false); + m = 2; } } } else { @@ -236,6 +310,7 @@ public interface Attribute { try { java.lang.reflect.Method pm = column.getMethod(pcolumn.getSimpleName() + "Value"); mv.visitMethodInsn(INVOKEVIRTUAL, columnName, pm.getName(), Type.getMethodDescriptor(pm), false); + m = 3; } catch (Exception ex) { throw new RuntimeException(ex); //不可能会发生 } diff --git a/android-jdk6-redkale/src/org/redkale/util/AutoLoad.java b/android-jdk6-redkale/src/org/redkale/util/AutoLoad.java new file mode 100644 index 000000000..cb693927d --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/AutoLoad.java @@ -0,0 +1,28 @@ +/* + * 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.util; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 自动加载。 使用场景: + * 1、被标记为@AutoLoad(false)的Service类不会被自动加载 + * 2、被标记为@AutoLoad(false)的Servlet类不会被自动加载 + * 3、被标记为@AutoLoad且同时被标记为@javax.persistence.Cacheable的Entity类在被DataSource初始化时需要将Entity类对应的表数据全量加载进缓存中。 + * + * @see http://www.redkale.org + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE}) +@Retention(RUNTIME) +public @interface AutoLoad { + + boolean value() default true; +} diff --git a/android-jdk6-redkale/src/org/redkale/util/ByteArray.java b/android-jdk6-redkale/src/org/redkale/util/ByteArray.java index f6fddf6ad..fcbd774aa 100644 --- a/android-jdk6-redkale/src/org/redkale/util/ByteArray.java +++ b/android-jdk6-redkale/src/org/redkale/util/ByteArray.java @@ -9,7 +9,9 @@ import java.nio.*; import java.nio.charset.*; /** + * 简单的byte[]操作类。 * + * @see http://www.redkale.org * @author zhangjx */ public final class ByteArray { @@ -134,12 +136,16 @@ public final class ByteArray { public String toDecodeString(final int offset, int len, final Charset charset) { int index = offset; for (int i = offset; i < (offset + len); i++) { - if (content[i] == '+') { - content[index] = ' '; - } else if (content[i] == '%') { - content[index] = (byte) ((hexBit(content[++i]) * 16 + hexBit(content[++i]))); - } else { - content[index] = content[i]; + switch (content[i]) { + case '+': + content[index] = ' '; + break; + case '%': + content[index] = (byte) ((hexBit(content[++i]) * 16 + hexBit(content[++i]))); + break; + default: + content[index] = content[i]; + break; } index++; } diff --git a/android-jdk6-redkale/src/org/redkale/util/Creator.java b/android-jdk6-redkale/src/org/redkale/util/Creator.java index a6ba455d5..96fdbc072 100644 --- a/android-jdk6-redkale/src/org/redkale/util/Creator.java +++ b/android-jdk6-redkale/src/org/redkale/util/Creator.java @@ -4,16 +4,17 @@ */ package org.redkale.util; -import java.beans.*; +import java.beans.ConstructorProperties; import java.lang.reflect.*; import java.util.*; -import org.objectweb.asm.*; -import static org.objectweb.asm.Opcodes.*; -import org.objectweb.asm.Type; +import jdk.internal.org.objectweb.asm.*; +import static jdk.internal.org.objectweb.asm.Opcodes.*; +import jdk.internal.org.objectweb.asm.Type; /** - * 实现一个类的构造方法。 代替低效的反射实现方式。 + * 实现一个类的构造方法。 代替低效的反射实现方式。 不支持数组类 * + * @see http://www.redkale.org * @author zhangjx * @param */ @@ -21,7 +22,7 @@ public interface Creator { public T create(Object... params); - public static final class Creators { + public static abstract class Creators { @SuppressWarnings("unchecked") public static Creator create(Class clazz) { @@ -50,7 +51,7 @@ public interface Creator { } Constructor constructor = null; for (Constructor c : clazz.getConstructors()) { - if (c.getParameterTypes().length == 0) { + if (c.getParameterCount() == 0) { constructor = c; break; } @@ -69,13 +70,13 @@ public interface Creator { FieldVisitor fv; MethodVisitor mv; AnnotationVisitor av0; - cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, "Ljava/lang/Object;L" + supDynName + "<" + interDesc + ">;", "java/lang/Object", new String[]{supDynName}); + cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, "Ljava/lang/Object;L" + supDynName + "<" + interDesc + ">;", "java/lang/Object", new String[]{supDynName}); {//构造方法 mv = cw.visitMethod(ACC_PUBLIC, "", "()V", null, null); ConstructorProperties cps = constructor.getAnnotation(ConstructorProperties.class); if (cps != null) { - av0 = mv.visitAnnotation("Ljava/beans/ConstructorProperties;", true); + av0 = mv.visitAnnotation(Type.getDescriptor(ConstructorProperties.class), true); AnnotationVisitor av1 = av0.visitArray("value"); for (String n : cps.value()) { av1.visit(null, n); @@ -94,9 +95,8 @@ public interface Creator { mv.visitTypeInsn(NEW, interName); mv.visitInsn(DUP); //--------------------------------------- - final Class[] params = constructor.getParameterTypes(); { - + Parameter[] params = constructor.getParameters(); final int[] iconsts = {ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5}; for (int i = 0; i < params.length; i++) { mv.visitVarInsn(ALOAD, 1); @@ -106,7 +106,7 @@ public interface Creator { mv.visitIntInsn(BIPUSH, i); } mv.visitInsn(AALOAD); - Class ct = params[i]; + Class ct = params[i].getType(); mv.visitTypeInsn(CHECKCAST, Type.getInternalName(ct)); if (ct.isPrimitive()) { Class fct = Array.get(Array.newInstance(ct, 1), 0).getClass(); @@ -122,7 +122,7 @@ public interface Creator { //--------------------------------------- mv.visitMethodInsn(INVOKESPECIAL, interName, "", Type.getConstructorDescriptor(constructor), false); mv.visitInsn(ARETURN); - mv.visitMaxs((params.length > 0 ? (params.length + 3) : 2), 2); + mv.visitMaxs((constructor.getParameterCount() > 0 ? (constructor.getParameterCount() + 3) : 2), 2); mv.visitEnd(); } { //虚拟 create 方法 diff --git a/android-jdk6-redkale/src/org/redkale/util/DLong.java b/android-jdk6-redkale/src/org/redkale/util/DLong.java index 6d5351f0e..d1a53f018 100644 --- a/android-jdk6-redkale/src/org/redkale/util/DLong.java +++ b/android-jdk6-redkale/src/org/redkale/util/DLong.java @@ -5,31 +5,46 @@ */ package org.redkale.util; +import java.nio.*; +import java.util.*; + /** + * 16bytes数据结构 + * 注意: 为了提高性能, DLong中的bytes是直接返回, 不得对bytes的内容进行修改。 * + * @see http://www.redkale.org * @author zhangjx */ public final class DLong extends Number implements Comparable { - private final long first; + private final byte[] bytes; - private final long second; - - public DLong(long one, long two) { - this.first = one; - this.second = two; + public DLong(long v1, long v2) { + this.bytes = new byte[]{(byte) (v1 >> 56), (byte) (v1 >> 48), (byte) (v1 >> 40), (byte) (v1 >> 32), + (byte) (v1 >> 24), (byte) (v1 >> 16), (byte) (v1 >> 8), (byte) v1, (byte) (v2 >> 56), (byte) (v2 >> 48), (byte) (v2 >> 40), (byte) (v2 >> 32), + (byte) (v2 >> 24), (byte) (v2 >> 16), (byte) (v2 >> 8), (byte) v2}; } - public long getFirst() { - return first; + public DLong(byte[] bytes) { + if (bytes == null || bytes.length != 16) throw new NumberFormatException("Not 16 length bytes"); + this.bytes = bytes; } - public long getSecond() { - return second; + public byte[] getBytes() { + return Arrays.copyOf(bytes, bytes.length); } - public boolean equals(long one, long two) { - return this.first == one && this.second == two; + public byte[] directBytes() { + return bytes; + } + + public ByteBuffer putTo(ByteBuffer buffer) { + buffer.put(bytes); + return buffer; + } + + public boolean equals(byte[] bytes) { + return Arrays.equals(this.bytes, bytes); } @Override @@ -37,30 +52,34 @@ public final class DLong extends Number implements Comparable { if (obj == null) return false; if (getClass() != obj.getClass()) return false; final DLong other = (DLong) obj; - return (this.first == other.first && this.second == other.second); + return Arrays.equals(this.bytes, other.bytes); } @Override public int hashCode() { - int hash = 7; - hash = 89 * hash + (int) (this.first ^ (this.first >>> 32)); - hash = 89 * hash + (int) (this.second ^ (this.second >>> 32)); - return hash; + return Arrays.hashCode(bytes); } @Override public String toString() { - return this.first + "_" + this.second; + return new String(Utility.binToHex(bytes)); } @Override public int intValue() { - return (int) longValue(); + return ((bytes[12] & 0xff) << 24) | ((bytes[113] & 0xff) << 16) | ((bytes[14] & 0xff) << 8) | (bytes[15] & 0xff); } @Override public long longValue() { - return first ^ second; + return ((((long) bytes[8] & 0xff) << 56) + | (((long) bytes[9] & 0xff) << 48) + | (((long) bytes[10] & 0xff) << 40) + | (((long) bytes[11] & 0xff) << 32) + | (((long) bytes[12] & 0xff) << 24) + | (((long) bytes[13] & 0xff) << 16) + | (((long) bytes[14] & 0xff) << 8) + | (((long) bytes[15] & 0xff))); } @Override @@ -75,7 +94,11 @@ public final class DLong extends Number implements Comparable { @Override public int compareTo(DLong o) { - return (int) (first == o.first ? (second - o.second) : (first - o.first)); + if (o == null) return 1; + for (int i = 0; i < bytes.length; i++) { + if (this.bytes[i] != o.bytes[i]) return this.bytes[i] - o.bytes[i]; + } + return 0; } } diff --git a/android-jdk6-redkale/src/org/redkale/util/Ignore.java b/android-jdk6-redkale/src/org/redkale/util/Ignore.java new file mode 100644 index 000000000..313952b45 --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/Ignore.java @@ -0,0 +1,28 @@ +/* + * 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.util; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 用于忽略字段、方法或类。使用场景: + * 1、convert功能中被标记为@Ignore的字段或方法会被忽略 + * 2、FilterBean中的被标记为@Ignore的字段会被忽略 + * 3、被标记为@Ignore的Service类不会被自动加载 + * 4、被标记为@Ignore的Servlet类不会被自动加载 + * + * @see http://www.redkale.org + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE, FIELD, METHOD}) +@Retention(RUNTIME) +public @interface Ignore { + +} diff --git a/android-jdk6-redkale/src/org/redkale/util/LogLevel.java b/android-jdk6-redkale/src/org/redkale/util/LogLevel.java new file mode 100644 index 000000000..408ee1414 --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/LogLevel.java @@ -0,0 +1,25 @@ +/* + * 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.util; + +import java.lang.annotation.*; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 被标记的日志级别以上的才会被记录 + * + * @see http://www.redkale.org + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE}) +@Retention(RUNTIME) +public @interface LogLevel { + + String value(); +} diff --git a/android-jdk6-redkale/src/org/redkale/util/Nameable.java b/android-jdk6-redkale/src/org/redkale/util/Nameable.java new file mode 100644 index 000000000..02e6c7821 --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/Nameable.java @@ -0,0 +1,16 @@ +/* + * 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.util; + +/** + * + * @see http://www.redkale.org + * @author zhangjx + */ +public interface Nameable { + + String name(); +} diff --git a/android-jdk6-redkale/src/org/redkale/util/ObjectPool.java b/android-jdk6-redkale/src/org/redkale/util/ObjectPool.java index 8b601f3f3..77a8b260d 100644 --- a/android-jdk6-redkale/src/org/redkale/util/ObjectPool.java +++ b/android-jdk6-redkale/src/org/redkale/util/ObjectPool.java @@ -4,15 +4,16 @@ */ package org.redkale.util; -import org.redkale.util.Creator.Creators; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.function.*; import java.util.logging.*; +import org.redkale.util.Creator.Creators; /** * + * @see http://www.redkale.org * @author zhangjx * @param */ @@ -56,7 +57,7 @@ public final class ObjectPool implements Supplier { this.creator = creator; this.prepare = prepare; this.recycler = recycler; - this.queue = new ArrayBlockingQueue(Math.max(Runtime.getRuntime().availableProcessors() * 2, max)); + this.queue = new LinkedBlockingQueue(Math.max(Runtime.getRuntime().availableProcessors() * 2, max)); this.debug = logger.isLoggable(Level.FINER); } diff --git a/android-jdk6-redkale/src/org/redkale/util/Reproduce.java b/android-jdk6-redkale/src/org/redkale/util/Reproduce.java new file mode 100644 index 000000000..6a2e23b5b --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/Reproduce.java @@ -0,0 +1,135 @@ +package org.redkale.util; + +import java.lang.reflect.Modifier; +import java.util.function.Predicate; +import static org.objectweb.asm.Opcodes.*; +import org.objectweb.asm.*; + +public interface Reproduce { + + public D copy(D dest, S src); + + public static abstract class Reproduces { + + public static Reproduce create(final Class destClass, final Class srcClass) { + return create(destClass, srcClass, null); + } + + @SuppressWarnings("unchecked") + public static Reproduce create(final Class destClass, final Class srcClass, final Predicate columnPredicate) { + // ------------------------------------------------------------------------------ + final String supDynName = Reproduce.class.getName().replace('.', '/'); + final String destName = destClass.getName().replace('.', '/'); + final String srcName = srcClass.getName().replace('.', '/'); + final String destDesc = Type.getDescriptor(destClass); + final String srcDesc = Type.getDescriptor(srcClass); + String newDynName = supDynName + "Dyn_" + destClass.getSimpleName() + "_" + srcClass.getSimpleName(); + ClassLoader loader = Reproduce.class.getClassLoader(); + if (String.class.getClassLoader() != destClass.getClassLoader()) { + loader = destClass.getClassLoader(); + newDynName = destName + "_Dyn" + Reproduce.class.getSimpleName() + "_" + srcClass.getSimpleName(); + } + try { + return (Reproduce) Class.forName(newDynName.replace('/', '.')).newInstance(); + } catch (Exception ex) { + } + // ------------------------------------------------------------------------------ + ClassWriter cw = new ClassWriter(0); + FieldVisitor fv; + MethodVisitor mv; + AnnotationVisitor av0; + + cw.visit(V1_8, ACC_PUBLIC + ACC_FINAL + ACC_SUPER, newDynName, "Ljava/lang/Object;L" + supDynName + "<" + destDesc + srcDesc + ">;", "java/lang/Object", new String[]{supDynName}); + + { // 构造函数 + mv = (cw.visitMethod(ACC_PUBLIC, "", "()V", null, null)); + //mv.setDebug(true); + mv.visitVarInsn(ALOAD, 0); + mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "", "()V", false); + mv.visitInsn(RETURN); + mv.visitMaxs(1, 1); + mv.visitEnd(); + } + { + mv = (cw.visitMethod(ACC_PUBLIC, "copy", "(" + destDesc + srcDesc + ")" + destDesc, null, null)); + //mv.setDebug(true); + + for (java.lang.reflect.Field field : srcClass.getFields()) { + if (Modifier.isStatic(field.getModifiers())) continue; + if (Modifier.isFinal(field.getModifiers())) continue; + if (!Modifier.isPublic(field.getModifiers())) continue; + final String fname = field.getName(); + try { + if (!field.getType().equals(destClass.getField(fname).getType())) continue; + if (!columnPredicate.test(fname)) continue; + } catch (Exception e) { + continue; + } + mv.visitVarInsn(ALOAD, 1); + mv.visitVarInsn(ALOAD, 2); + String td = Type.getDescriptor(field.getType()); + mv.visitFieldInsn(GETFIELD, srcName, fname, td); + mv.visitFieldInsn(PUTFIELD, destName, fname, td); + } + + for (java.lang.reflect.Method getter : srcClass.getMethods()) { + if (Modifier.isStatic(getter.getModifiers())) continue; + if (getter.getParameterCount() > 0) continue; + if ("getClass".equals(getter.getName())) continue; + if (!getter.getName().startsWith("get") && !getter.getName().startsWith("is")) continue; + java.lang.reflect.Method setter; + boolean is = getter.getName().startsWith("is"); + try { + setter = destClass.getMethod(getter.getName().replaceFirst(is ? "is" : "get", "set"), getter.getReturnType()); + if (columnPredicate != null) { + String col = setter.getName().substring(3); + if (col.length() < 2 || Character.isLowerCase(col.charAt(1))) { + char[] cs = col.toCharArray(); + cs[0] = Character.toLowerCase(cs[0]); + col = new String(cs); + } + if (!columnPredicate.test(col)) continue; + } + } catch (Exception e) { + continue; + } + mv.visitVarInsn(ALOAD, 1); + mv.visitVarInsn(ALOAD, 2); + mv.visitMethodInsn(INVOKEVIRTUAL, srcName, getter.getName(), Type.getMethodDescriptor(getter), false); + mv.visitMethodInsn(INVOKEVIRTUAL, destName, setter.getName(), Type.getMethodDescriptor(setter), false); + } + mv.visitVarInsn(ALOAD, 1); + mv.visitInsn(ARETURN); + mv.visitMaxs(3, 3); + mv.visitEnd(); + } + { + mv = (cw.visitMethod(ACC_PUBLIC + ACC_BRIDGE + ACC_SYNTHETIC, "copy", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", null, null)); + //mv.setDebug(true); + mv.visitVarInsn(ALOAD, 0); + mv.visitVarInsn(ALOAD, 1); + mv.visitTypeInsn(CHECKCAST, destName); + mv.visitVarInsn(ALOAD, 2); + mv.visitTypeInsn(CHECKCAST, srcName); + mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "copy", "(" + destDesc + srcDesc + ")" + destDesc, false); + mv.visitInsn(ARETURN); + mv.visitMaxs(3, 3); + mv.visitEnd(); + } + cw.visitEnd(); + // ------------------------------------------------------------------------------ + byte[] bytes = cw.toByteArray(); + Class creatorClazz = new ClassLoader(loader) { + public final Class loadClass(String name, byte[] b) { + return defineClass(name, b, 0, b.length); + } + }.loadClass(newDynName.replace('/', '.'), bytes); + try { + return (Reproduce) creatorClazz.newInstance(); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + } + +} diff --git a/android-jdk6-redkale/src/org/redkale/util/ResourceFactory.java b/android-jdk6-redkale/src/org/redkale/util/ResourceFactory.java new file mode 100644 index 000000000..d3af21809 --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/ResourceFactory.java @@ -0,0 +1,245 @@ +/* + * 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.util; + +import java.lang.reflect.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.logging.*; +import java.util.regex.*; +import javax.annotation.*; + +/** + * 如果Resource(name = "$") 表示资源name采用所属对象的name + * + * @see http://www.redkale.org + * @author zhangjx + */ +@SuppressWarnings("unchecked") +public final class ResourceFactory { + + public static final String RESOURCE_PARENT_NAME = "$"; + + private static final Logger logger = Logger.getLogger(ResourceFactory.class.getSimpleName()); + + private final ResourceFactory parent; + + private static final ResourceFactory instance = new ResourceFactory(null); + + private final ConcurrentHashMap interceptmap = new ConcurrentHashMap(); + + private final ConcurrentHashMap, ConcurrentHashMap> store = new ConcurrentHashMap(); + + private final ConcurrentHashMap> gencstore = new ConcurrentHashMap(); + + private ResourceFactory(ResourceFactory parent) { + this.parent = parent; + } + + public static ResourceFactory root() { + return instance; + } + + public ResourceFactory createChild() { + return new ResourceFactory(this); + } + + public void release() { + this.store.clear(); + } + + public void register(final Class clazz, final Object rs) { + register("", clazz, rs); + } + + public void register(final Object rs) { + if (rs != null) register("", rs.getClass(), rs); + } + + public void add(final Type clazz, final Intercepter rs) { + if (clazz == null || rs == null) return; + interceptmap.put(clazz, rs); + } + + public void register(final String name, final Object rs) { + register(name, rs.getClass(), rs); + } + + public void register(final String name, final Class clazz, final A rs) { + ConcurrentHashMap map = this.store.get(clazz); + if (map == null) { + ConcurrentHashMap sub = new ConcurrentHashMap(); + sub.put(name, rs); + store.put(clazz, sub); + } else { + map.put(name, rs); + } + } + + public void register(final String name, final Type clazz, final A rs) { + if (clazz instanceof Class) { + register(name, (Class) clazz, rs); + return; + } + ConcurrentHashMap map = this.gencstore.get(clazz); + if (map == null) { + ConcurrentHashMap sub = new ConcurrentHashMap(); + sub.put(name, rs); + gencstore.put(clazz, sub); + } else { + map.put(name, rs); + } + } + + public A find(Class clazz) { + return find("", clazz); + } + + public A find(String name, Type clazz) { + Map map = this.gencstore.get(clazz); + if (map != null) { + A rs = (A) map.get(name); + if (rs != null) return rs; + } + if (parent != null) return parent.find(name, clazz); + return null; + } + + public A find(String name, Class clazz) { + Map map = this.store.get(clazz); + if (map != null) { + A rs = (A) map.get(name); + if (rs != null) return rs; + } + if (parent != null) return parent.find(name, clazz); + return null; + } + + public A findChild(final String name, final Class clazz) { + A rs = find(name, clazz); + if (rs != null) return rs; + for (Map.Entry, ConcurrentHashMap> en : this.store.entrySet()) { //不用forEach为兼容JDK 6 + if (!clazz.isAssignableFrom(en.getKey())) continue; + Object v = en.getValue().get(name); + if (v != null) return (A) v; + } + return null; + } + + public Map find(final Pattern reg, Class clazz, A exclude) { + Map result = new LinkedHashMap(); + load(reg, clazz, exclude, result); + return result; + } + + private void load(final Pattern reg, Class clazz, final A exclude, final Map result) { + ConcurrentHashMap map = this.store.get(clazz); + if (map != null) { + for (Map.Entry en : map.entrySet()) { // 不用forEach为兼容JDK 6 + String x = en.getKey(); + Object y = en.getValue(); + if (y != exclude && reg.matcher(x).find() && result.get(x) == null) result.put(x, (A) y); + } + } + if (parent != null) parent.load(reg, clazz, exclude, result); + } + + public boolean inject(final Object src) { + return inject(src, null); + } + + public boolean inject(final Object src, final T attachment) { + return inject(src, attachment, new ArrayList()); + } + + private boolean inject(final Object src, final T attachment, final List list) { + if (src == null) return false; + try { + list.add(src); + Class clazz = src.getClass(); + do { + for (Field field : clazz.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers())) continue; + field.setAccessible(true); + final Class classtype = field.getType(); + final Type genctype = field.getGenericType(); + Resource rc = field.getAnnotation(Resource.class); + if (rc == null) { + boolean flag = true; + Object ns = field.get(src); + for (Object o : list) { + if (o == ns) { + flag = false; + break; + } + } + if (ns == null) continue; + if (ns.getClass().isPrimitive() || ns.getClass().isArray() || ns.getClass().getName().startsWith("java")) continue; + if (flag) this.inject(ns, attachment, list); + continue; + } + if (Modifier.isFinal(field.getModifiers())) continue; + final String rcname = (rc.name().contains(RESOURCE_PARENT_NAME) && src instanceof Nameable) ? rc.name().replace(RESOURCE_PARENT_NAME, ((Nameable) src).name()) : rc.name(); + Object rs = genctype == classtype ? null : find(rcname, genctype); + if (rs == null) { + if (Map.class.isAssignableFrom(classtype)) { + rs = find(Pattern.compile(rcname.isEmpty() ? ".*" : rcname), (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[1], src); + } else if (rcname.startsWith("property.")) { + rs = find(rcname, String.class); + } else { + rs = find(rcname, classtype); + } + } + if (rs == null) { + Intercepter it = findIntercepter(field.getGenericType(), field); + if (it != null) it.invoke(this, src, field, attachment); + continue; + } + if (!rs.getClass().isPrimitive() && classtype.isPrimitive()) { + if (classtype == int.class) { + rs = Integer.decode(rs.toString()); + } else if (classtype == long.class) { + rs = Long.decode(rs.toString()); + } else if (classtype == short.class) { + rs = Short.decode(rs.toString()); + } else if (classtype == boolean.class) { + rs = "true".equalsIgnoreCase(rs.toString()); + } else if (classtype == byte.class) { + rs = Byte.decode(rs.toString()); + } else if (classtype == float.class) { + rs = Float.parseFloat(rs.toString()); + } else if (classtype == double.class) { + rs = Double.parseDouble(rs.toString()); + } + } + field.set(src, rs); + } + } while ((clazz = clazz.getSuperclass()) != Object.class); + return true; + } catch (Exception ex) { + logger.log(Level.FINER, "inject " + src + " error", ex); + return false; + } + } + + private Intercepter findIntercepter(Type ft, Field field) { + Intercepter it = this.interceptmap.get(ft); + if (it != null) return it; + Class c = field.getType(); + for (Map.Entry en : this.interceptmap.entrySet()) { + Type t = en.getKey(); + if (t == ft) return en.getValue(); + if (t instanceof Class && (((Class) t)).isAssignableFrom(c)) return en.getValue(); + } + return parent == null ? null : parent.findIntercepter(ft, field); + } + + public static interface Intercepter { + + public void invoke(ResourceFactory factory, Object src, Field field, Object attachment); + } + +} diff --git a/android-jdk6-redkale/src/org/redkale/util/SelectColumn.java b/android-jdk6-redkale/src/org/redkale/util/SelectColumn.java new file mode 100644 index 000000000..d1ef10ecd --- /dev/null +++ b/android-jdk6-redkale/src/org/redkale/util/SelectColumn.java @@ -0,0 +1,137 @@ +/* + * 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.util; + +import java.util.*; +import java.util.function.*; +import java.util.regex.*; + +/** + * + * @see http://www.redkale.org + * @author zhangjx + */ +public class SelectColumn implements Predicate { + + private Pattern[] patterns; + + private String[] columns; + + private boolean excludable; //是否排除 + + public SelectColumn() { + } + + protected SelectColumn(final String[] columns0, final boolean excludable) { + this.excludable = excludable; + final int len = columns0.length; + if (len < 1) return; + Pattern[] regs = null; + String[] cols = null; + int regcount = 0; + int colcount = 0; + for (String col : columns0) { + boolean reg = false; + for (int i = 0; i < col.length(); i++) { + char ch = col.charAt(i); + if (ch == '^' || ch == '$' || ch == '*' || ch == '?' || ch == '+' || ch == '[' || ch == '(') { + reg = true; + break; + } + } + if (reg) { + if (regs == null) regs = new Pattern[len]; + regs[regcount++] = Pattern.compile(col); + } else { + if (cols == null) cols = new String[len]; + cols[colcount++] = col; + } + } + if (regs != null) { + if (regcount == len) { + this.patterns = regs; + } else { + this.patterns = Arrays.copyOf(regs, regcount); + } + } + if (cols != null) { + if (colcount == len) { + this.columns = cols; + } else { + this.columns = Arrays.copyOf(cols, colcount); + } + } + } + + /** + * class中的字段名 + * + * @param columns + * @return + */ + public static SelectColumn createIncludes(String... columns) { + return new SelectColumn(columns, false); + } + + /** + * class中的字段名 + * + * @param columns + * @return + */ + public static SelectColumn createExcludes(String... columns) { + return new SelectColumn(columns, true); + } + + @Override + public boolean test(final String column) { + if (this.columns != null) { + for (String col : this.columns) { + if (col.equalsIgnoreCase(column)) return !excludable; + } + } + if (this.patterns != null) { + for (Pattern reg : this.patterns) { + if (reg.matcher(column).find()) return !excludable; + } + } + return excludable; + } + + public String[] getColumns() { + return columns; + } + + public void setColumns(String[] columns) { + this.columns = columns; + } + + public boolean isExcludable() { + return excludable; + } + + public void setExcludable(boolean excludable) { + this.excludable = excludable; + } + + public Pattern[] getPatterns() { + return patterns; + } + + public void setPatterns(Pattern[] patterns) { + this.patterns = patterns; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()).append("{excludable=").append(excludable); + if (columns != null) sb.append(", columns=").append(Arrays.toString(columns)); + if (patterns != null) sb.append(", patterns=").append(Arrays.toString(patterns)); + return sb.append('}').toString(); + } + +} diff --git a/android-jdk6-redkale/src/org/redkale/util/Sheet.java b/android-jdk6-redkale/src/org/redkale/util/Sheet.java index 7aeeadae4..cd456cfd9 100644 --- a/android-jdk6-redkale/src/org/redkale/util/Sheet.java +++ b/android-jdk6-redkale/src/org/redkale/util/Sheet.java @@ -8,7 +8,9 @@ package org.redkale.util; import java.util.*; /** + * 页集合。 结构由一个total总数和一个List列表组合而成。 * + * @see http://www.redkale.org * @author zhangjx * @param */ @@ -36,14 +38,15 @@ public class Sheet implements java.io.Serializable { return data == null ? new Sheet() : new Sheet(data.size(), data); } - public void copyTo(Sheet copy) { - if (copy == null) return; + public Sheet copyTo(Sheet copy) { + if (copy == null) return copy; copy.total = this.total; if (this.getRows() != null) { copy.setRows(new ArrayList(this.getRows())); } else { copy.rows = null; } + return copy; } /** diff --git a/android-jdk6-redkale/src/org/redkale/util/TypeToken.java b/android-jdk6-redkale/src/org/redkale/util/TypeToken.java index 38646454e..7c4c48aef 100644 --- a/android-jdk6-redkale/src/org/redkale/util/TypeToken.java +++ b/android-jdk6-redkale/src/org/redkale/util/TypeToken.java @@ -8,7 +8,10 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; /** + * + * 获取泛型的Type类 * + * @see http://www.redkale.org * @author zhangjx * @param */ diff --git a/android-jdk6-redkale/src/org/redkale/util/Utility.java b/android-jdk6-redkale/src/org/redkale/util/Utility.java index 61833c987..e5410b31a 100644 --- a/android-jdk6-redkale/src/org/redkale/util/Utility.java +++ b/android-jdk6-redkale/src/org/redkale/util/Utility.java @@ -5,27 +5,53 @@ package org.redkale.util; import java.io.*; +import java.lang.reflect.Field; import java.net.*; import java.nio.ByteBuffer; import java.nio.charset.*; +import java.time.*; import java.util.*; import javax.net.ssl.*; /** * + * @see http://www.redkale.org * @author zhangjx */ public final class Utility { + private static final int zoneRawOffset = TimeZone.getDefault().getRawOffset(); + private static final String format = "%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%tL"; private static final Charset UTF_8 = Charset.forName("UTF-8"); private static final char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + private static final sun.misc.Unsafe UNSAFE; + + private static final long strvaloffset; + + private static final long sbvaloffset; + private static final javax.net.ssl.SSLContext DEFAULTSSL_CONTEXT; static { + sun.misc.Unsafe usafe = null; + long fd1 = 0L; + long fd2 = 0L; + try { + Field safeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + safeField.setAccessible(true); + usafe = (sun.misc.Unsafe) safeField.get(null); + fd1 = usafe.objectFieldOffset(String.class.getDeclaredField("value")); + fd2 = usafe.objectFieldOffset(StringBuilder.class.getSuperclass().getDeclaredField("value")); + } catch (Exception e) { + throw new RuntimeException(e); //不可能会发生 + } + UNSAFE = usafe; + strvaloffset = fd1; + sbvaloffset = fd2; try { DEFAULTSSL_CONTEXT = javax.net.ssl.SSLContext.getInstance("SSL"); @@ -105,6 +131,76 @@ public final class Utility { return back; } + /** + * 获取当天凌晨零点的格林时间 + * + * @return + */ + public static long midnight() { + return midnight(System.currentTimeMillis()); + } + + /** + * 获取指定时间当天凌晨零点的格林时间 + * + * @param time + * @return + */ + public static long midnight(long time) { + return (time + zoneRawOffset) / 86400000 * 86400000 - zoneRawOffset; + } + + /** + * 获取当天20151231格式的int值 + * + * @return + */ + public static int today() { + java.time.LocalDate today = java.time.LocalDate.now(); + return today.getYear() * 10000 + today.getMonthValue() * 100 + today.getDayOfMonth(); + } + + /** + * 获取时间点所在星期的周一 + * + * @param time + * @return + */ + public static long monday(long time) { + ZoneId zid = ZoneId.systemDefault(); + Instant instant = Instant.ofEpochMilli(time); + LocalDate ld = instant.atZone(zid).toLocalDate(); + ld = ld.minusDays(ld.getDayOfWeek().getValue() - 1); + return ld.atStartOfDay(zid).toInstant().toEpochMilli(); + } + + /** + * 获取时间点所在星期的周日 + * + * @param time + * @return + */ + public static long sunday(long time) { + ZoneId zid = ZoneId.systemDefault(); + Instant instant = Instant.ofEpochMilli(time); + LocalDate ld = instant.atZone(zid).toLocalDate(); + ld = ld.plusDays(7 - ld.getDayOfWeek().getValue()); + return ld.atStartOfDay(zid).toInstant().toEpochMilli(); + } + + /** + * 获取时间点所在月份的1号 + * + * @param time + * @return + */ + public static long monthFirstDay(long time) { + ZoneId zid = ZoneId.systemDefault(); + Instant instant = Instant.ofEpochMilli(time); + LocalDate ld = instant.atZone(zid).toLocalDate().withDayOfMonth(1); + return ld.atStartOfDay(zid).toInstant().toEpochMilli(); + } + public static String binToHexString(byte[] bytes) { return new String(binToHex(bytes)); } @@ -153,6 +249,10 @@ public final class Utility { return bytes; } + public static byte[] hexToBin(String str) { + return hexToBin(charArray(str)); + } + public static byte[] hexToBin(char[] src) { return hexToBin(src, 0, src.length); } @@ -211,7 +311,7 @@ public final class Utility { public static byte[] encodeUTF8(final String value) { if (value == null) return new byte[0]; - return encodeUTF8(value.toCharArray()); + return encodeUTF8((char[]) UNSAFE.getObject(value, strvaloffset)); } public static byte[] encodeUTF8(final char[] array) { @@ -252,14 +352,11 @@ public final class Utility { } public static char[] charArray(String value) { - return value == null ? null : value.toCharArray(); + return value == null ? null : (char[]) UNSAFE.getObject(value, strvaloffset); } public static char[] charArray(StringBuilder value) { - if (value == null) return null; - char[] chs = new char[value.length()]; - value.getChars(0, value.length(), chs, 0); - return chs; + return value == null ? null : (char[]) UNSAFE.getObject(value, sbvaloffset); } public static ByteBuffer encodeUTF8(final ByteBuffer buffer, final char[] array) { @@ -272,7 +369,7 @@ public final class Utility { public static int encodeUTF8Length(String value) { if (value == null) return -1; - return encodeUTF8Length(value.toCharArray()); + return encodeUTF8Length((char[]) UNSAFE.getObject(value, strvaloffset)); } public static int encodeUTF8Length(final char[] text) { @@ -427,7 +524,7 @@ public final class Utility { if (conn instanceof HttpsURLConnection) ((HttpsURLConnection) conn).setSSLSocketFactory((ctx == null ? DEFAULTSSL_CONTEXT : ctx).getSocketFactory()); conn.setRequestMethod(method); if (headers != null) { - for (Map.Entry en : headers.entrySet()) { + for (Map.Entry en : headers.entrySet()) { //不用forEach是为了兼容JDK 6 conn.setRequestProperty(en.getKey(), en.getValue()); } }