diff --git a/README.md b/README.md index af16757..3de5622 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ ### pyLoad Android Client -This is the official Android client for the **pyLoad** Download Manager. You need to have pyLoad running on your pc or server. +This is the official Android client for the **pyLoad-ng** Download Manager. You need to have pyLoad running on your pc or server. In case you don't already have it, download it from https://pyload.net, its free, open-source and available for many platforms. Please report any issues with the client here: https://github.com/pyload/pyload-android/issues -In order to use the Android client make sure the newest pyLoad Core with version 0.4.9 and up is running on your system, accessible over the network, the ip/hostname is correct, and the port forwarded if necessary. +In order to use the Android client make sure the newest pyLoad Core with version 0.5 and up is running on your system, accessible over the network, the ip/hostname is correct, and the port forwarded if necessary. #### Features - Modern UI (Android 4+ components) diff --git a/app/build.gradle b/app/build.gradle index a018ea3..f70007c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,11 +2,10 @@ apply plugin: 'com.android.application' android { compileSdkVersion 30 - buildToolsVersion "30.0.2" defaultConfig { applicationId "org.pyload.android.client" - minSdkVersion 17 + minSdkVersion 21 targetSdkVersion 30 } @@ -18,8 +17,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } } @@ -27,4 +26,10 @@ dependencies { implementation 'androidx.legacy:legacy-support-v4:1.0.0' implementation 'androidx.activity:activity:1.3.0' implementation 'org.slf4j:slf4j-android:1.6.1-RC1' + implementation 'com.squareup.retrofit2:retrofit:2.11.0' + implementation 'com.squareup.retrofit2:converter-gson:2.11.0' + implementation 'com.squareup.retrofit2:converter-scalars:2.11.0' + implementation 'javax.annotation:javax.annotation-api:1.3.2' + implementation 'com.google.code.findbugs:jsr305:3.0.2' + implementation 'io.gsonfire:gson-fire:1.9.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ad2e736..fb65142 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="22" + android:versionName="0.4.0"> @@ -12,6 +12,7 @@ android:name="pyLoadApp" android:icon="@drawable/ic_launcher" android:allowBackup="true" + android:usesCleartextTraffic="true" android:theme="@android:style/Theme.DeviceDefault"> diff --git a/app/src/main/java/org/apache/commons/codec/BinaryDecoder.java b/app/src/main/java/org/apache/commons/codec/BinaryDecoder.java deleted file mode 100644 index 823f04b..0000000 --- a/app/src/main/java/org/apache/commons/codec/BinaryDecoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Defines common decoding methods for byte array decoders. - * - * @author Apache Software Foundation - * @version $Id: BinaryDecoder.java 651573 2008-04-25 11:11:21Z niallp $ - */ -public interface BinaryDecoder extends Decoder { - - /** - * Decodes a byte array and returns the results as a byte array. - * - * @param pArray A byte array which has been encoded with the - * appropriate encoder - * - * @return a byte array that contains decoded content - * - * @throws DecoderException A decoder exception is thrown - * if a Decoder encounters a failure condition during - * the decode process. - */ - byte[] decode(byte[] pArray) throws DecoderException; -} - diff --git a/app/src/main/java/org/apache/commons/codec/BinaryEncoder.java b/app/src/main/java/org/apache/commons/codec/BinaryEncoder.java deleted file mode 100644 index a00e7e4..0000000 --- a/app/src/main/java/org/apache/commons/codec/BinaryEncoder.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Defines common encoding methods for byte array encoders. - * - * @author Apache Software Foundation - * @version $Id: BinaryEncoder.java 651573 2008-04-25 11:11:21Z niallp $ - */ -public interface BinaryEncoder extends Encoder { - - /** - * Encodes a byte array and return the encoded data - * as a byte array. - * - * @param pArray Data to be encoded - * - * @return A byte array containing the encoded data - * - * @throws EncoderException thrown if the Encoder - * encounters a failure condition during the - * encoding process. - */ - byte[] encode(byte[] pArray) throws EncoderException; -} - diff --git a/app/src/main/java/org/apache/commons/codec/CharEncoding.java b/app/src/main/java/org/apache/commons/codec/CharEncoding.java deleted file mode 100644 index cf8136d..0000000 --- a/app/src/main/java/org/apache/commons/codec/CharEncoding.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Character encoding names required of every implementation of the Java platform. - * - * From the Java documentation Standard - * charsets: - *

- * Every implementation of the Java platform is required to support the following character encodings. Consult the - * release documentation for your implementation to see if any other encodings are supported. Consult the release - * documentation for your implementation to see if any other encodings are supported. - *

- * - *
    - *
  • US-ASCII
    - * Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set.
  • - *
  • ISO-8859-1
    - * ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1.
  • - *
  • UTF-8
    - * Eight-bit Unicode Transformation Format.
  • - *
  • UTF-16BE
    - * Sixteen-bit Unicode Transformation Format, big-endian byte order.
  • - *
  • UTF-16LE
    - * Sixteen-bit Unicode Transformation Format, little-endian byte order.
  • - *
  • UTF-16
    - * Sixteen-bit Unicode Transformation Format, byte order specified by a mandatory initial byte-order mark (either order - * accepted on input, big-endian used on output.)
  • - *
- * - * This perhaps would best belong in the [lang] project. Even if a similar interface is defined in [lang], it is not - * forseen that [codec] would be made to depend on [lang]. - * - * @see Standard charsets - * @author Apache Software Foundation - * @since 1.4 - * @version $Id: CharEncoding.java 797857 2009-07-25 23:43:33Z ggregory $ - */ -public class CharEncoding { - /** - * CharEncodingISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1.

- *

- * Every implementation of the Java platform is required to support this character encoding. - *

- * - * @see Standard charsets - */ - public static final String ISO_8859_1 = "ISO-8859-1"; - - /** - *

- * Seven-bit ASCII, also known as ISO646-US, also known as the Basic Latin block of the Unicode character set. - *

- *

- * Every implementation of the Java platform is required to support this character encoding. - *

- * - * @see Standard charsets - */ - public static final String US_ASCII = "US-ASCII"; - - /** - *

- * Sixteen-bit Unicode Transformation Format, The byte order specified by a mandatory initial byte-order mark - * (either order accepted on input, big-endian used on output) - *

- *

- * Every implementation of the Java platform is required to support this character encoding. - *

- * - * @see Standard charsets - */ - public static final String UTF_16 = "UTF-16"; - - /** - *

- * Sixteen-bit Unicode Transformation Format, big-endian byte order. - *

- *

- * Every implementation of the Java platform is required to support this character encoding. - *

- * - * @see Standard charsets - */ - public static final String UTF_16BE = "UTF-16BE"; - - /** - *

- * Sixteen-bit Unicode Transformation Format, little-endian byte order. - *

- *

- * Every implementation of the Java platform is required to support this character encoding. - *

- * - * @see Standard charsets - */ - public static final String UTF_16LE = "UTF-16LE"; - - /** - *

- * Eight-bit Unicode Transformation Format. - *

- *

- * Every implementation of the Java platform is required to support this character encoding. - *

- * - * @see Standard charsets - */ - public static final String UTF_8 = "UTF-8"; -} \ No newline at end of file diff --git a/app/src/main/java/org/apache/commons/codec/Decoder.java b/app/src/main/java/org/apache/commons/codec/Decoder.java deleted file mode 100644 index f24c363..0000000 --- a/app/src/main/java/org/apache/commons/codec/Decoder.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - *

Provides the highest level of abstraction for Decoders. - * This is the sister interface of {@link Encoder}. All - * Decoders implement this common generic interface.

- * - *

Allows a user to pass a generic Object to any Decoder - * implementation in the codec package.

- * - *

One of the two interfaces at the center of the codec package.

- * - * @author Apache Software Foundation - * @version $Id: Decoder.java 797690 2009-07-24 23:28:35Z ggregory $ - */ -public interface Decoder { - - /** - * Decodes an "encoded" Object and returns a "decoded" - * Object. Note that the implementation of this - * interface will try to cast the Object parameter - * to the specific type expected by a particular Decoder - * implementation. If a {@link ClassCastException} occurs - * this decode method will throw a DecoderException. - * - * @param pObject an object to "decode" - * - * @return a 'decoded" object - * - * @throws DecoderException a decoder exception can - * be thrown for any number of reasons. Some good - * candidates are that the parameter passed to this - * method is null, a param cannot be cast to the - * appropriate type for a specific encoder. - */ - Object decode(Object pObject) throws DecoderException; -} - diff --git a/app/src/main/java/org/apache/commons/codec/DecoderException.java b/app/src/main/java/org/apache/commons/codec/DecoderException.java deleted file mode 100644 index 7f04842..0000000 --- a/app/src/main/java/org/apache/commons/codec/DecoderException.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Thrown when a Decoder has encountered a failure condition during a decode. - * - * @author Apache Software Foundation - * @version $Id: DecoderException.java 797804 2009-07-25 17:27:04Z ggregory $ - */ -public class DecoderException extends Exception { - - /** - * Declares the Serial Version Uid. - * - * @see Always Declare Serial Version Uid - */ - private static final long serialVersionUID = 1L; - - /** - * Constructs a new exception with null as its detail message. The cause is not initialized, and may - * subsequently be initialized by a call to {@link #initCause}. - * - * @since 1.4 - */ - public DecoderException() { - super(); - } - - /** - * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently - * be initialized by a call to {@link #initCause}. - * - * @param message - * The detail message which is saved for later retrieval by the {@link #getMessage()} method. - */ - public DecoderException(String message) { - super(message); - } - - /** - * Constructsa new exception with the specified detail message and cause. - * - *

- * Note that the detail message associated with cause is not automatically incorporated into this - * exception's detail message. - *

- * - * @param message - * The detail message which is saved for later retrieval by the {@link #getMessage()} method. - * @param cause - * The cause which is saved for later retrieval by the {@link #getCause()} method. A null - * value is permitted, and indicates that the cause is nonexistent or unknown. - * @since 1.4 - */ - public DecoderException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Constructs a new exception with the specified cause and a detail message of (cause==null ? - * null : cause.toString()) (which typically contains the class and detail message of cause). - * This constructor is useful for exceptions that are little more than wrappers for other throwables. - * - * @param cause - * The cause which is saved for later retrieval by the {@link #getCause()} method. A null - * value is permitted, and indicates that the cause is nonexistent or unknown. - * @since 1.4 - */ - public DecoderException(Throwable cause) { - super(cause); - } -} diff --git a/app/src/main/java/org/apache/commons/codec/Encoder.java b/app/src/main/java/org/apache/commons/codec/Encoder.java deleted file mode 100644 index d152fd0..0000000 --- a/app/src/main/java/org/apache/commons/codec/Encoder.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - *

Provides the highest level of abstraction for Encoders. - * This is the sister interface of {@link Decoder}. Every implementation of - * Encoder provides this common generic interface whic allows a user to pass a - * generic Object to any Encoder implementation in the codec package.

- * - * @author Apache Software Foundation - * @version $Id: Encoder.java 634915 2008-03-08 09:30:25Z bayard $ - */ -public interface Encoder { - - /** - * Encodes an "Object" and returns the encoded content - * as an Object. The Objects here may just be byte[] - * or Strings depending on the implementation used. - * - * @param pObject An object ot encode - * - * @return An "encoded" Object - * - * @throws EncoderException an encoder exception is - * thrown if the encoder experiences a failure - * condition during the encoding process. - */ - Object encode(Object pObject) throws EncoderException; -} - diff --git a/app/src/main/java/org/apache/commons/codec/EncoderException.java b/app/src/main/java/org/apache/commons/codec/EncoderException.java deleted file mode 100644 index 69da07c..0000000 --- a/app/src/main/java/org/apache/commons/codec/EncoderException.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Thrown when there is a failure condition during the encoding process. This exception is thrown when an Encoder - * encounters a encoding specific exception such as invalid data, inability to calculate a checksum, characters outside - * of the expected range. - * - * @author Apache Software Foundation - * @version $Id: EncoderException.java 797804 2009-07-25 17:27:04Z ggregory $ - */ -public class EncoderException extends Exception { - - /** - * Declares the Serial Version Uid. - * - * @see Always Declare Serial Version Uid - */ - private static final long serialVersionUID = 1L; - - /** - * Constructs a new exception with null as its detail message. The cause is not initialized, and may - * subsequently be initialized by a call to {@link #initCause}. - * - * @since 1.4 - */ - public EncoderException() { - super(); - } - - /** - * Constructs a new exception with the specified detail message. The cause is not initialized, and may subsequently - * be initialized by a call to {@link #initCause}. - * - * @param message - * a useful message relating to the encoder specific error. - */ - public EncoderException(String message) { - super(message); - } - - /** - * Constructs a new exception with the specified detail message and cause. - * - *

- * Note that the detail message associated with cause is not automatically incorporated into this - * exception's detail message. - *

- * - * @param message - * The detail message which is saved for later retrieval by the {@link #getMessage()} method. - * @param cause - * The cause which is saved for later retrieval by the {@link #getCause()} method. A null - * value is permitted, and indicates that the cause is nonexistent or unknown. - * @since 1.4 - */ - public EncoderException(String message, Throwable cause) { - super(message, cause); - } - - /** - * Constructs a new exception with the specified cause and a detail message of (cause==null ? - * null : cause.toString()) (which typically contains the class and detail message of cause). - * This constructor is useful for exceptions that are little more than wrappers for other throwables. - * - * @param cause - * The cause which is saved for later retrieval by the {@link #getCause()} method. A null - * value is permitted, and indicates that the cause is nonexistent or unknown. - * @since 1.4 - */ - public EncoderException(Throwable cause) { - super(cause); - } -} diff --git a/app/src/main/java/org/apache/commons/codec/StringDecoder.java b/app/src/main/java/org/apache/commons/codec/StringDecoder.java deleted file mode 100644 index 360d042..0000000 --- a/app/src/main/java/org/apache/commons/codec/StringDecoder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Decodes a String into a String. - * - * @author Apache Software Foundation - * @version $Id: StringDecoder.java 634915 2008-03-08 09:30:25Z bayard $ - */ -public interface StringDecoder extends Decoder { - - /** - * Decodes a String and returns a String. - * - * @param pString a String to encode - * - * @return the encoded String - * - * @throws DecoderException thrown if there is - * an error conidition during the Encoding process. - */ - String decode(String pString) throws DecoderException; -} - diff --git a/app/src/main/java/org/apache/commons/codec/StringEncoder.java b/app/src/main/java/org/apache/commons/codec/StringEncoder.java deleted file mode 100644 index def78ea..0000000 --- a/app/src/main/java/org/apache/commons/codec/StringEncoder.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec; - -/** - * Encodes a String into a String. - * - * @author Apache Software Foundation - * @version $Id: StringEncoder.java 651573 2008-04-25 11:11:21Z niallp $ - */ -public interface StringEncoder extends Encoder { - - /** - * Encodes a String and returns a String. - * - * @param pString a String to encode - * - * @return the encoded String - * - * @throws EncoderException thrown if there is - * an error conidition during the Encoding process. - */ - String encode(String pString) throws EncoderException; -} - diff --git a/app/src/main/java/org/apache/commons/codec/binary/Base64.java b/app/src/main/java/org/apache/commons/codec/binary/Base64.java deleted file mode 100644 index f65c9c7..0000000 --- a/app/src/main/java/org/apache/commons/codec/binary/Base64.java +++ /dev/null @@ -1,1055 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec.binary; - -import java.math.BigInteger; - -import org.apache.commons.codec.BinaryDecoder; -import org.apache.commons.codec.BinaryEncoder; -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.EncoderException; - -/** - * Provides Base64 encoding and decoding as defined by RFC 2045. - * - *

- * This class implements section 6.8. Base64 Content-Transfer-Encoding from RFC 2045 Multipurpose - * Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies by Freed and Borenstein. - *

- *

- * The class can be parameterized in the following manner with various constructors: - *

    - *
  • URL-safe mode: Default off.
  • - *
  • Line length: Default 76. Line length that aren't multiples of 4 will still essentially end up being multiples of - * 4 in the encoded data. - *
  • Line separator: Default is CRLF ("\r\n")
  • - *
- *

- *

- * Since this class operates directly on byte streams, and not character streams, it is hard-coded to only encode/decode - * character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, etc). - *

- * - * @see RFC 2045 - * @author Apache Software Foundation - * @since 1.0 - * @version $Id: Base64.java 801706 2009-08-06 16:27:06Z niallp $ - */ -public class Base64 implements BinaryEncoder, BinaryDecoder { - private static final int DEFAULT_BUFFER_RESIZE_FACTOR = 2; - - private static final int DEFAULT_BUFFER_SIZE = 8192; - - /** - * Chunk size per RFC 2045 section 6.8. - * - *

- * The {@value} character limit does not count the trailing CRLF, but counts all other characters, including any - * equal signs. - *

- * - * @see RFC 2045 section 6.8 - */ - static final int CHUNK_SIZE = 76; - - /** - * Chunk separator per RFC 2045 section 2.1. - * - *

- * N.B. The next major release may break compatibility and make this field private. - *

- * - * @see RFC 2045 section 2.1 - */ - static final byte[] CHUNK_SEPARATOR = {'\r', '\n'}; - - /** - * This array is a lookup table that translates 6-bit positive integer index values into their "Base64 Alphabet" - * equivalents as specified in Table 1 of RFC 2045. - * - * Thanks to "commons" project in ws.apache.org for this code. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - */ - private static final byte[] STANDARD_ENCODE_TABLE = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' - }; - - /** - * This is a copy of the STANDARD_ENCODE_TABLE above, but with + and / - * changed to - and _ to make the encoded Base64 results more URL-SAFE. - * This table is only used when the Base64's mode is set to URL-SAFE. - */ - private static final byte[] URL_SAFE_ENCODE_TABLE = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' - }; - - /** - * Byte used to pad output. - */ - private static final byte PAD = '='; - - /** - * This array is a lookup table that translates Unicode characters drawn from the "Base64 Alphabet" (as specified in - * Table 1 of RFC 2045) into their 6-bit positive integer equivalents. Characters that are not in the Base64 - * alphabet but fall within the bounds of the array are translated to -1. - * - * Note: '+' and '-' both decode to 62. '/' and '_' both decode to 63. This means decoder seamlessly handles both - * URL_SAFE and STANDARD base64. (The encoder, on the other hand, needs to know ahead of time what to emit). - * - * Thanks to "commons" project in ws.apache.org for this code. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - */ - private static final byte[] DECODE_TABLE = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 - }; - - /** Mask used to extract 6 bits, used when encoding */ - private static final int MASK_6BITS = 0x3f; - - /** Mask used to extract 8 bits, used in decoding base64 bytes */ - private static final int MASK_8BITS = 0xff; - - // The static final fields above are used for the original static byte[] methods on Base64. - // The private member fields below are used with the new streaming approach, which requires - // some state be preserved between calls of encode() and decode(). - - /** - * Encode table to use: either STANDARD or URL_SAFE. Note: the DECODE_TABLE above remains static because it is able - * to decode both STANDARD and URL_SAFE streams, but the encodeTable must be a member variable so we can switch - * between the two modes. - */ - private final byte[] encodeTable; - - /** - * Line length for encoding. Not used when decoding. A value of zero or less implies no chunking of the base64 - * encoded data. - */ - private final int lineLength; - - /** - * Line separator for encoding. Not used when decoding. Only used if lineLength > 0. - */ - private final byte[] lineSeparator; - - /** - * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing. - * decodeSize = 3 + lineSeparator.length; - */ - private final int decodeSize; - - /** - * Convenience variable to help us determine when our buffer is going to run out of room and needs resizing. - * encodeSize = 4 + lineSeparator.length; - */ - private final int encodeSize; - - /** - * Buffer for streaming. - */ - private byte[] buffer; - - /** - * Position where next character should be written in the buffer. - */ - private int pos; - - /** - * Position where next character should be read from the buffer. - */ - private int readPos; - - /** - * Variable tracks how many characters have been written to the current line. Only used when encoding. We use it to - * make sure each encoded line never goes beyond lineLength (if lineLength > 0). - */ - private int currentLinePos; - - /** - * Writes to the buffer only occur after every 3 reads when encoding, an every 4 reads when decoding. This variable - * helps track that. - */ - private int modulus; - - /** - * Boolean flag to indicate the EOF has been reached. Once EOF has been reached, this Base64 object becomes useless, - * and must be thrown away. - */ - private boolean eof; - - /** - * Place holder for the 3 bytes we're dealing with for our base64 logic. Bitwise operations store and extract the - * base64 encoding or decoding from this variable. - */ - private int x; - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. - *

- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is STANDARD_ENCODE_TABLE. - *

- * - *

- * When decoding all variants are supported. - *

- */ - public Base64() { - this(false); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in the given URL-safe mode. - *

- * When encoding the line length is 76, the line separator is CRLF, and the encoding table is STANDARD_ENCODE_TABLE. - *

- * - *

- * When decoding all variants are supported. - *

- * - * @param urlSafe - * if true, URL-safe encoding is used. In most cases this should be set to - * false. - * @since 1.4 - */ - public Base64(boolean urlSafe) { - this(CHUNK_SIZE, CHUNK_SEPARATOR, urlSafe); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. - *

- * When encoding the line length is given in the constructor, the line separator is CRLF, and the encoding table is - * STANDARD_ENCODE_TABLE. - *

- *

- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data. - *

- *

- * When decoding all variants are supported. - *

- * - * @param lineLength - * Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4). - * If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding. - * @since 1.4 - */ - public Base64(int lineLength) { - this(lineLength, CHUNK_SEPARATOR); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. - *

- * When encoding the line length and line separator are given in the constructor, and the encoding table is - * STANDARD_ENCODE_TABLE. - *

- *

- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data. - *

- *

- * When decoding all variants are supported. - *

- * - * @param lineLength - * Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4). - * If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding. - * @param lineSeparator - * Each line of encoded data will end with this sequence of bytes. - * @throws IllegalArgumentException - * Thrown when the provided lineSeparator included some base64 characters. - * @since 1.4 - */ - public Base64(int lineLength, byte[] lineSeparator) { - this(lineLength, lineSeparator, false); - } - - /** - * Creates a Base64 codec used for decoding (all modes) and encoding in URL-unsafe mode. - *

- * When encoding the line length and line separator are given in the constructor, and the encoding table is - * STANDARD_ENCODE_TABLE. - *

- *

- * Line lengths that aren't multiples of 4 will still essentially end up being multiples of 4 in the encoded data. - *

- *

- * When decoding all variants are supported. - *

- * - * @param lineLength - * Each line of encoded data will be at most of the given length (rounded down to nearest multiple of 4). - * If lineLength <= 0, then the output will not be divided into lines (chunks). Ignored when decoding. - * @param lineSeparator - * Each line of encoded data will end with this sequence of bytes. - * @param urlSafe - * Instead of emitting '+' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode - * operations. Decoding seamlessly handles both modes. - * @throws IllegalArgumentException - * The provided lineSeparator included some base64 characters. That's not going to work! - * @since 1.4 - */ - public Base64(int lineLength, byte[] lineSeparator, boolean urlSafe) { - if (lineSeparator == null) { - lineLength = 0; // disable chunk-separating - lineSeparator = CHUNK_SEPARATOR; // this just gets ignored - } - this.lineLength = lineLength > 0 ? (lineLength / 4) * 4 : 0; - this.lineSeparator = new byte[lineSeparator.length]; - System.arraycopy(lineSeparator, 0, this.lineSeparator, 0, lineSeparator.length); - if (lineLength > 0) { - this.encodeSize = 4 + lineSeparator.length; - } else { - this.encodeSize = 4; - } - this.decodeSize = this.encodeSize - 1; - if (containsBase64Byte(lineSeparator)) { - String sep = StringUtils.newStringUtf8(lineSeparator); - throw new IllegalArgumentException("lineSeperator must not contain base64 characters: [" + sep + "]"); - } - this.encodeTable = urlSafe ? URL_SAFE_ENCODE_TABLE : STANDARD_ENCODE_TABLE; - } - - /** - * Returns our current encode mode. True if we're URL-SAFE, false otherwise. - * - * @return true if we're in URL-SAFE mode, false otherwise. - * @since 1.4 - */ - public boolean isUrlSafe() { - return this.encodeTable == URL_SAFE_ENCODE_TABLE; - } - - /** - * Returns true if this Base64 object has buffered data for reading. - * - * @return true if there is Base64 object still available for reading. - */ - boolean hasData() { - return this.buffer != null; - } - - /** - * Returns the amount of buffered data available for reading. - * - * @return The amount of buffered data available for reading. - */ - int avail() { - return buffer != null ? pos - readPos : 0; - } - - /** Doubles our buffer. */ - private void resizeBuffer() { - if (buffer == null) { - buffer = new byte[DEFAULT_BUFFER_SIZE]; - pos = 0; - readPos = 0; - } else { - byte[] b = new byte[buffer.length * DEFAULT_BUFFER_RESIZE_FACTOR]; - System.arraycopy(buffer, 0, b, 0, buffer.length); - buffer = b; - } - } - - /** - * Extracts buffered data into the provided byte[] array, starting at position bPos, up to a maximum of bAvail - * bytes. Returns how many bytes were actually extracted. - * - * @param b - * byte[] array to extract the buffered data into. - * @param bPos - * position in byte[] array to start extraction at. - * @param bAvail - * amount of bytes we're allowed to extract. We may extract fewer (if fewer are available). - * @return The number of bytes successfully extracted into the provided byte[] array. - */ - int readResults(byte[] b, int bPos, int bAvail) { - if (buffer != null) { - int len = Math.min(avail(), bAvail); - if (buffer != b) { - System.arraycopy(buffer, readPos, b, bPos, len); - readPos += len; - if (readPos >= pos) { - buffer = null; - } - } else { - // Re-using the original consumer's output array is only - // allowed for one round. - buffer = null; - } - return len; - } - return eof ? -1 : 0; - } - - /** - * Sets the streaming buffer. This is a small optimization where we try to buffer directly to the consumer's output - * array for one round (if the consumer calls this method first) instead of starting our own buffer. - * - * @param out - * byte[] array to buffer directly to. - * @param outPos - * Position to start buffering into. - * @param outAvail - * Amount of bytes available for direct buffering. - */ - void setInitialBuffer(byte[] out, int outPos, int outAvail) { - // We can re-use consumer's original output array under - // special circumstances, saving on some System.arraycopy(). - if (out != null && out.length == outAvail) { - buffer = out; - pos = outPos; - readPos = outPos; - } - } - - /** - *

- * Encodes all of the provided data, starting at inPos, for inAvail bytes. Must be called at least twice: once with - * the data to encode, and once with inAvail set to "-1" to alert encoder that EOF has been reached, so flush last - * remaining bytes (if not multiple of 3). - *

- *

- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - *

- * - * @param in - * byte[] array of binary data to base64 encode. - * @param inPos - * Position to start reading data from. - * @param inAvail - * Amount of bytes available from input for encoding. - */ - void encode(byte[] in, int inPos, int inAvail) { - if (eof) { - return; - } - // inAvail < 0 is how we're informed of EOF in the underlying data we're - // encoding. - if (inAvail < 0) { - eof = true; - if (buffer == null || buffer.length - pos < encodeSize) { - resizeBuffer(); - } - switch (modulus) { - case 1 : - buffer[pos++] = encodeTable[(x >> 2) & MASK_6BITS]; - buffer[pos++] = encodeTable[(x << 4) & MASK_6BITS]; - // URL-SAFE skips the padding to further reduce size. - if (encodeTable == STANDARD_ENCODE_TABLE) { - buffer[pos++] = PAD; - buffer[pos++] = PAD; - } - break; - - case 2 : - buffer[pos++] = encodeTable[(x >> 10) & MASK_6BITS]; - buffer[pos++] = encodeTable[(x >> 4) & MASK_6BITS]; - buffer[pos++] = encodeTable[(x << 2) & MASK_6BITS]; - // URL-SAFE skips the padding to further reduce size. - if (encodeTable == STANDARD_ENCODE_TABLE) { - buffer[pos++] = PAD; - } - break; - } - if (lineLength > 0 && pos > 0) { - System.arraycopy(lineSeparator, 0, buffer, pos, lineSeparator.length); - pos += lineSeparator.length; - } - } else { - for (int i = 0; i < inAvail; i++) { - if (buffer == null || buffer.length - pos < encodeSize) { - resizeBuffer(); - } - modulus = (++modulus) % 3; - int b = in[inPos++]; - if (b < 0) { - b += 256; - } - x = (x << 8) + b; - if (0 == modulus) { - buffer[pos++] = encodeTable[(x >> 18) & MASK_6BITS]; - buffer[pos++] = encodeTable[(x >> 12) & MASK_6BITS]; - buffer[pos++] = encodeTable[(x >> 6) & MASK_6BITS]; - buffer[pos++] = encodeTable[x & MASK_6BITS]; - currentLinePos += 4; - if (lineLength > 0 && lineLength <= currentLinePos) { - System.arraycopy(lineSeparator, 0, buffer, pos, lineSeparator.length); - pos += lineSeparator.length; - currentLinePos = 0; - } - } - } - } - } - - /** - *

- * Decodes all of the provided data, starting at inPos, for inAvail bytes. Should be called at least twice: once - * with the data to decode, and once with inAvail set to "-1" to alert decoder that EOF has been reached. The "-1" - * call is not necessary when decoding, but it doesn't hurt, either. - *

- *

- * Ignores all non-base64 characters. This is how chunked (e.g. 76 character) data is handled, since CR and LF are - * silently ignored, but has implications for other bytes, too. This method subscribes to the garbage-in, - * garbage-out philosophy: it will not check the provided data for validity. - *

- *

- * Thanks to "commons" project in ws.apache.org for the bitwise operations, and general approach. - * http://svn.apache.org/repos/asf/webservices/commons/trunk/modules/util/ - *

- * - * @param in - * byte[] array of ascii data to base64 decode. - * @param inPos - * Position to start reading data from. - * @param inAvail - * Amount of bytes available from input for encoding. - */ - void decode(byte[] in, int inPos, int inAvail) { - if (eof) { - return; - } - if (inAvail < 0) { - eof = true; - } - for (int i = 0; i < inAvail; i++) { - if (buffer == null || buffer.length - pos < decodeSize) { - resizeBuffer(); - } - byte b = in[inPos++]; - if (b == PAD) { - // We're done. - eof = true; - break; - } else { - if (b >= 0 && b < DECODE_TABLE.length) { - int result = DECODE_TABLE[b]; - if (result >= 0) { - modulus = (++modulus) % 4; - x = (x << 6) + result; - if (modulus == 0) { - buffer[pos++] = (byte) ((x >> 16) & MASK_8BITS); - buffer[pos++] = (byte) ((x >> 8) & MASK_8BITS); - buffer[pos++] = (byte) (x & MASK_8BITS); - } - } - } - } - } - - // Two forms of EOF as far as base64 decoder is concerned: actual - // EOF (-1) and first time '=' character is encountered in stream. - // This approach makes the '=' padding characters completely optional. - if (eof && modulus != 0) { - x = x << 6; - switch (modulus) { - case 2 : - x = x << 6; - buffer[pos++] = (byte) ((x >> 16) & MASK_8BITS); - break; - case 3 : - buffer[pos++] = (byte) ((x >> 16) & MASK_8BITS); - buffer[pos++] = (byte) ((x >> 8) & MASK_8BITS); - break; - } - } - } - - /** - * Returns whether or not the octet is in the base 64 alphabet. - * - * @param octet - * The value to test - * @return true if the value is defined in the the base 64 alphabet, false otherwise. - * @since 1.4 - */ - public static boolean isBase64(byte octet) { - return octet == PAD || (octet >= 0 && octet < DECODE_TABLE.length && DECODE_TABLE[octet] != -1); - } - - /** - * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. Currently the - * method treats whitespace as valid. - * - * @param arrayOctet - * byte array to test - * @return true if all bytes are valid characters in the Base64 alphabet or if the byte array is empty; - * false, otherwise - */ - public static boolean isArrayByteBase64(byte[] arrayOctet) { - for (int i = 0; i < arrayOctet.length; i++) { - if (!isBase64(arrayOctet[i]) && !isWhiteSpace(arrayOctet[i])) { - return false; - } - } - return true; - } - - /** - * Tests a given byte array to see if it contains only valid characters within the Base64 alphabet. - * - * @param arrayOctet - * byte array to test - * @return true if any byte is a valid character in the Base64 alphabet; false herwise - */ - private static boolean containsBase64Byte(byte[] arrayOctet) { - for (int i = 0; i < arrayOctet.length; i++) { - if (isBase64(arrayOctet[i])) { - return true; - } - } - return false; - } - - /** - * Encodes binary data using the base64 algorithm but does not chunk the output. - * - * @param binaryData - * binary data to encode - * @return byte[] containing Base64 characters in their UTF-8 representation. - */ - public static byte[] encodeBase64(byte[] binaryData) { - return encodeBase64(binaryData, false); - } - - /** - * Encodes binary data using the base64 algorithm into 76 character blocks separated by CRLF. - * - * @param binaryData - * binary data to encode - * @return String containing Base64 characters. - * @since 1.4 - */ - public static String encodeBase64String(byte[] binaryData) { - return StringUtils.newStringUtf8(encodeBase64(binaryData, true)); - } - - /** - * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The - * url-safe variation emits - and _ instead of + and / characters. - * - * @param binaryData - * binary data to encode - * @return byte[] containing Base64 characters in their UTF-8 representation. - * @since 1.4 - */ - public static byte[] encodeBase64URLSafe(byte[] binaryData) { - return encodeBase64(binaryData, false, true); - } - - /** - * Encodes binary data using a URL-safe variation of the base64 algorithm but does not chunk the output. The - * url-safe variation emits - and _ instead of + and / characters. - * - * @param binaryData - * binary data to encode - * @return String containing Base64 characters - * @since 1.4 - */ - public static String encodeBase64URLSafeString(byte[] binaryData) { - return StringUtils.newStringUtf8(encodeBase64(binaryData, false, true)); - } - - /** - * Encodes binary data using the base64 algorithm and chunks the encoded output into 76 character blocks - * - * @param binaryData - * binary data to encode - * @return Base64 characters chunked in 76 character blocks - */ - public static byte[] encodeBase64Chunked(byte[] binaryData) { - return encodeBase64(binaryData, true); - } - - /** - * Decodes an Object using the base64 algorithm. This method is provided in order to satisfy the requirements of the - * Decoder interface, and will throw a DecoderException if the supplied object is not of type byte[] or String. - * - * @param pObject - * Object to decode - * @return An object (of type byte[]) containing the binary data which corresponds to the byte[] or String supplied. - * @throws DecoderException - * if the parameter supplied is not of type byte[] - */ - public Object decode(Object pObject) throws DecoderException { - if (pObject instanceof byte[]) { - return decode((byte[]) pObject); - } else if (pObject instanceof String) { - return decode((String) pObject); - } else { - throw new DecoderException("Parameter supplied to Base64 decode is not a byte[] or a String"); - } - } - - /** - * Decodes a String containing containing characters in the Base64 alphabet. - * - * @param pArray - * A String containing Base64 character data - * @return a byte array containing binary data - * @since 1.4 - */ - public byte[] decode(String pArray) { - return decode(StringUtils.getBytesUtf8(pArray)); - } - - /** - * Decodes a byte[] containing containing characters in the Base64 alphabet. - * - * @param pArray - * A byte array containing Base64 character data - * @return a byte array containing binary data - */ - public byte[] decode(byte[] pArray) { - reset(); - if (pArray == null || pArray.length == 0) { - return pArray; - } - long len = (pArray.length * 3) / 4; - byte[] buf = new byte[(int) len]; - setInitialBuffer(buf, 0, buf.length); - decode(pArray, 0, pArray.length); - decode(pArray, 0, -1); // Notify decoder of EOF. - - // Would be nice to just return buf (like we sometimes do in the encode - // logic), but we have no idea what the line-length was (could even be - // variable). So we cannot determine ahead of time exactly how big an - // array is necessary. Hence the need to construct a 2nd byte array to - // hold the final result: - - byte[] result = new byte[pos]; - readResults(result, 0, result.length); - return result; - } - - /** - * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks. - * - * @param binaryData - * Array containing binary data to encode. - * @param isChunked - * if true this encoder will chunk the base64 output into 76 character blocks - * @return Base64-encoded data. - * @throws IllegalArgumentException - * Thrown when the input array needs an output array bigger than {@link Integer#MAX_VALUE} - */ - public static byte[] encodeBase64(byte[] binaryData, boolean isChunked) { - return encodeBase64(binaryData, isChunked, false); - } - - /** - * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks. - * - * @param binaryData - * Array containing binary data to encode. - * @param isChunked - * if true this encoder will chunk the base64 output into 76 character blocks - * @param urlSafe - * if true this encoder will emit - and _ instead of the usual + and / characters. - * @return Base64-encoded data. - * @throws IllegalArgumentException - * Thrown when the input array needs an output array bigger than {@link Integer#MAX_VALUE} - * @since 1.4 - */ - public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe) { - return encodeBase64(binaryData, isChunked, urlSafe, Integer.MAX_VALUE); - } - - /** - * Encodes binary data using the base64 algorithm, optionally chunking the output into 76 character blocks. - * - * @param binaryData - * Array containing binary data to encode. - * @param isChunked - * if true this encoder will chunk the base64 output into 76 character blocks - * @param urlSafe - * if true this encoder will emit - and _ instead of the usual + and / characters. - * @param maxResultSize - * The maximum result size to accept. - * @return Base64-encoded data. - * @throws IllegalArgumentException - * Thrown when the input array needs an output array bigger than maxResultSize - * @since 1.4 - */ - public static byte[] encodeBase64(byte[] binaryData, boolean isChunked, boolean urlSafe, int maxResultSize) { - if (binaryData == null || binaryData.length == 0) { - return binaryData; - } - - long len = getEncodeLength(binaryData, CHUNK_SIZE, CHUNK_SEPARATOR); - if (len > maxResultSize) { - throw new IllegalArgumentException("Input array too big, the output array would be bigger (" + - len + - ") than the specified maxium size of " + - maxResultSize); - } - - Base64 b64 = isChunked ? new Base64(urlSafe) : new Base64(0, CHUNK_SEPARATOR, urlSafe); - return b64.encode(binaryData); - } - - /** - * Decodes a Base64 String into octets - * - * @param base64String - * String containing Base64 data - * @return Array containing decoded data. - * @since 1.4 - */ - public static byte[] decodeBase64(String base64String) { - return new Base64().decode(base64String); - } - - /** - * Decodes Base64 data into octets - * - * @param base64Data - * Byte array containing Base64 data - * @return Array containing decoded data. - */ - public static byte[] decodeBase64(byte[] base64Data) { - return new Base64().decode(base64Data); - } - - /** - * Discards any whitespace from a base-64 encoded block. - * - * @param data - * The base-64 encoded data to discard the whitespace from. - * @return The data, less whitespace (see RFC 2045). - * @deprecated This method is no longer needed - */ - static byte[] discardWhitespace(byte[] data) { - byte groomedData[] = new byte[data.length]; - int bytesCopied = 0; - for (int i = 0; i < data.length; i++) { - switch (data[i]) { - case ' ' : - case '\n' : - case '\r' : - case '\t' : - break; - default : - groomedData[bytesCopied++] = data[i]; - } - } - byte packedData[] = new byte[bytesCopied]; - System.arraycopy(groomedData, 0, packedData, 0, bytesCopied); - return packedData; - } - - /** - * Checks if a byte value is whitespace or not. - * - * @param byteToCheck - * the byte to check - * @return true if byte is whitespace, false otherwise - */ - private static boolean isWhiteSpace(byte byteToCheck) { - switch (byteToCheck) { - case ' ' : - case '\n' : - case '\r' : - case '\t' : - return true; - default : - return false; - } - } - - // Implementation of the Encoder Interface - - /** - * Encodes an Object using the base64 algorithm. This method is provided in order to satisfy the requirements of the - * Encoder interface, and will throw an EncoderException if the supplied object is not of type byte[]. - * - * @param pObject - * Object to encode - * @return An object (of type byte[]) containing the base64 encoded data which corresponds to the byte[] supplied. - * @throws EncoderException - * if the parameter supplied is not of type byte[] - */ - public Object encode(Object pObject) throws EncoderException { - if (!(pObject instanceof byte[])) { - throw new EncoderException("Parameter supplied to Base64 encode is not a byte[]"); - } - return encode((byte[]) pObject); - } - - /** - * Encodes a byte[] containing binary data, into a String containing characters in the Base64 alphabet. - * - * @param pArray - * a byte array containing binary data - * @return A String containing only Base64 character data - * @since 1.4 - */ - public String encodeToString(byte[] pArray) { - return StringUtils.newStringUtf8(encode(pArray)); - } - - /** - * Encodes a byte[] containing binary data, into a byte[] containing characters in the Base64 alphabet. - * - * @param pArray - * a byte array containing binary data - * @return A byte array containing only Base64 character data - */ - public byte[] encode(byte[] pArray) { - reset(); - if (pArray == null || pArray.length == 0) { - return pArray; - } - long len = getEncodeLength(pArray, lineLength, lineSeparator); - byte[] buf = new byte[(int) len]; - setInitialBuffer(buf, 0, buf.length); - encode(pArray, 0, pArray.length); - encode(pArray, 0, -1); // Notify encoder of EOF. - // Encoder might have resized, even though it was unnecessary. - if (buffer != buf) { - readResults(buf, 0, buf.length); - } - // In URL-SAFE mode we skip the padding characters, so sometimes our - // final length is a bit smaller. - if (isUrlSafe() && pos < buf.length) { - byte[] smallerBuf = new byte[pos]; - System.arraycopy(buf, 0, smallerBuf, 0, pos); - buf = smallerBuf; - } - return buf; - } - - /** - * Pre-calculates the amount of space needed to base64-encode the supplied array. - * - * @param pArray byte[] array which will later be encoded - * @param chunkSize line-length of the output (<= 0 means no chunking) between each - * chunkSeparator (e.g. CRLF). - * @param chunkSeparator the sequence of bytes used to separate chunks of output (e.g. CRLF). - * - * @return amount of space needed to encoded the supplied array. Returns - * a long since a max-len array will require Integer.MAX_VALUE + 33%. - */ - private static long getEncodeLength(byte[] pArray, int chunkSize, byte[] chunkSeparator) { - // base64 always encodes to multiples of 4. - chunkSize = (chunkSize / 4) * 4; - - long len = (pArray.length * 4) / 3; - long mod = len % 4; - if (mod != 0) { - len += 4 - mod; - } - if (chunkSize > 0) { - boolean lenChunksPerfectly = len % chunkSize == 0; - len += (len / chunkSize) * chunkSeparator.length; - if (!lenChunksPerfectly) { - len += chunkSeparator.length; - } - } - return len; - } - - // Implementation of integer encoding used for crypto - /** - * Decodes a byte64-encoded integer according to crypto standards such as W3C's XML-Signature - * - * @param pArray - * a byte array containing base64 character data - * @return A BigInteger - * @since 1.4 - */ - public static BigInteger decodeInteger(byte[] pArray) { - return new BigInteger(1, decodeBase64(pArray)); - } - - /** - * Encodes to a byte64-encoded integer according to crypto standards such as W3C's XML-Signature - * - * @param bigInt - * a BigInteger - * @return A byte array containing base64 character data - * @throws NullPointerException - * if null is passed in - * @since 1.4 - */ - public static byte[] encodeInteger(BigInteger bigInt) { - if (bigInt == null) { - throw new NullPointerException("encodeInteger called with null parameter"); - } - return encodeBase64(toIntegerBytes(bigInt), false); - } - - /** - * Returns a byte-array representation of a BigInteger without sign bit. - * - * @param bigInt - * BigInteger to be converted - * @return a byte array representation of the BigInteger parameter - */ - static byte[] toIntegerBytes(BigInteger bigInt) { - int bitlen = bigInt.bitLength(); - // round bitlen - bitlen = ((bitlen + 7) >> 3) << 3; - byte[] bigBytes = bigInt.toByteArray(); - - if (((bigInt.bitLength() % 8) != 0) && (((bigInt.bitLength() / 8) + 1) == (bitlen / 8))) { - return bigBytes; - } - // set up params for copying everything but sign bit - int startSrc = 0; - int len = bigBytes.length; - - // if bigInt is exactly byte-aligned, just skip signbit in copy - if ((bigInt.bitLength() % 8) == 0) { - startSrc = 1; - len--; - } - int startDst = bitlen / 8 - len; // to pad w/ nulls as per spec - byte[] resizedBytes = new byte[bitlen / 8]; - System.arraycopy(bigBytes, startSrc, resizedBytes, startDst, len); - return resizedBytes; - } - - /** - * Resets this Base64 object to its initial newly constructed state. - */ - private void reset() { - buffer = null; - pos = 0; - readPos = 0; - currentLinePos = 0; - modulus = 0; - eof = false; - } - -} diff --git a/app/src/main/java/org/apache/commons/codec/binary/Base64InputStream.java b/app/src/main/java/org/apache/commons/codec/binary/Base64InputStream.java deleted file mode 100644 index 0f1cfe8..0000000 --- a/app/src/main/java/org/apache/commons/codec/binary/Base64InputStream.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec.binary; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides Base64 encoding and decoding in a streaming fashion (unlimited size). When encoding the default lineLength - * is 76 characters and the default lineEnding is CRLF, but these can be overridden by using the appropriate - * constructor. - *

- * The default behaviour of the Base64InputStream is to DECODE, whereas the default behaviour of the Base64OutputStream - * is to ENCODE, but this behaviour can be overridden by using a different constructor. - *

- *

- * This class implements section 6.8. Base64 Content-Transfer-Encoding from RFC 2045 Multipurpose - * Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies by Freed and Borenstein. - *

- *

- * Since this class operates directly on byte streams, and not character streams, it is hard-coded to only encode/decode - * character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, etc). - *

- * - * @author Apache Software Foundation - * @version $Id: Base64InputStream.java 799805 2009-08-01 04:33:05Z ggregory $ - * @see RFC 2045 - * @since 1.4 - */ -public class Base64InputStream extends FilterInputStream { - - private final boolean doEncode; - - private final Base64 base64; - - private final byte[] singleByte = new byte[1]; - - /** - * Creates a Base64InputStream such that all data read is Base64-decoded from the original provided InputStream. - * - * @param in - * InputStream to wrap. - */ - public Base64InputStream(InputStream in) { - this(in, false); - } - - /** - * Creates a Base64InputStream such that all data read is either Base64-encoded or Base64-decoded from the original - * provided InputStream. - * - * @param in - * InputStream to wrap. - * @param doEncode - * true if we should encode all data read from us, false if we should decode. - */ - public Base64InputStream(InputStream in, boolean doEncode) { - super(in); - this.doEncode = doEncode; - this.base64 = new Base64(); - } - - /** - * Creates a Base64InputStream such that all data read is either Base64-encoded or Base64-decoded from the original - * provided InputStream. - * - * @param in - * InputStream to wrap. - * @param doEncode - * true if we should encode all data read from us, false if we should decode. - * @param lineLength - * If doEncode is true, each line of encoded data will contain lineLength characters (rounded down to - * nearest multiple of 4). If lineLength <=0, the encoded data is not divided into lines. If doEncode is - * false, lineLength is ignored. - * @param lineSeparator - * If doEncode is true, each line of encoded data will be terminated with this byte sequence (e.g. \r\n). - * If lineLength <= 0, the lineSeparator is not used. If doEncode is false lineSeparator is ignored. - */ - public Base64InputStream(InputStream in, boolean doEncode, int lineLength, byte[] lineSeparator) { - super(in); - this.doEncode = doEncode; - this.base64 = new Base64(lineLength, lineSeparator); - } - - /** - * Reads one byte from this input stream. - * - * @return the byte as an integer in the range 0 to 255. Returns -1 if EOF has been reached. - * @throws IOException - * if an I/O error occurs. - */ - public int read() throws IOException { - int r = read(singleByte, 0, 1); - while (r == 0) { - r = read(singleByte, 0, 1); - } - if (r > 0) { - return singleByte[0] < 0 ? 256 + singleByte[0] : singleByte[0]; - } - return -1; - } - - /** - * Attempts to read len bytes into the specified b array starting at offset - * from this InputStream. - * - * @param b - * destination byte array - * @param offset - * where to start writing the bytes - * @param len - * maximum number of bytes to read - * - * @return number of bytes read - * @throws IOException - * if an I/O error occurs. - * @throws NullPointerException - * if the byte array parameter is null - * @throws IndexOutOfBoundsException - * if offset, len or buffer size are invalid - */ - public int read(byte b[], int offset, int len) throws IOException { - if (b == null) { - throw new NullPointerException(); - } else if (offset < 0 || len < 0) { - throw new IndexOutOfBoundsException(); - } else if (offset > b.length || offset + len > b.length) { - throw new IndexOutOfBoundsException(); - } else if (len == 0) { - return 0; - } else { - if (!base64.hasData()) { - byte[] buf = new byte[doEncode ? 4096 : 8192]; - int c = in.read(buf); - // A little optimization to avoid System.arraycopy() - // when possible. - if (c > 0 && b.length == len) { - base64.setInitialBuffer(b, offset, len); - } - if (doEncode) { - base64.encode(buf, 0, c); - } else { - base64.decode(buf, 0, c); - } - } - return base64.readResults(b, offset, len); - } - } - - /** - * {@inheritDoc} - * - * @return false - */ - public boolean markSupported() { - return false; // not an easy job to support marks - } -} diff --git a/app/src/main/java/org/apache/commons/codec/binary/Base64OutputStream.java b/app/src/main/java/org/apache/commons/codec/binary/Base64OutputStream.java deleted file mode 100644 index b4c0d20..0000000 --- a/app/src/main/java/org/apache/commons/codec/binary/Base64OutputStream.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec.binary; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; - -/** - * Provides Base64 encoding and decoding in a streaming fashion (unlimited size). When encoding the default lineLength - * is 76 characters and the default lineEnding is CRLF, but these can be overridden by using the appropriate - * constructor. - *

- * The default behaviour of the Base64OutputStream is to ENCODE, whereas the default behaviour of the Base64InputStream - * is to DECODE. But this behaviour can be overridden by using a different constructor. - *

- *

- * This class implements section 6.8. Base64 Content-Transfer-Encoding from RFC 2045 Multipurpose - * Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies by Freed and Borenstein. - *

- *

- * Since this class operates directly on byte streams, and not character streams, it is hard-coded to only encode/decode - * character encodings which are compatible with the lower 127 ASCII chart (ISO-8859-1, Windows-1252, UTF-8, etc). - *

- * - * @author Apache Software Foundation - * @version $Id: Base64OutputStream.java 799806 2009-08-01 04:33:17Z ggregory $ - * @see RFC 2045 - * @since 1.4 - */ -public class Base64OutputStream extends FilterOutputStream { - private final boolean doEncode; - - private final Base64 base64; - - private final byte[] singleByte = new byte[1]; - - /** - * Creates a Base64OutputStream such that all data written is Base64-encoded to the original provided OutputStream. - * - * @param out - * OutputStream to wrap. - */ - public Base64OutputStream(OutputStream out) { - this(out, true); - } - - /** - * Creates a Base64OutputStream such that all data written is either Base64-encoded or Base64-decoded to the - * original provided OutputStream. - * - * @param out - * OutputStream to wrap. - * @param doEncode - * true if we should encode all data written to us, false if we should decode. - */ - public Base64OutputStream(OutputStream out, boolean doEncode) { - super(out); - this.doEncode = doEncode; - this.base64 = new Base64(); - } - - /** - * Creates a Base64OutputStream such that all data written is either Base64-encoded or Base64-decoded to the - * original provided OutputStream. - * - * @param out - * OutputStream to wrap. - * @param doEncode - * true if we should encode all data written to us, false if we should decode. - * @param lineLength - * If doEncode is true, each line of encoded data will contain lineLength characters (rounded down to - * nearest multiple of 4). If lineLength <=0, the encoded data is not divided into lines. If doEncode is - * false, lineLength is ignored. - * @param lineSeparator - * If doEncode is true, each line of encoded data will be terminated with this byte sequence (e.g. \r\n). - * If lineLength <= 0, the lineSeparator is not used. If doEncode is false lineSeparator is ignored. - */ - public Base64OutputStream(OutputStream out, boolean doEncode, int lineLength, byte[] lineSeparator) { - super(out); - this.doEncode = doEncode; - this.base64 = new Base64(lineLength, lineSeparator); - } - - /** - * Writes the specified byte to this output stream. - * - * @param i - * source byte - * @throws IOException - * if an I/O error occurs. - */ - public void write(int i) throws IOException { - singleByte[0] = (byte) i; - write(singleByte, 0, 1); - } - - /** - * Writes len bytes from the specified b array starting at offset to this - * output stream. - * - * @param b - * source byte array - * @param offset - * where to start reading the bytes - * @param len - * maximum number of bytes to write - * - * @throws IOException - * if an I/O error occurs. - * @throws NullPointerException - * if the byte array parameter is null - * @throws IndexOutOfBoundsException - * if offset, len or buffer size are invalid - */ - public void write(byte b[], int offset, int len) throws IOException { - if (b == null) { - throw new NullPointerException(); - } else if (offset < 0 || len < 0) { - throw new IndexOutOfBoundsException(); - } else if (offset > b.length || offset + len > b.length) { - throw new IndexOutOfBoundsException(); - } else if (len > 0) { - if (doEncode) { - base64.encode(b, offset, len); - } else { - base64.decode(b, offset, len); - } - flush(false); - } - } - - /** - * Flushes this output stream and forces any buffered output bytes to be written out to the stream. If propogate is - * true, the wrapped stream will also be flushed. - * - * @param propogate - * boolean flag to indicate whether the wrapped OutputStream should also be flushed. - * @throws IOException - * if an I/O error occurs. - */ - private void flush(boolean propogate) throws IOException { - int avail = base64.avail(); - if (avail > 0) { - byte[] buf = new byte[avail]; - int c = base64.readResults(buf, 0, avail); - if (c > 0) { - out.write(buf, 0, c); - } - } - if (propogate) { - out.flush(); - } - } - - /** - * Flushes this output stream and forces any buffered output bytes to be written out to the stream. - * - * @throws IOException - * if an I/O error occurs. - */ - public void flush() throws IOException { - flush(true); - } - - /** - * Closes this output stream and releases any system resources associated with the stream. - * - * @throws IOException - * if an I/O error occurs. - */ - public void close() throws IOException { - // Notify encoder of EOF (-1). - if (doEncode) { - base64.encode(singleByte, 0, -1); - } else { - base64.decode(singleByte, 0, -1); - } - flush(); - out.close(); - } - -} diff --git a/app/src/main/java/org/apache/commons/codec/binary/StringUtils.java b/app/src/main/java/org/apache/commons/codec/binary/StringUtils.java deleted file mode 100644 index 0d1a752..0000000 --- a/app/src/main/java/org/apache/commons/codec/binary/StringUtils.java +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.commons.codec.binary; - -import java.io.UnsupportedEncodingException; - -import org.apache.commons.codec.CharEncoding; - -/** - * Converts String to and from bytes using the encodings required by the Java specification. These encodings are specified in Standard charsets - * - * @see CharEncoding - * @see Standard charsets - * @author Gary Gregory - * @version $Id: StringUtils.java 801391 2009-08-05 19:55:54Z ggregory $ - * @since 1.4 - */ -public class StringUtils { - - /** - * Encodes the given string into a sequence of bytes using the ISO-8859-1 charset, storing the result into a new - * byte array. - * - * @param string - * the String to encode - * @return encoded bytes - * @throws IllegalStateException - * Thrown when the charset is missing, which should be never according the the Java specification. - * @see Standard charsets - * @see #getBytesUnchecked(String, String) - */ - public static byte[] getBytesIso8859_1(String string) { - return StringUtils.getBytesUnchecked(string, CharEncoding.ISO_8859_1); - } - - /** - * Encodes the given string into a sequence of bytes using the US-ASCII charset, storing the result into a new byte - * array. - * - * @param string - * the String to encode - * @return encoded bytes - * @throws IllegalStateException - * Thrown when the charset is missing, which should be never according the the Java specification. - * @see Standard charsets - * @see #getBytesUnchecked(String, String) - */ - public static byte[] getBytesUsAscii(String string) { - return StringUtils.getBytesUnchecked(string, CharEncoding.US_ASCII); - } - - /** - * Encodes the given string into a sequence of bytes using the UTF-16 charset, storing the result into a new byte - * array. - * - * @param string - * the String to encode - * @return encoded bytes - * @throws IllegalStateException - * Thrown when the charset is missing, which should be never according the the Java specification. - * @see Standard charsets - * @see #getBytesUnchecked(String, String) - */ - public static byte[] getBytesUtf16(String string) { - return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16); - } - - /** - * Encodes the given string into a sequence of bytes using the UTF-16BE charset, storing the result into a new byte - * array. - * - * @param string - * the String to encode - * @return encoded bytes - * @throws IllegalStateException - * Thrown when the charset is missing, which should be never according the the Java specification. - * @see Standard charsets - * @see #getBytesUnchecked(String, String) - */ - public static byte[] getBytesUtf16Be(String string) { - return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16BE); - } - - /** - * Encodes the given string into a sequence of bytes using the UTF-16LE charset, storing the result into a new byte - * array. - * - * @param string - * the String to encode - * @return encoded bytes - * @throws IllegalStateException - * Thrown when the charset is missing, which should be never according the the Java specification. - * @see Standard charsets - * @see #getBytesUnchecked(String, String) - */ - public static byte[] getBytesUtf16Le(String string) { - return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_16LE); - } - - /** - * Encodes the given string into a sequence of bytes using the UTF-8 charset, storing the result into a new byte - * array. - * - * @param string - * the String to encode - * @return encoded bytes - * @throws IllegalStateException - * Thrown when the charset is missing, which should be never according the the Java specification. - * @see Standard charsets - * @see #getBytesUnchecked(String, String) - */ - public static byte[] getBytesUtf8(String string) { - return StringUtils.getBytesUnchecked(string, CharEncoding.UTF_8); - } - - /** - * Encodes the given string into a sequence of bytes using the named charset, storing the result into a new byte - * array. - *

- * This method catches {@link UnsupportedEncodingException} and rethrows it as {@link IllegalStateException}, which - * should never happen for a required charset name. Use this method when the encoding is required to be in the JRE. - *

- * - * @param string - * the String to encode - * @param charsetName - * The name of a required {@link java.nio.charset.Charset} - * @return encoded bytes - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen for a - * required charset name. - * @see CharEncoding - * @see String#getBytes(String) - */ - public static byte[] getBytesUnchecked(String string, String charsetName) { - if (string == null) { - return null; - } - try { - return string.getBytes(charsetName); - } catch (UnsupportedEncodingException e) { - throw StringUtils.newIllegalStateException(charsetName, e); - } - } - - private static IllegalStateException newIllegalStateException(String charsetName, UnsupportedEncodingException e) { - return new IllegalStateException(charsetName + ": " + e); - } - - /** - * Constructs a new String by decoding the specified array of bytes using the given charset. - *

- * This method catches {@link UnsupportedEncodingException} and re-throws it as {@link IllegalStateException}, which - * should never happen for a required charset name. Use this method when the encoding is required to be in the JRE. - *

- * - * @param bytes - * The bytes to be decoded into characters - * @param charsetName - * The name of a required {@link java.nio.charset.Charset} - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen for a - * required charset name. - * @see CharEncoding - * @see String#String(byte[], String) - */ - public static String newString(byte[] bytes, String charsetName) { - if (bytes == null) { - return null; - } - try { - return new String(bytes, charsetName); - } catch (UnsupportedEncodingException e) { - throw StringUtils.newIllegalStateException(charsetName, e); - } - } - - /** - * Constructs a new String by decoding the specified array of bytes using the ISO-8859-1 charset. - * - * @param bytes - * The bytes to be decoded into characters - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the - * charset is required. - */ - public static String newStringIso8859_1(byte[] bytes) { - return StringUtils.newString(bytes, CharEncoding.ISO_8859_1); - } - - /** - * Constructs a new String by decoding the specified array of bytes using the US-ASCII charset. - * - * @param bytes - * The bytes to be decoded into characters - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the - * charset is required. - */ - public static String newStringUsAscii(byte[] bytes) { - return StringUtils.newString(bytes, CharEncoding.US_ASCII); - } - - /** - * Constructs a new String by decoding the specified array of bytes using the UTF-16 charset. - * - * @param bytes - * The bytes to be decoded into characters - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the - * charset is required. - */ - public static String newStringUtf16(byte[] bytes) { - return StringUtils.newString(bytes, CharEncoding.UTF_16); - } - - /** - * Constructs a new String by decoding the specified array of bytes using the UTF-16BE charset. - * - * @param bytes - * The bytes to be decoded into characters - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the - * charset is required. - */ - public static String newStringUtf16Be(byte[] bytes) { - return StringUtils.newString(bytes, CharEncoding.UTF_16BE); - } - - /** - * Constructs a new String by decoding the specified array of bytes using the UTF-16LE charset. - * - * @param bytes - * The bytes to be decoded into characters - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the - * charset is required. - */ - public static String newStringUtf16Le(byte[] bytes) { - return StringUtils.newString(bytes, CharEncoding.UTF_16LE); - } - - /** - * Constructs a new String by decoding the specified array of bytes using the UTF-8 charset. - * - * @param bytes - * The bytes to be decoded into characters - * @return A new String decoded from the specified array of bytes using the given charset. - * @throws IllegalStateException - * Thrown when a {@link UnsupportedEncodingException} is caught, which should never happen since the - * charset is required. - */ - public static String newStringUtf8(byte[] bytes) { - return StringUtils.newString(bytes, CharEncoding.UTF_8); - } - -} diff --git a/app/src/main/java/org/apache/commons/lang/NotImplementedException.java b/app/src/main/java/org/apache/commons/lang/NotImplementedException.java deleted file mode 100644 index d1d397b..0000000 --- a/app/src/main/java/org/apache/commons/lang/NotImplementedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.apache.commons.lang; - -public class NotImplementedException extends UnsupportedOperationException { - - /** - * - */ - private static final long serialVersionUID = -4502410745294068699L; - -} diff --git a/app/src/main/java/org/apache/thrift/EncodingUtils.java b/app/src/main/java/org/apache/thrift/EncodingUtils.java deleted file mode 100644 index 072de93..0000000 --- a/app/src/main/java/org/apache/thrift/EncodingUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -/** - * Utility methods for use when encoding/decoding raw data as byte arrays. - */ -public class EncodingUtils { - - /** - * Encode integer as a series of 4 bytes into buf - * starting at position 0 within that buffer. - * - * @param integer - * The integer to encode. - * @param buf - * The buffer to write to. - */ - public static final void encodeBigEndian(final int integer, final byte[] buf) { - encodeBigEndian(integer, buf, 0); - } - - /** - * Encode integer as a series of 4 bytes into buf - * starting at position offset. - * - * @param integer - * The integer to encode. - * @param buf - * The buffer to write to. - * @param offset - * The offset within buf to start the encoding. - */ - public static final void encodeBigEndian(final int integer, final byte[] buf, int offset) { - buf[offset] = (byte) (0xff & (integer >> 24)); - buf[offset + 1] = (byte) (0xff & (integer >> 16)); - buf[offset + 2] = (byte) (0xff & (integer >> 8)); - buf[offset + 3] = (byte) (0xff & (integer)); - } - - /** - * Decode a series of 4 bytes from buf, starting at position 0, - * and interpret them as an integer. - * - * @param buf - * The buffer to read from. - * @return An integer, as read from the buffer. - */ - public static final int decodeBigEndian(final byte[] buf) { - return decodeBigEndian(buf, 0); - } - - /** - * Decode a series of 4 bytes from buf, start at - * offset, and interpret them as an integer. - * - * @param buf - * The buffer to read from. - * @param offset - * The offset with buf to start the decoding. - * @return An integer, as read from the buffer. - */ - public static final int decodeBigEndian(final byte[] buf, int offset) { - return ((buf[offset] & 0xff) << 24) | ((buf[offset + 1] & 0xff) << 16) - | ((buf[offset + 2] & 0xff) << 8) | ((buf[offset + 3] & 0xff)); - } - -} diff --git a/app/src/main/java/org/apache/thrift/ProcessFunction.java b/app/src/main/java/org/apache/thrift/ProcessFunction.java deleted file mode 100644 index e0cdc7b..0000000 --- a/app/src/main/java/org/apache/thrift/ProcessFunction.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * - */ -package org.apache.thrift; - -import org.apache.thrift.protocol.TMessage; -import org.apache.thrift.protocol.TMessageType; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolException; - -public abstract class ProcessFunction { - private final String methodName; - - public ProcessFunction(String methodName) { - this.methodName = methodName; - } - - public final void process(int seqid, TProtocol iprot, TProtocol oprot, I iface) throws TException { - T args = getEmptyArgsInstance(); - try { - args.read(iprot); - } catch (TProtocolException e) { - iprot.readMessageEnd(); - TApplicationException x = new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage()); - oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid)); - x.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); - return; - } - iprot.readMessageEnd(); - TBase result = getResult(iface, args); - oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.REPLY, seqid)); - result.write(oprot); - oprot.writeMessageEnd(); - oprot.getTransport().flush(); - } - - protected abstract TBase getResult(I iface, T args) throws TException; - - protected abstract T getEmptyArgsInstance(); - - public String getMethodName() { - return methodName; - } -} \ No newline at end of file diff --git a/app/src/main/java/org/apache/thrift/ShortStack.java b/app/src/main/java/org/apache/thrift/ShortStack.java deleted file mode 100644 index 4957d1c..0000000 --- a/app/src/main/java/org/apache/thrift/ShortStack.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift; - -/** - * ShortStack is a short-specific Stack implementation written for the express - * purpose of very fast operations on TCompactProtocol's field id stack. This - * implementation performs at least 10x faster than java.util.Stack. - */ -public class ShortStack { - - private short[] vector; - private int top = -1; - - public ShortStack(int initialCapacity) { - vector = new short[initialCapacity]; - } - - public short pop() { - return vector[top--]; - } - - public void push(short pushed) { - if (vector.length == top + 1) { - grow(); - } - vector[++top] = pushed; - } - - private void grow() { - short[] newVector = new short[vector.length * 2]; - System.arraycopy(vector, 0, newVector, 0, vector.length); - vector = newVector; - } - - public short peek() { - return vector[top]; - } - - public void clear() { - top = -1; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append(">"); - } - - sb.append(vector[i]); - - if (i == top) { - sb.append("<<"); - } - } - sb.append("]>"); - return sb.toString(); - } -} diff --git a/app/src/main/java/org/apache/thrift/TApplicationException.java b/app/src/main/java/org/apache/thrift/TApplicationException.java deleted file mode 100644 index c294fc3..0000000 --- a/app/src/main/java/org/apache/thrift/TApplicationException.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import org.apache.thrift.protocol.TField; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolUtil; -import org.apache.thrift.protocol.TStruct; -import org.apache.thrift.protocol.TType; - -/** - * Application level exception - * - */ -public class TApplicationException extends TException { - - private static final TStruct TAPPLICATION_EXCEPTION_STRUCT = new TStruct("TApplicationException"); - private static final TField MESSAGE_FIELD = new TField("message", TType.STRING, (short)1); - private static final TField TYPE_FIELD = new TField("type", TType.I32, (short)2); - - private static final long serialVersionUID = 1L; - - public static final int UNKNOWN = 0; - public static final int UNKNOWN_METHOD = 1; - public static final int INVALID_MESSAGE_TYPE = 2; - public static final int WRONG_METHOD_NAME = 3; - public static final int BAD_SEQUENCE_ID = 4; - public static final int MISSING_RESULT = 5; - public static final int INTERNAL_ERROR = 6; - public static final int PROTOCOL_ERROR = 7; - - protected int type_ = UNKNOWN; - - public TApplicationException() { - super(); - } - - public TApplicationException(int type) { - super(); - type_ = type; - } - - public TApplicationException(int type, String message) { - super(message); - type_ = type; - } - - public TApplicationException(String message) { - super(message); - } - - public int getType() { - return type_; - } - - public static TApplicationException read(TProtocol iprot) throws TException { - TField field; - iprot.readStructBegin(); - - String message = null; - int type = UNKNOWN; - - while (true) { - field = iprot.readFieldBegin(); - if (field.type == TType.STOP) { - break; - } - switch (field.id) { - case 1: - if (field.type == TType.STRING) { - message = iprot.readString(); - } else { - TProtocolUtil.skip(iprot, field.type); - } - break; - case 2: - if (field.type == TType.I32) { - type = iprot.readI32(); - } else { - TProtocolUtil.skip(iprot, field.type); - } - break; - default: - TProtocolUtil.skip(iprot, field.type); - break; - } - iprot.readFieldEnd(); - } - iprot.readStructEnd(); - - return new TApplicationException(type, message); - } - - public void write(TProtocol oprot) throws TException { - oprot.writeStructBegin(TAPPLICATION_EXCEPTION_STRUCT); - if (getMessage() != null) { - oprot.writeFieldBegin(MESSAGE_FIELD); - oprot.writeString(getMessage()); - oprot.writeFieldEnd(); - } - oprot.writeFieldBegin(TYPE_FIELD); - oprot.writeI32(type_); - oprot.writeFieldEnd(); - oprot.writeFieldStop(); - oprot.writeStructEnd(); - } -} diff --git a/app/src/main/java/org/apache/thrift/TBase.java b/app/src/main/java/org/apache/thrift/TBase.java deleted file mode 100644 index b3ed1bc..0000000 --- a/app/src/main/java/org/apache/thrift/TBase.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import java.io.Serializable; - -import org.apache.thrift.protocol.TProtocol; - -/** - * Generic base interface for generated Thrift objects. - * - */ -public interface TBase, F extends TFieldIdEnum> extends Comparable, Serializable { - - /** - * Reads the TObject from the given input protocol. - * - * @param iprot Input protocol - */ - public void read(TProtocol iprot) throws TException; - - /** - * Writes the objects out to the protocol - * - * @param oprot Output protocol - */ - public void write(TProtocol oprot) throws TException; - - /** - * Get the F instance that corresponds to fieldId. - */ - public F fieldForId(int fieldId); - - /** - * Check if a field is currently set or unset. - * - * @param field - */ - public boolean isSet(F field); - - /** - * Get a field's value by field variable. Primitive types will be wrapped in - * the appropriate "boxed" types. - * - * @param field - */ - public Object getFieldValue(F field); - - /** - * Set a field's value by field variable. Primitive types must be "boxed" in - * the appropriate object wrapper type. - * - * @param field - */ - public void setFieldValue(F field, Object value); - - public TBase deepCopy(); - - /** - * Return to the state of having just been initialized, as though you had just - * called the default constructor. - */ - public void clear(); -} diff --git a/app/src/main/java/org/apache/thrift/TBaseHelper.java b/app/src/main/java/org/apache/thrift/TBaseHelper.java deleted file mode 100644 index eec648b..0000000 --- a/app/src/main/java/org/apache/thrift/TBaseHelper.java +++ /dev/null @@ -1,306 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.thrift; - -import java.nio.ByteBuffer; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.TreeMap; -import java.util.TreeSet; - -public final class TBaseHelper { - - private TBaseHelper(){} - - private static final Comparator comparator = new NestedStructureComparator(); - - public static int compareTo(Object o1, Object o2) { - if (o1 instanceof Comparable) { - return compareTo((Comparable)o1, (Comparable)o2); - } else if (o1 instanceof List) { - return compareTo((List)o1, (List)o2); - } else if (o1 instanceof Set) { - return compareTo((Set)o1, (Set)o2); - } else if (o1 instanceof Map) { - return compareTo((Map)o1, (Map)o2); - } else if (o1 instanceof byte[]) { - return compareTo((byte[])o1, (byte[])o2); - } else { - throw new IllegalArgumentException("Cannot compare objects of type " + o1.getClass()); - } - } - - public static int compareTo(boolean a, boolean b) { - return Boolean.valueOf(a).compareTo(b); - } - - public static int compareTo(byte a, byte b) { - if (a < b) { - return -1; - } else if (b < a) { - return 1; - } else { - return 0; - } - } - - public static int compareTo(short a, short b) { - if (a < b) { - return -1; - } else if (b < a) { - return 1; - } else { - return 0; - } - } - - public static int compareTo(int a, int b) { - if (a < b) { - return -1; - } else if (b < a) { - return 1; - } else { - return 0; - } - } - - public static int compareTo(long a, long b) { - if (a < b) { - return -1; - } else if (b < a) { - return 1; - } else { - return 0; - } - } - - public static int compareTo(double a, double b) { - if (a < b) { - return -1; - } else if (b < a) { - return 1; - } else { - return 0; - } - } - - public static int compareTo(String a, String b) { - return a.compareTo(b); - } - - public static int compareTo(byte[] a, byte[] b) { - int sizeCompare = compareTo(a.length, b.length); - if (sizeCompare != 0) { - return sizeCompare; - } - for (int i = 0; i < a.length; i++) { - int byteCompare = compareTo(a[i], b[i]); - if (byteCompare != 0) { - return byteCompare; - } - } - return 0; - } - - public static int compareTo(Comparable a, Comparable b) { - return a.compareTo(b); - } - - public static int compareTo(List a, List b) { - int lastComparison = compareTo(a.size(), b.size()); - if (lastComparison != 0) { - return lastComparison; - } - for (int i = 0; i < a.size(); i++) { - lastComparison = comparator.compare(a.get(i), b.get(i)); - if (lastComparison != 0) { - return lastComparison; - } - } - return 0; - } - - public static int compareTo(Set a, Set b) { - int lastComparison = compareTo(a.size(), b.size()); - if (lastComparison != 0) { - return lastComparison; - } - SortedSet sortedA = new TreeSet(comparator); - sortedA.addAll(a); - SortedSet sortedB = new TreeSet(comparator); - sortedB.addAll(b); - - Iterator iterA = sortedA.iterator(); - Iterator iterB = sortedB.iterator(); - - // Compare each item. - while (iterA.hasNext() && iterB.hasNext()) { - lastComparison = comparator.compare(iterA.next(), iterB.next()); - if (lastComparison != 0) { - return lastComparison; - } - } - - return 0; - } - - public static int compareTo(Map a, Map b) { - int lastComparison = compareTo(a.size(), b.size()); - if (lastComparison != 0) { - return lastComparison; - } - - // Sort a and b so we can compare them. - SortedMap sortedA = new TreeMap(comparator); - sortedA.putAll(a); - Iterator iterA = sortedA.entrySet().iterator(); - SortedMap sortedB = new TreeMap(comparator); - sortedB.putAll(b); - Iterator iterB = sortedB.entrySet().iterator(); - - // Compare each item. - while (iterA.hasNext() && iterB.hasNext()) { - Map.Entry entryA = iterA.next(); - Map.Entry entryB = iterB.next(); - lastComparison = comparator.compare(entryA.getKey(), entryB.getKey()); - if (lastComparison != 0) { - return lastComparison; - } - lastComparison = comparator.compare(entryA.getValue(), entryB.getValue()); - if (lastComparison != 0) { - return lastComparison; - } - } - - return 0; - } - - /** - * Comparator to compare items inside a structure (e.g. a list, set, or map). - */ - private static class NestedStructureComparator implements Comparator { - public int compare(Object oA, Object oB) { - if (oA == null && oB == null) { - return 0; - } else if (oA == null) { - return -1; - } else if (oB == null) { - return 1; - } else if (oA instanceof List) { - return compareTo((List)oA, (List)oB); - } else if (oA instanceof Set) { - return compareTo((Set)oA, (Set)oB); - } else if (oA instanceof Map) { - return compareTo((Map)oA, (Map)oB); - } else if (oA instanceof byte[]) { - return compareTo((byte[])oA, (byte[])oB); - } else { - return compareTo((Comparable)oA, (Comparable)oB); - } - } - } - - public static void toString(ByteBuffer bb, StringBuilder sb) { - byte[] buf = bb.array(); - - int arrayOffset = bb.arrayOffset(); - int offset = arrayOffset + bb.position(); - int origLimit = arrayOffset + bb.limit(); - int limit = (origLimit - offset > 128) ? offset + 128 : origLimit; - - for (int i = offset; i < limit; i++) { - if (i > offset) { - sb.append(" "); - } - sb.append(paddedByteString(buf[i])); - } - if (origLimit != limit) { - sb.append("..."); - } - } - - public static String paddedByteString(byte b) { - int extended = (b | 0x100) & 0x1ff; - return Integer.toHexString(extended).toUpperCase().substring(1); - } - - public static byte[] byteBufferToByteArray(ByteBuffer byteBuffer) { - if (wrapsFullArray(byteBuffer)) { - return byteBuffer.array(); - } - byte[] target = new byte[byteBuffer.remaining()]; - byteBufferToByteArray(byteBuffer, target, 0); - return target; - } - - public static boolean wrapsFullArray(ByteBuffer byteBuffer) { - return byteBuffer.hasArray() - && byteBuffer.position() == 0 - && byteBuffer.arrayOffset() == 0 - && byteBuffer.remaining() == byteBuffer.capacity(); - } - - public static int byteBufferToByteArray(ByteBuffer byteBuffer, byte[] target, int offset) { - int remaining = byteBuffer.remaining(); - System.arraycopy(byteBuffer.array(), - byteBuffer.arrayOffset() + byteBuffer.position(), - target, - offset, - remaining); - return remaining; - } - - public static ByteBuffer rightSize(ByteBuffer in) { - if (in == null) { - return null; - } - if (wrapsFullArray(in)) { - return in; - } - return ByteBuffer.wrap(byteBufferToByteArray(in)); - } - - public static ByteBuffer copyBinary(final ByteBuffer orig) { - if (orig == null) { - return null; - } - ByteBuffer copy = ByteBuffer.wrap(new byte[orig.remaining()]); - if (orig.hasArray()) { - System.arraycopy(orig.array(), orig.arrayOffset() + orig.position(), copy.array(), 0, orig.remaining()); - } else { - orig.slice().get(copy.array()); - } - - return copy; - } - - public static byte[] copyBinary(final byte[] orig) { - if (orig == null) { - return null; - } - - byte[] copy = new byte[orig.length]; - System.arraycopy(orig, 0, copy, 0, orig.length); - return copy; - } -} diff --git a/app/src/main/java/org/apache/thrift/TBaseProcessor.java b/app/src/main/java/org/apache/thrift/TBaseProcessor.java deleted file mode 100644 index f93b133..0000000 --- a/app/src/main/java/org/apache/thrift/TBaseProcessor.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.apache.thrift; - -import java.util.Map; - -import org.apache.thrift.protocol.TMessage; -import org.apache.thrift.protocol.TMessageType; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolUtil; -import org.apache.thrift.protocol.TType; - -public abstract class TBaseProcessor implements TProcessor { - private final I iface; - private final Map> processMap; - - protected TBaseProcessor(I iface, Map> processFunctionMap) { - this.iface = iface; - this.processMap = processFunctionMap; - } - - @Override - public boolean process(TProtocol in, TProtocol out) throws TException { - TMessage msg = in.readMessageBegin(); - ProcessFunction fn = processMap.get(msg.name); - if (fn == null) { - TProtocolUtil.skip(in, TType.STRUCT); - in.readMessageEnd(); - TApplicationException x = new TApplicationException(TApplicationException.UNKNOWN_METHOD, "Invalid method name: '"+msg.name+"'"); - out.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid)); - x.write(out); - out.writeMessageEnd(); - out.getTransport().flush(); - return true; - } - fn.process(msg.seqid, in, out, iface); - return true; - } -} diff --git a/app/src/main/java/org/apache/thrift/TByteArrayOutputStream.java b/app/src/main/java/org/apache/thrift/TByteArrayOutputStream.java deleted file mode 100644 index 9ed83c0..0000000 --- a/app/src/main/java/org/apache/thrift/TByteArrayOutputStream.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import java.io.ByteArrayOutputStream; - -/** - * Class that allows access to the underlying buf without doing deep - * copies on it. - * - */ -public class TByteArrayOutputStream extends ByteArrayOutputStream { - public TByteArrayOutputStream(int size) { - super(size); - } - - public TByteArrayOutputStream() { - super(); - } - - public byte[] get() { - return buf; - } - - public int len() { - return count; - } -} diff --git a/app/src/main/java/org/apache/thrift/TDeserializer.java b/app/src/main/java/org/apache/thrift/TDeserializer.java deleted file mode 100644 index 803d9c6..0000000 --- a/app/src/main/java/org/apache/thrift/TDeserializer.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; - -import org.apache.thrift.protocol.TBinaryProtocol; -import org.apache.thrift.protocol.TField; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolFactory; -import org.apache.thrift.protocol.TProtocolUtil; -import org.apache.thrift.protocol.TType; -import org.apache.thrift.transport.TMemoryInputTransport; - -/** - * Generic utility for easily deserializing objects from a byte array or Java - * String. - * - */ -public class TDeserializer { - private final TProtocol protocol_; - private final TMemoryInputTransport trans_; - - /** - * Create a new TDeserializer that uses the TBinaryProtocol by default. - */ - public TDeserializer() { - this(new TBinaryProtocol.Factory()); - } - - /** - * Create a new TDeserializer. It will use the TProtocol specified by the - * factory that is passed in. - * - * @param protocolFactory Factory to create a protocol - */ - public TDeserializer(TProtocolFactory protocolFactory) { - trans_ = new TMemoryInputTransport(); - protocol_ = protocolFactory.getProtocol(trans_); - } - - /** - * Deserialize the Thrift object from a byte array. - * - * @param base The object to read into - * @param bytes The array to read from - */ - public void deserialize(TBase base, byte[] bytes) throws TException { - try { - trans_.reset(bytes); - base.read(protocol_); - } finally { - trans_.clear(); - protocol_.reset(); - } - } - - /** - * Deserialize the Thrift object from a Java string, using a specified - * character set for decoding. - * - * @param base The object to read into - * @param data The string to read from - * @param charset Valid JVM charset - */ - public void deserialize(TBase base, String data, String charset) throws TException { - try { - deserialize(base, data.getBytes(charset)); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT ENCODING: " + charset); - } finally { - protocol_.reset(); - } - } - - /** - * Deserialize only a single Thrift object (addressed by recursively using field id) - * from a byte record. - * @param tb The object to read into - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path tb - * @param fieldIdPathRest The rest FieldId's that define a path tb - * @throws TException - */ - public void partialDeserialize(TBase tb, byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - try { - if (locateField(bytes, fieldIdPathFirst, fieldIdPathRest) != null) { - // if this line is reached, iprot will be positioned at the start of tb. - tb.read(protocol_); - } - } catch (Exception e) { - throw new TException(e); - } finally { - trans_.clear(); - protocol_.reset(); - } - } - - /** - * Deserialize only a boolean field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to a boolean field - * @param fieldIdPathRest The rest FieldId's that define a path to a boolean field - * @throws TException - */ - public Boolean partialDeserializeBool(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (Boolean) partialDeserializeField(TType.BOOL, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only a byte field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to a byte field - * @param fieldIdPathRest The rest FieldId's that define a path to a byte field - * @throws TException - */ - public Byte partialDeserializeByte(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (Byte) partialDeserializeField(TType.BYTE, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only a double field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to a double field - * @param fieldIdPathRest The rest FieldId's that define a path to a double field - * @throws TException - */ - public Double partialDeserializeDouble(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (Double) partialDeserializeField(TType.DOUBLE, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only an i16 field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to an i16 field - * @param fieldIdPathRest The rest FieldId's that define a path to an i16 field - * @throws TException - */ - public Short partialDeserializeI16(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (Short) partialDeserializeField(TType.I16, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only an i32 field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to an i32 field - * @param fieldIdPathRest The rest FieldId's that define a path to an i32 field - * @throws TException - */ - public Integer partialDeserializeI32(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (Integer) partialDeserializeField(TType.I32, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only an i64 field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to an i64 field - * @param fieldIdPathRest The rest FieldId's that define a path to an i64 field - * @throws TException - */ - public Long partialDeserializeI64(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (Long) partialDeserializeField(TType.I64, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only a string field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to a string field - * @param fieldIdPathRest The rest FieldId's that define a path to a string field - * @throws TException - */ - public String partialDeserializeString(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - return (String) partialDeserializeField(TType.STRING, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only a binary field (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to a binary field - * @param fieldIdPathRest The rest FieldId's that define a path to a binary field - * @throws TException - */ - public ByteBuffer partialDeserializeByteArray(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - // TType does not have binary, so we use the arbitrary num 100 - return (ByteBuffer) partialDeserializeField((byte)100, bytes, fieldIdPathFirst, fieldIdPathRest); - } - - /** - * Deserialize only the id of the field set in a TUnion (addressed by recursively using field id) - * from a byte record. - * @param bytes The serialized object to read from - * @param fieldIdPathFirst First of the FieldId's that define a path to a TUnion - * @param fieldIdPathRest The rest FieldId's that define a path to a TUnion - * @throws TException - */ - public Short partialDeserializeSetFieldIdInUnion(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - try { - TField field = locateField(bytes, fieldIdPathFirst, fieldIdPathRest); - if (field != null){ - protocol_.readStructBegin(); // The Union - return protocol_.readFieldBegin().id; // The field set in the union - } - return null; - } catch (Exception e) { - throw new TException(e); - } finally { - trans_.clear(); - protocol_.reset(); - } - } - - private Object partialDeserializeField(byte ttype, byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - try { - TField field = locateField(bytes, fieldIdPathFirst, fieldIdPathRest); - if (field != null) { - // if this point is reached, iprot will be positioned at the start of the field. - switch(ttype){ - case TType.BOOL: - if (field.type == TType.BOOL){ - return protocol_.readBool(); - } - break; - case TType.BYTE: - if (field.type == TType.BYTE) { - return protocol_.readByte(); - } - break; - case TType.DOUBLE: - if (field.type == TType.DOUBLE) { - return protocol_.readDouble(); - } - break; - case TType.I16: - if (field.type == TType.I16) { - return protocol_.readI16(); - } - break; - case TType.I32: - if (field.type == TType.I32) { - return protocol_.readI32(); - } - break; - case TType.I64: - if (field.type == TType.I64) { - return protocol_.readI64(); - } - break; - case TType.STRING: - if (field.type == TType.STRING) { - return protocol_.readString(); - } - break; - case 100: // hack to differentiate between string and binary - if (field.type == TType.STRING) { - return protocol_.readBinary(); - } - break; - } - } - return null; - } catch (Exception e) { - throw new TException(e); - } finally { - trans_.clear(); - protocol_.reset(); - } - } - - private TField locateField(byte[] bytes, TFieldIdEnum fieldIdPathFirst, TFieldIdEnum ... fieldIdPathRest) throws TException { - trans_.reset(bytes); - - TFieldIdEnum[] fieldIdPath= new TFieldIdEnum[fieldIdPathRest.length + 1]; - fieldIdPath[0] = fieldIdPathFirst; - for (int i = 0; i < fieldIdPathRest.length; i++){ - fieldIdPath[i + 1] = fieldIdPathRest[i]; - } - - // index into field ID path being currently searched for - int curPathIndex = 0; - - // this will be the located field, or null if it is not located - TField field = null; - - protocol_.readStructBegin(); - - while (curPathIndex < fieldIdPath.length) { - field = protocol_.readFieldBegin(); - // we can stop searching if we either see a stop or we go past the field - // id we're looking for (since fields should now be serialized in asc - // order). - if (field.type == TType.STOP || field.id > fieldIdPath[curPathIndex].getThriftFieldId()) { - return null; - } - - if (field.id != fieldIdPath[curPathIndex].getThriftFieldId()) { - // Not the field we're looking for. Skip field. - TProtocolUtil.skip(protocol_, field.type); - protocol_.readFieldEnd(); - } else { - // This field is the next step in the path. Step into field. - curPathIndex++; - if (curPathIndex < fieldIdPath.length) { - protocol_.readStructBegin(); - } - } - } - return field; - } - - /** - * Deserialize the Thrift object from a Java string, using the default JVM - * charset encoding. - * - * @param base The object to read into - * @param data The string to read from - */ - public void fromString(TBase base, String data) throws TException { - deserialize(base, data.getBytes()); - } -} diff --git a/app/src/main/java/org/apache/thrift/TEnum.java b/app/src/main/java/org/apache/thrift/TEnum.java deleted file mode 100644 index 325fdec..0000000 --- a/app/src/main/java/org/apache/thrift/TEnum.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -public interface TEnum { - public int getValue(); -} diff --git a/app/src/main/java/org/apache/thrift/TEnumHelper.java b/app/src/main/java/org/apache/thrift/TEnumHelper.java deleted file mode 100644 index c17d661..0000000 --- a/app/src/main/java/org/apache/thrift/TEnumHelper.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import java.lang.InstantiationException; -import java.lang.NoSuchMethodException; -import java.lang.IllegalAccessException; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * Utility class with static methods for interacting with TEnum - */ -public class TEnumHelper { - - /** - * Given a TEnum class and integer value, this method will return - * the associated constant from the given TEnum class. - * This method MUST be modified should the name of the 'findByValue' method - * change. - * - * @param enumClass TEnum from which to return a matching constant. - * @param value Value for which to return the constant. - * - * @return The constant in 'enumClass' whose value is 'value' or null if - * something went wrong. - */ - public static TEnum getByValue(Class enumClass, int value) { - try { - Method method = enumClass.getMethod("findByValue", int.class); - return (TEnum) method.invoke(null, value); - } catch (NoSuchMethodException nsme) { - return null; - } catch (IllegalAccessException iae) { - return null; - } catch (InvocationTargetException ite) { - return null; - } - } -} diff --git a/app/src/main/java/org/apache/thrift/TException.java b/app/src/main/java/org/apache/thrift/TException.java deleted file mode 100644 index cc3160f..0000000 --- a/app/src/main/java/org/apache/thrift/TException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -/** - * Generic exception class for Thrift. - * - */ -public class TException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public TException() { - super(); - } - - public TException(String message) { - super(message); - } - - public TException(Throwable cause) { - super(cause); - } - - public TException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/app/src/main/java/org/apache/thrift/TFieldIdEnum.java b/app/src/main/java/org/apache/thrift/TFieldIdEnum.java deleted file mode 100644 index 2956fba..0000000 --- a/app/src/main/java/org/apache/thrift/TFieldIdEnum.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift; - -/** - * Interface for all generated struct Fields objects. - */ -public interface TFieldIdEnum { - /** - * Get the Thrift field id for the named field. - */ - public short getThriftFieldId(); - - /** - * Get the field's name, exactly as in the IDL. - */ - public String getFieldName(); -} diff --git a/app/src/main/java/org/apache/thrift/TFieldRequirementType.java b/app/src/main/java/org/apache/thrift/TFieldRequirementType.java deleted file mode 100644 index 74bac4e..0000000 --- a/app/src/main/java/org/apache/thrift/TFieldRequirementType.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -/** - * Requirement type constants. - * - */ -public final class TFieldRequirementType { - public static final byte REQUIRED = 1; - public static final byte OPTIONAL = 2; - public static final byte DEFAULT = 3; -} diff --git a/app/src/main/java/org/apache/thrift/TProcessor.java b/app/src/main/java/org/apache/thrift/TProcessor.java deleted file mode 100644 index d79522c..0000000 --- a/app/src/main/java/org/apache/thrift/TProcessor.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import org.apache.thrift.protocol.TProtocol; - -/** - * A processor is a generic object which operates upon an input stream and - * writes to some output stream. - * - */ -public interface TProcessor { - public boolean process(TProtocol in, TProtocol out) - throws TException; -} diff --git a/app/src/main/java/org/apache/thrift/TProcessorFactory.java b/app/src/main/java/org/apache/thrift/TProcessorFactory.java deleted file mode 100644 index bcd8a38..0000000 --- a/app/src/main/java/org/apache/thrift/TProcessorFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import org.apache.thrift.transport.TTransport; - -/** - * The default processor factory just returns a singleton - * instance. - */ -public class TProcessorFactory { - - private final TProcessor processor_; - - public TProcessorFactory(TProcessor processor) { - processor_ = processor; - } - - public TProcessor getProcessor(TTransport trans) { - return processor_; - } -} diff --git a/app/src/main/java/org/apache/thrift/TSerializer.java b/app/src/main/java/org/apache/thrift/TSerializer.java deleted file mode 100644 index 4e1ce61..0000000 --- a/app/src/main/java/org/apache/thrift/TSerializer.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import java.io.ByteArrayOutputStream; -import java.io.UnsupportedEncodingException; - -import org.apache.thrift.protocol.TBinaryProtocol; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolFactory; -import org.apache.thrift.transport.TIOStreamTransport; - -/** - * Generic utility for easily serializing objects into a byte array or Java - * String. - * - */ -public class TSerializer { - - /** - * This is the byte array that data is actually serialized into - */ - private final ByteArrayOutputStream baos_ = new ByteArrayOutputStream(); - - /** - * This transport wraps that byte array - */ - private final TIOStreamTransport transport_ = new TIOStreamTransport(baos_); - - /** - * Internal protocol used for serializing objects. - */ - private TProtocol protocol_; - - /** - * Create a new TSerializer that uses the TBinaryProtocol by default. - */ - public TSerializer() { - this(new TBinaryProtocol.Factory()); - } - - /** - * Create a new TSerializer. It will use the TProtocol specified by the - * factory that is passed in. - * - * @param protocolFactory Factory to create a protocol - */ - public TSerializer(TProtocolFactory protocolFactory) { - protocol_ = protocolFactory.getProtocol(transport_); - } - - /** - * Serialize the Thrift object into a byte array. The process is simple, - * just clear the byte array output, write the object into it, and grab the - * raw bytes. - * - * @param base The object to serialize - * @return Serialized object in byte[] format - */ - public byte[] serialize(TBase base) throws TException { - baos_.reset(); - base.write(protocol_); - return baos_.toByteArray(); - } - - /** - * Serialize the Thrift object into a Java string, using a specified - * character set for encoding. - * - * @param base The object to serialize - * @param charset Valid JVM charset - * @return Serialized object as a String - */ - public String toString(TBase base, String charset) throws TException { - try { - return new String(serialize(base), charset); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT ENCODING: " + charset); - } - } - - /** - * Serialize the Thrift object into a Java string, using the default JVM - * charset encoding. - * - * @param base The object to serialize - * @return Serialized object as a String - */ - public String toString(TBase base) throws TException { - return new String(serialize(base)); - } -} - diff --git a/app/src/main/java/org/apache/thrift/TServiceClient.java b/app/src/main/java/org/apache/thrift/TServiceClient.java deleted file mode 100644 index 15715f1..0000000 --- a/app/src/main/java/org/apache/thrift/TServiceClient.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import org.apache.thrift.protocol.TMessage; -import org.apache.thrift.protocol.TMessageType; -import org.apache.thrift.protocol.TProtocol; - -/** - * A TServiceClient is used to communicate with a TService implementation - * across protocols and transports. - */ -public abstract class TServiceClient { - public TServiceClient(TProtocol prot) { - this(prot, prot); - } - - public TServiceClient(TProtocol iprot, TProtocol oprot) { - iprot_ = iprot; - oprot_ = oprot; - } - - protected TProtocol iprot_; - protected TProtocol oprot_; - - protected int seqid_; - - /** - * Get the TProtocol being used as the input (read) protocol. - * @return the TProtocol being used as the input (read) protocol. - */ - public TProtocol getInputProtocol() { - return this.iprot_; - } - - /** - * Get the TProtocol being used as the output (write) protocol. - * @return the TProtocol being used as the output (write) protocol. - */ - public TProtocol getOutputProtocol() { - return this.oprot_; - } - - protected void sendBase(String methodName, TBase args) throws TException { - oprot_.writeMessageBegin(new TMessage(methodName, TMessageType.CALL, ++seqid_)); - args.write(oprot_); - oprot_.writeMessageEnd(); - oprot_.getTransport().flush(); - } - - protected void receiveBase(TBase result, String methodName) throws TException { - TMessage msg = iprot_.readMessageBegin(); - if (msg.type == TMessageType.EXCEPTION) { - TApplicationException x = TApplicationException.read(iprot_); - iprot_.readMessageEnd(); - throw x; - } - if (msg.seqid != seqid_) { - throw new TApplicationException(TApplicationException.BAD_SEQUENCE_ID, methodName + " failed: out of sequence response"); - } - result.read(iprot_); - iprot_.readMessageEnd(); - } -} diff --git a/app/src/main/java/org/apache/thrift/TServiceClientFactory.java b/app/src/main/java/org/apache/thrift/TServiceClientFactory.java deleted file mode 100644 index 988e655..0000000 --- a/app/src/main/java/org/apache/thrift/TServiceClientFactory.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift; - -import org.apache.thrift.protocol.TProtocol; - -/** - * A TServiceClientFactory provides a general way to get a TServiceClient - * connected to a remote TService via a protocol. - * @param - */ -public interface TServiceClientFactory { - /** - * Get a brand-new T using prot as both the input and output protocol. - * @param prot - * @return A brand-new T using prot as both the input and output protocol. - */ - public T getClient(TProtocol prot); - - /** - * Get a brand new T using the specified input and output protocols. The - * input and output protocols may be the same instance. - * @param iprot - * @param oprot - * @return a brand new T using the specified input and output protocols - */ - public T getClient(TProtocol iprot, TProtocol oprot); -} diff --git a/app/src/main/java/org/apache/thrift/TUnion.java b/app/src/main/java/org/apache/thrift/TUnion.java deleted file mode 100644 index 0173f9b..0000000 --- a/app/src/main/java/org/apache/thrift/TUnion.java +++ /dev/null @@ -1,280 +0,0 @@ -/** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.thrift; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.nio.ByteBuffer; - -import org.apache.thrift.TUnion.TUnionStandardScheme; -import org.apache.thrift.protocol.TField; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolException; -import org.apache.thrift.protocol.TStruct; -import org.apache.thrift.scheme.IScheme; -import org.apache.thrift.scheme.SchemeFactory; -import org.apache.thrift.scheme.StandardScheme; -import org.apache.thrift.scheme.TupleScheme; - -public abstract class TUnion, F extends TFieldIdEnum> implements TBase { - - protected Object value_; - protected F setField_; - - protected TUnion() { - setField_ = null; - value_ = null; - } - - private static final Map, SchemeFactory> schemes = new HashMap, SchemeFactory>(); - static { - schemes.put(StandardScheme.class, new TUnionStandardSchemeFactory()); - schemes.put(TupleScheme.class, new TUnionTupleSchemeFactory()); - } - - protected TUnion(F setField, Object value) { - setFieldValue(setField, value); - } - - protected TUnion(TUnion other) { - if (!other.getClass().equals(this.getClass())) { - throw new ClassCastException(); - } - setField_ = other.setField_; - value_ = deepCopyObject(other.value_); - } - - private static Object deepCopyObject(Object o) { - if (o instanceof TBase) { - return ((TBase)o).deepCopy(); - } else if (o instanceof ByteBuffer) { - return TBaseHelper.copyBinary((ByteBuffer)o); - } else if (o instanceof List) { - return deepCopyList((List)o); - } else if (o instanceof Set) { - return deepCopySet((Set)o); - } else if (o instanceof Map) { - return deepCopyMap((Map)o); - } else { - return o; - } - } - - private static Map deepCopyMap(Map map) { - Map copy = new HashMap(); - for (Map.Entry entry : map.entrySet()) { - copy.put(deepCopyObject(entry.getKey()), deepCopyObject(entry.getValue())); - } - return copy; - } - - private static Set deepCopySet(Set set) { - Set copy = new HashSet(); - for (Object o : set) { - copy.add(deepCopyObject(o)); - } - return copy; - } - - private static List deepCopyList(List list) { - List copy = new ArrayList(list.size()); - for (Object o : list) { - copy.add(deepCopyObject(o)); - } - return copy; - } - - public F getSetField() { - return setField_; - } - - public Object getFieldValue() { - return value_; - } - - public Object getFieldValue(F fieldId) { - if (fieldId != setField_) { - throw new IllegalArgumentException("Cannot get the value of field " + fieldId + " because union's set field is " + setField_); - } - - return getFieldValue(); - } - - public Object getFieldValue(int fieldId) { - return getFieldValue(enumForId((short)fieldId)); - } - - public boolean isSet() { - return setField_ != null; - } - - public boolean isSet(F fieldId) { - return setField_ == fieldId; - } - - public boolean isSet(int fieldId) { - return isSet(enumForId((short)fieldId)); - } - - public void read(TProtocol iprot) throws TException { - schemes.get(iprot.getScheme()).getScheme().read(iprot, this); - } - - public void setFieldValue(F fieldId, Object value) { - checkType(fieldId, value); - setField_ = fieldId; - value_ = value; - } - - public void setFieldValue(int fieldId, Object value) { - setFieldValue(enumForId((short)fieldId), value); - } - - public void write(TProtocol oprot) throws TException { - schemes.get(oprot.getScheme()).getScheme().write(oprot, this); - } - - /** - * Implementation should be generated so that we can efficiently type check - * various values. - * @param setField - * @param value - */ - protected abstract void checkType(F setField, Object value) throws ClassCastException; - - /** - * Implementation should be generated to read the right stuff from the wire - * based on the field header. - * @param field - * @return read Object based on the field header, as specified by the argument. - */ - protected abstract Object standardSchemeReadValue(TProtocol iprot, TField field) throws TException; - protected abstract void standardSchemeWriteValue(TProtocol oprot) throws TException; - - protected abstract Object tupleSchemeReadValue(TProtocol iprot, short fieldID) throws TException; - protected abstract void tupleSchemeWriteValue(TProtocol oprot) throws TException; - - protected abstract TStruct getStructDesc(); - - protected abstract TField getFieldDesc(F setField); - - protected abstract F enumForId(short id); - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("<"); - sb.append(this.getClass().getSimpleName()); - sb.append(" "); - - if (getSetField() != null) { - Object v = getFieldValue(); - sb.append(getFieldDesc(getSetField()).name); - sb.append(":"); - if(v instanceof ByteBuffer) { - TBaseHelper.toString((ByteBuffer)v, sb); - } else { - sb.append(v.toString()); - } - } - sb.append(">"); - return sb.toString(); - } - - public final void clear() { - this.setField_ = null; - this.value_ = null; - } - - private static class TUnionStandardSchemeFactory implements SchemeFactory { - public TUnionStandardScheme getScheme() { - return new TUnionStandardScheme(); - } - } - - public static class TUnionStandardScheme extends StandardScheme { - - @Override - public void read(TProtocol iprot, TUnion struct) throws TException { - struct.setField_ = null; - struct.value_ = null; - - iprot.readStructBegin(); - - TField field = iprot.readFieldBegin(); - - struct.value_ = struct.standardSchemeReadValue(iprot, field); - if (struct.value_ != null) { - struct.setField_ = struct.enumForId(field.id); - } - - iprot.readFieldEnd(); - // this is so that we will eat the stop byte. we could put a check here to - // make sure that it actually *is* the stop byte, but it's faster to do it - // this way. - iprot.readFieldBegin(); - iprot.readStructEnd(); - } - - @Override - public void write(TProtocol oprot, TUnion struct) throws TException { - if (struct.getSetField() == null || struct.getFieldValue() == null) { - throw new TProtocolException("Cannot write a TUnion with no set value!"); - } - oprot.writeStructBegin(struct.getStructDesc()); - oprot.writeFieldBegin(struct.getFieldDesc(struct.setField_)); - struct.standardSchemeWriteValue(oprot); - oprot.writeFieldEnd(); - oprot.writeFieldStop(); - oprot.writeStructEnd(); - } - } - - private static class TUnionTupleSchemeFactory implements SchemeFactory { - public TUnionStandardScheme getScheme() { - return new TUnionStandardScheme(); - } - } - - public static class TUnionTupleScheme extends TupleScheme { - - @Override - public void read(TProtocol iprot, TUnion struct) throws TException { - struct.setField_ = null; - struct.value_ = null; - short fieldID = iprot.readI16(); - struct.value_ = struct.tupleSchemeReadValue(iprot, fieldID); - if (struct.value_ != null) { - struct.setField_ = struct.enumForId(fieldID); - } - } - - @Override - public void write(TProtocol oprot, TUnion struct) throws TException { - if (struct.getSetField() == null || struct.getFieldValue() == null) { - throw new TProtocolException("Cannot write a TUnion with no set value!"); - } - oprot.writeI16(struct.setField_.getThriftFieldId()); - struct.tupleSchemeWriteValue(oprot); - } - } -} diff --git a/app/src/main/java/org/apache/thrift/async/AsyncMethodCallback.java b/app/src/main/java/org/apache/thrift/async/AsyncMethodCallback.java deleted file mode 100644 index 00004b7..0000000 --- a/app/src/main/java/org/apache/thrift/async/AsyncMethodCallback.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.async; - - -public interface AsyncMethodCallback { - /** - * This method will be called when the remote side has completed invoking - * your method call and the result is fully read. For oneway method calls, - * this method will be called as soon as we have completed writing out the - * request. - * @param response - */ - public void onComplete(T response); - - /** - * This method will be called when there is an unexpected clientside - * exception. This does not include application-defined exceptions that - * appear in the IDL, but rather things like IOExceptions. - * @param exception - */ - public void onError(Exception exception); -} diff --git a/app/src/main/java/org/apache/thrift/async/TAsyncClient.java b/app/src/main/java/org/apache/thrift/async/TAsyncClient.java deleted file mode 100644 index 9a22717..0000000 --- a/app/src/main/java/org/apache/thrift/async/TAsyncClient.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.async; - -import org.apache.thrift.protocol.TProtocolFactory; -import org.apache.thrift.transport.TNonblockingTransport; - -public abstract class TAsyncClient { - protected final TProtocolFactory ___protocolFactory; - protected final TNonblockingTransport ___transport; - protected final TAsyncClientManager ___manager; - protected TAsyncMethodCall ___currentMethod; - private Exception ___error; - private long ___timeout; - - public TAsyncClient(TProtocolFactory protocolFactory, TAsyncClientManager manager, TNonblockingTransport transport) { - this(protocolFactory, manager, transport, 0); - } - - public TAsyncClient(TProtocolFactory protocolFactory, TAsyncClientManager manager, TNonblockingTransport transport, long timeout) { - this.___protocolFactory = protocolFactory; - this.___manager = manager; - this.___transport = transport; - this.___timeout = timeout; - } - - public TProtocolFactory getProtocolFactory() { - return ___protocolFactory; - } - - public long getTimeout() { - return ___timeout; - } - - public boolean hasTimeout() { - return ___timeout > 0; - } - - public void setTimeout(long timeout) { - this.___timeout = timeout; - } - - /** - * Is the client in an error state? - * @return If client in an error state? - */ - public boolean hasError() { - return ___error != null; - } - - /** - * Get the client's error - returns null if no error - * @return Get the client's error.
returns null if no error - */ - public Exception getError() { - return ___error; - } - - protected void checkReady() { - // Ensure we are not currently executing a method - if (___currentMethod != null) { - throw new IllegalStateException("Client is currently executing another method: " + ___currentMethod.getClass().getName()); - } - - // Ensure we're not in an error state - if (___error != null) { - throw new IllegalStateException("Client has an error!", ___error); - } - } - - /** - * Called by delegate method when finished - */ - protected void onComplete() { - ___currentMethod = null; - } - - /** - * Called by delegate method on error - */ - protected void onError(Exception exception) { - ___transport.close(); - ___currentMethod = null; - ___error = exception; - } -} diff --git a/app/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java b/app/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java deleted file mode 100644 index 28feb73..0000000 --- a/app/src/main/java/org/apache/thrift/async/TAsyncClientFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.async; - -import org.apache.thrift.transport.TNonblockingTransport; - -public interface TAsyncClientFactory { - public T getAsyncClient(TNonblockingTransport transport); -} diff --git a/app/src/main/java/org/apache/thrift/async/TAsyncClientManager.java b/app/src/main/java/org/apache/thrift/async/TAsyncClientManager.java deleted file mode 100644 index 98f7194..0000000 --- a/app/src/main/java/org/apache/thrift/async/TAsyncClientManager.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.async; - -import java.io.IOException; -import java.nio.channels.ClosedSelectorException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.spi.SelectorProvider; -import java.util.Comparator; -import java.util.Iterator; -import java.util.TreeSet; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.TimeoutException; - -import org.apache.thrift.TException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Contains selector thread which transitions method call objects - */ -public class TAsyncClientManager { - private static final Logger LOGGER = LoggerFactory.getLogger(TAsyncClientManager.class.getName()); - - private final SelectThread selectThread; - private final ConcurrentLinkedQueue pendingCalls = new ConcurrentLinkedQueue(); - - public TAsyncClientManager() throws IOException { - this.selectThread = new SelectThread(); - selectThread.start(); - } - - public void call(TAsyncMethodCall method) throws TException { - if (!isRunning()) { - throw new TException("SelectThread is not running"); - } - method.prepareMethodCall(); - pendingCalls.add(method); - selectThread.getSelector().wakeup(); - } - - public void stop() { - selectThread.finish(); - } - - public boolean isRunning() { - return selectThread.isAlive(); - } - - private class SelectThread extends Thread { - private final Selector selector; - private volatile boolean running; - private final TreeSet timeoutWatchSet = new TreeSet(new TAsyncMethodCallTimeoutComparator()); - - public SelectThread() throws IOException { - this.selector = SelectorProvider.provider().openSelector(); - this.running = true; - this.setName("TAsyncClientManager#SelectorThread " + this.getId()); - - // We don't want to hold up the JVM when shutting down - setDaemon(true); - } - - public Selector getSelector() { - return selector; - } - - public void finish() { - running = false; - selector.wakeup(); - } - - public void run() { - while (running) { - try { - try { - if (timeoutWatchSet.size() == 0) { - // No timeouts, so select indefinitely - selector.select(); - } else { - // We have a timeout pending, so calculate the time until then and select appropriately - long nextTimeout = timeoutWatchSet.first().getTimeoutTimestamp(); - long selectTime = nextTimeout - System.currentTimeMillis(); - if (selectTime > 0) { - // Next timeout is in the future, select and wake up then - selector.select(selectTime); - } else { - // Next timeout is now or in past, select immediately so we can time out - selector.selectNow(); - } - } - } catch (IOException e) { - LOGGER.error("Caught IOException in TAsyncClientManager!", e); - } - transitionMethods(); - timeoutMethods(); - startPendingMethods(); - } catch (Exception exception) { - LOGGER.error("Ignoring uncaught exception in SelectThread", exception); - } - } - } - - // Transition methods for ready keys - private void transitionMethods() { - try { - Iterator keys = selector.selectedKeys().iterator(); - while (keys.hasNext()) { - SelectionKey key = keys.next(); - keys.remove(); - if (!key.isValid()) { - // this can happen if the method call experienced an error and the - // key was cancelled. can also happen if we timeout a method, which - // results in a channel close. - // just skip - continue; - } - TAsyncMethodCall methodCall = (TAsyncMethodCall)key.attachment(); - methodCall.transition(key); - - // If done or error occurred, remove from timeout watch set - if (methodCall.isFinished() || methodCall.getClient().hasError()) { - timeoutWatchSet.remove(methodCall); - } - } - } catch (ClosedSelectorException e) { - LOGGER.error("Caught ClosedSelectorException in TAsyncClientManager!", e); - } - } - - // Timeout any existing method calls - private void timeoutMethods() { - Iterator iterator = timeoutWatchSet.iterator(); - long currentTime = System.currentTimeMillis(); - while (iterator.hasNext()) { - TAsyncMethodCall methodCall = iterator.next(); - if (currentTime >= methodCall.getTimeoutTimestamp()) { - iterator.remove(); - methodCall.onError(new TimeoutException("Operation " + methodCall.getClass() + " timed out after " + (currentTime - methodCall.getStartTime()) + " ms.")); - } else { - break; - } - } - } - - // Start any new calls - private void startPendingMethods() { - TAsyncMethodCall methodCall; - while ((methodCall = pendingCalls.poll()) != null) { - // Catch registration errors. method will catch transition errors and cleanup. - try { - methodCall.start(selector); - - // If timeout specified and first transition went smoothly, add to timeout watch set - TAsyncClient client = methodCall.getClient(); - if (client.hasTimeout() && !client.hasError()) { - timeoutWatchSet.add(methodCall); - } - } catch (Exception exception) { - LOGGER.warn("Caught exception in TAsyncClientManager!", exception); - methodCall.onError(exception); - } - } - } - } - - /** Comparator used in TreeSet */ - private static class TAsyncMethodCallTimeoutComparator implements Comparator { - public int compare(TAsyncMethodCall left, TAsyncMethodCall right) { - if (left.getTimeoutTimestamp() == right.getTimeoutTimestamp()) { - return (int)(left.getSequenceId() - right.getSequenceId()); - } else { - return (int)(left.getTimeoutTimestamp() - right.getTimeoutTimestamp()); - } - } - } -} diff --git a/app/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java b/app/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java deleted file mode 100644 index fcd50ea..0000000 --- a/app/src/main/java/org/apache/thrift/async/TAsyncMethodCall.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.async; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.thrift.TException; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolFactory; -import org.apache.thrift.transport.TFramedTransport; -import org.apache.thrift.transport.TMemoryBuffer; -import org.apache.thrift.transport.TNonblockingTransport; -import org.apache.thrift.transport.TTransportException; - -/** - * Encapsulates an async method call - * Need to generate: - * - private void write_args(TProtocol protocol) - * - public T getResult() throws , , ... - * @param - */ -public abstract class TAsyncMethodCall { - - private static final int INITIAL_MEMORY_BUFFER_SIZE = 128; - private static AtomicLong sequenceIdCounter = new AtomicLong(0); - - public static enum State { - CONNECTING, - WRITING_REQUEST_SIZE, - WRITING_REQUEST_BODY, - READING_RESPONSE_SIZE, - READING_RESPONSE_BODY, - RESPONSE_READ, - ERROR; - } - - /** - * Next step in the call, initialized by start() - */ - private State state = null; - - protected final TNonblockingTransport transport; - private final TProtocolFactory protocolFactory; - protected final TAsyncClient client; - private final AsyncMethodCallback callback; - private final boolean isOneway; - private long sequenceId; - - private ByteBuffer sizeBuffer; - private final byte[] sizeBufferArray = new byte[4]; - private ByteBuffer frameBuffer; - - private long startTime = System.currentTimeMillis(); - - protected TAsyncMethodCall(TAsyncClient client, TProtocolFactory protocolFactory, TNonblockingTransport transport, AsyncMethodCallback callback, boolean isOneway) { - this.transport = transport; - this.callback = callback; - this.protocolFactory = protocolFactory; - this.client = client; - this.isOneway = isOneway; - this.sequenceId = TAsyncMethodCall.sequenceIdCounter.getAndIncrement(); - } - - protected State getState() { - return state; - } - - protected boolean isFinished() { - return state == State.RESPONSE_READ; - } - - protected long getStartTime() { - return startTime; - } - - protected long getSequenceId() { - return sequenceId; - } - - public TAsyncClient getClient() { - return client; - } - - public boolean hasTimeout() { - return client.hasTimeout(); - } - - public long getTimeoutTimestamp() { - return client.getTimeout() + startTime; - } - - protected abstract void write_args(TProtocol protocol) throws TException; - - /** - * Initialize buffers. - * @throws TException if buffer initialization fails - */ - protected void prepareMethodCall() throws TException { - TMemoryBuffer memoryBuffer = new TMemoryBuffer(INITIAL_MEMORY_BUFFER_SIZE); - TProtocol protocol = protocolFactory.getProtocol(memoryBuffer); - write_args(protocol); - - int length = memoryBuffer.length(); - frameBuffer = ByteBuffer.wrap(memoryBuffer.getArray(), 0, length); - - TFramedTransport.encodeFrameSize(length, sizeBufferArray); - sizeBuffer = ByteBuffer.wrap(sizeBufferArray); - } - - /** - * Register with selector and start first state, which could be either connecting or writing. - * @throws IOException if register or starting fails - */ - void start(Selector sel) throws IOException { - SelectionKey key; - if (transport.isOpen()) { - state = State.WRITING_REQUEST_SIZE; - key = transport.registerSelector(sel, SelectionKey.OP_WRITE); - } else { - state = State.CONNECTING; - key = transport.registerSelector(sel, SelectionKey.OP_CONNECT); - - // non-blocking connect can complete immediately, - // in which case we should not expect the OP_CONNECT - if (transport.startConnect()) { - registerForFirstWrite(key); - } - } - - key.attach(this); - } - - void registerForFirstWrite(SelectionKey key) throws IOException { - state = State.WRITING_REQUEST_SIZE; - key.interestOps(SelectionKey.OP_WRITE); - } - - protected ByteBuffer getFrameBuffer() { - return frameBuffer; - } - - /** - * Transition to next state, doing whatever work is required. Since this - * method is only called by the selector thread, we can make changes to our - * select interests without worrying about concurrency. - * @param key - */ - protected void transition(SelectionKey key) { - // Ensure key is valid - if (!key.isValid()) { - key.cancel(); - Exception e = new TTransportException("Selection key not valid!"); - onError(e); - return; - } - - // Transition function - try { - switch (state) { - case CONNECTING: - doConnecting(key); - break; - case WRITING_REQUEST_SIZE: - doWritingRequestSize(); - break; - case WRITING_REQUEST_BODY: - doWritingRequestBody(key); - break; - case READING_RESPONSE_SIZE: - doReadingResponseSize(); - break; - case READING_RESPONSE_BODY: - doReadingResponseBody(key); - break; - default: // RESPONSE_READ, ERROR, or bug - throw new IllegalStateException("Method call in state " + state - + " but selector called transition method. Seems like a bug..."); - } - } catch (Exception e) { - key.cancel(); - key.attach(null); - onError(e); - } - } - - protected void onError(Exception e) { - client.onError(e); - callback.onError(e); - state = State.ERROR; - } - - private void doReadingResponseBody(SelectionKey key) throws IOException { - if (transport.read(frameBuffer) < 0) { - throw new IOException("Read call frame failed"); - } - if (frameBuffer.remaining() == 0) { - cleanUpAndFireCallback(key); - } - } - - private void cleanUpAndFireCallback(SelectionKey key) { - state = State.RESPONSE_READ; - key.interestOps(0); - // this ensures that the TAsyncMethod instance doesn't hang around - key.attach(null); - client.onComplete(); - callback.onComplete((T)this); - } - - private void doReadingResponseSize() throws IOException { - if (transport.read(sizeBuffer) < 0) { - throw new IOException("Read call frame size failed"); - } - if (sizeBuffer.remaining() == 0) { - state = State.READING_RESPONSE_BODY; - frameBuffer = ByteBuffer.allocate(TFramedTransport.decodeFrameSize(sizeBufferArray)); - } - } - - private void doWritingRequestBody(SelectionKey key) throws IOException { - if (transport.write(frameBuffer) < 0) { - throw new IOException("Write call frame failed"); - } - if (frameBuffer.remaining() == 0) { - if (isOneway) { - cleanUpAndFireCallback(key); - } else { - state = State.READING_RESPONSE_SIZE; - sizeBuffer.rewind(); // Prepare to read incoming frame size - key.interestOps(SelectionKey.OP_READ); - } - } - } - - private void doWritingRequestSize() throws IOException { - if (transport.write(sizeBuffer) < 0) { - throw new IOException("Write call frame size failed"); - } - if (sizeBuffer.remaining() == 0) { - state = State.WRITING_REQUEST_BODY; - } - } - - private void doConnecting(SelectionKey key) throws IOException { - if (!key.isConnectable() || !transport.finishConnect()) { - throw new IOException("not connectable or finishConnect returned false after we got an OP_CONNECT"); - } - registerForFirstWrite(key); - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/EnumMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/EnumMetaData.java deleted file mode 100644 index be49cb9..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/EnumMetaData.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -import org.apache.thrift.TEnum; - -public class EnumMetaData extends FieldValueMetaData { - public final Class enumClass; - - public EnumMetaData(byte type, Class sClass){ - super(type); - this.enumClass = sClass; - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java deleted file mode 100644 index b634291..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/FieldMetaData.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -import java.util.HashMap; -import java.util.Map; -import org.apache.thrift.TBase; -import org.apache.thrift.TFieldIdEnum; - -/** - * This class is used to store meta data about thrift fields. Every field in a - * a struct should have a corresponding instance of this class describing it. - * - */ -public class FieldMetaData implements java.io.Serializable { - public final String fieldName; - public final byte requirementType; - public final FieldValueMetaData valueMetaData; - private static Map, Map> structMap; - - static { - structMap = new HashMap, Map>(); - } - - public FieldMetaData(String name, byte req, FieldValueMetaData vMetaData){ - this.fieldName = name; - this.requirementType = req; - this.valueMetaData = vMetaData; - } - - public static void addStructMetaDataMap(Class sClass, Map map){ - structMap.put(sClass, map); - } - - /** - * Returns a map with metadata (i.e. instances of FieldMetaData) that - * describe the fields of the given class. - * - * @param sClass The TBase class for which the metadata map is requested - */ - public static Map getStructMetaDataMap(Class sClass){ - if (!structMap.containsKey(sClass)){ // Load class if it hasn't been loaded - try{ - sClass.newInstance(); - } catch (InstantiationException e){ - throw new RuntimeException("InstantiationException for TBase class: " + sClass.getName() + ", message: " + e.getMessage()); - } catch (IllegalAccessException e){ - throw new RuntimeException("IllegalAccessException for TBase class: " + sClass.getName() + ", message: " + e.getMessage()); - } - } - return structMap.get(sClass); - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/FieldValueMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/FieldValueMetaData.java deleted file mode 100644 index 2180b08..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/FieldValueMetaData.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -import org.apache.thrift.protocol.TType; - -/** - * FieldValueMetaData and collection of subclasses to store metadata about - * the value(s) of a field - */ -public class FieldValueMetaData implements java.io.Serializable { - public final byte type; - - private final boolean isTypedefType; - private final String typedefName; - private final boolean isBinary; - - public FieldValueMetaData(byte type, boolean binary) { - this.type = type; - this.isTypedefType = false; - this.typedefName = null; - this.isBinary = binary; - } - - public FieldValueMetaData(byte type) { - this(type, false); - } - - public FieldValueMetaData(byte type, String typedefName) { - this.type = type; - this.isTypedefType = true; - this.typedefName = typedefName; - this.isBinary = false; - } - - public boolean isTypedef() { - return isTypedefType; - } - - public String getTypedefName() { - return typedefName; - } - - public boolean isStruct() { - return type == TType.STRUCT; - } - - public boolean isContainer() { - return type == TType.LIST || type == TType.MAP || type == TType.SET; - } - - public boolean isBinary() { - return isBinary; - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/ListMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/ListMetaData.java deleted file mode 100644 index 8e7073b..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/ListMetaData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -public class ListMetaData extends FieldValueMetaData { - public final FieldValueMetaData elemMetaData; - - public ListMetaData(byte type, FieldValueMetaData eMetaData){ - super(type); - this.elemMetaData = eMetaData; - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/MapMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/MapMetaData.java deleted file mode 100644 index e7c408c..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/MapMetaData.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -public class MapMetaData extends FieldValueMetaData { - public final FieldValueMetaData keyMetaData; - public final FieldValueMetaData valueMetaData; - - public MapMetaData(byte type, FieldValueMetaData kMetaData, FieldValueMetaData vMetaData){ - super(type); - this.keyMetaData = kMetaData; - this.valueMetaData = vMetaData; - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/SetMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/SetMetaData.java deleted file mode 100644 index cf4b96a..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/SetMetaData.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -public class SetMetaData extends FieldValueMetaData { - public final FieldValueMetaData elemMetaData; - - public SetMetaData(byte type, FieldValueMetaData eMetaData){ - super(type); - this.elemMetaData = eMetaData; - } -} diff --git a/app/src/main/java/org/apache/thrift/meta_data/StructMetaData.java b/app/src/main/java/org/apache/thrift/meta_data/StructMetaData.java deleted file mode 100644 index b37d21d..0000000 --- a/app/src/main/java/org/apache/thrift/meta_data/StructMetaData.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.meta_data; - -import org.apache.thrift.TBase; - -public class StructMetaData extends FieldValueMetaData { - public final Class structClass; - - public StructMetaData(byte type, Class sClass){ - super(type); - this.structClass = sClass; - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TBase64Utils.java b/app/src/main/java/org/apache/thrift/protocol/TBase64Utils.java deleted file mode 100644 index 37a9fd9..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TBase64Utils.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Class for encoding and decoding Base64 data. - * - * This class is kept at package level because the interface does no input - * validation and is therefore too low-level for generalized reuse. - * - * Note also that the encoding does not pad with equal signs , as discussed in - * section 2.2 of the RFC (http://www.faqs.org/rfcs/rfc3548.html). Furthermore, - * bad data encountered when decoding is neither rejected or ignored but simply - * results in bad decoded data -- this is not in compliance with the RFC but is - * done in the interest of performance. - * - */ -class TBase64Utils { - - private static final String ENCODE_TABLE = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - /** - * Encode len bytes of data in src at offset srcOff, storing the result into - * dst at offset dstOff. len must be 1, 2, or 3. dst must have at least len+1 - * bytes of space at dstOff. src and dst should not be the same object. This - * method does no validation of the input values in the interest of - * performance. - * - * @param src the source of bytes to encode - * @param srcOff the offset into the source to read the unencoded bytes - * @param len the number of bytes to encode (must be 1, 2, or 3). - * @param dst the destination for the encoding - * @param dstOff the offset into the destination to place the encoded bytes - */ - static final void encode(byte[] src, int srcOff, int len, byte[] dst, - int dstOff) { - dst[dstOff] = (byte)ENCODE_TABLE.charAt((src[srcOff] >> 2) & 0x3F); - if (len == 3) { - dst[dstOff + 1] = - (byte)ENCODE_TABLE.charAt( - ((src[srcOff] << 4) + (src[srcOff+1] >> 4)) & 0x3F); - dst[dstOff + 2] = - (byte)ENCODE_TABLE.charAt( - ((src[srcOff+1] << 2) + (src[srcOff+2] >> 6)) & 0x3F); - dst[dstOff + 3] = - (byte)ENCODE_TABLE.charAt(src[srcOff+2] & 0x3F); - } - else if (len == 2) { - dst[dstOff+1] = - (byte)ENCODE_TABLE.charAt( - ((src[srcOff] << 4) + (src[srcOff+1] >> 4)) & 0x3F); - dst[dstOff + 2] = - (byte)ENCODE_TABLE.charAt((src[srcOff+1] << 2) & 0x3F); - - } - else { // len == 1) { - dst[dstOff + 1] = - (byte)ENCODE_TABLE.charAt((src[srcOff] << 4) & 0x3F); - } - } - - private static final byte[] DECODE_TABLE = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, - 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, - 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, - -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, - 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - }; - - /** - * Decode len bytes of data in src at offset srcOff, storing the result into - * dst at offset dstOff. len must be 2, 3, or 4. dst must have at least len-1 - * bytes of space at dstOff. src and dst may be the same object as long as - * dstoff <= srcOff. This method does no validation of the input values in - * the interest of performance. - * - * @param src the source of bytes to decode - * @param srcOff the offset into the source to read the encoded bytes - * @param len the number of bytes to decode (must be 2, 3, or 4) - * @param dst the destination for the decoding - * @param dstOff the offset into the destination to place the decoded bytes - */ - static final void decode(byte[] src, int srcOff, int len, byte[] dst, - int dstOff) { - dst[dstOff] = (byte) - ((DECODE_TABLE[src[srcOff] & 0x0FF] << 2) | - (DECODE_TABLE[src[srcOff+1] & 0x0FF] >> 4)); - if (len > 2) { - dst[dstOff+1] = (byte) - (((DECODE_TABLE[src[srcOff+1] & 0x0FF] << 4) & 0xF0) | - (DECODE_TABLE[src[srcOff+2] & 0x0FF] >> 2)); - if (len > 3) { - dst[dstOff+2] = (byte) - (((DECODE_TABLE[src[srcOff+2] & 0x0FF] << 6) & 0xC0) | - DECODE_TABLE[src[srcOff+3] & 0x0FF]); - } - } - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java b/app/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java deleted file mode 100644 index d0d993b..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TBinaryProtocol.java +++ /dev/null @@ -1,398 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; - -import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransport; - -/** - * Binary protocol implementation for thrift. - * - */ -public class TBinaryProtocol extends TProtocol { - private static final TStruct ANONYMOUS_STRUCT = new TStruct(); - - protected static final int VERSION_MASK = 0xffff0000; - protected static final int VERSION_1 = 0x80010000; - - protected boolean strictRead_ = false; - protected boolean strictWrite_ = true; - - protected int readLength_; - protected boolean checkReadLength_ = false; - - /** - * Factory - */ - public static class Factory implements TProtocolFactory { - protected boolean strictRead_ = false; - protected boolean strictWrite_ = true; - protected int readLength_; - - public Factory() { - this(false, true); - } - - public Factory(boolean strictRead, boolean strictWrite) { - this(strictRead, strictWrite, 0); - } - - public Factory(boolean strictRead, boolean strictWrite, int readLength) { - strictRead_ = strictRead; - strictWrite_ = strictWrite; - readLength_ = readLength; - } - - public TProtocol getProtocol(TTransport trans) { - TBinaryProtocol proto = new TBinaryProtocol(trans, strictRead_, strictWrite_); - if (readLength_ != 0) { - proto.setReadLength(readLength_); - } - return proto; - } - } - - /** - * Constructor - */ - public TBinaryProtocol(TTransport trans) { - this(trans, false, true); - } - - public TBinaryProtocol(TTransport trans, boolean strictRead, boolean strictWrite) { - super(trans); - strictRead_ = strictRead; - strictWrite_ = strictWrite; - } - - public void writeMessageBegin(TMessage message) throws TException { - if (strictWrite_) { - int version = VERSION_1 | message.type; - writeI32(version); - writeString(message.name); - writeI32(message.seqid); - } else { - writeString(message.name); - writeByte(message.type); - writeI32(message.seqid); - } - } - - public void writeMessageEnd() {} - - public void writeStructBegin(TStruct struct) {} - - public void writeStructEnd() {} - - public void writeFieldBegin(TField field) throws TException { - writeByte(field.type); - writeI16(field.id); - } - - public void writeFieldEnd() {} - - public void writeFieldStop() throws TException { - writeByte(TType.STOP); - } - - public void writeMapBegin(TMap map) throws TException { - writeByte(map.keyType); - writeByte(map.valueType); - writeI32(map.size); - } - - public void writeMapEnd() {} - - public void writeListBegin(TList list) throws TException { - writeByte(list.elemType); - writeI32(list.size); - } - - public void writeListEnd() {} - - public void writeSetBegin(TSet set) throws TException { - writeByte(set.elemType); - writeI32(set.size); - } - - public void writeSetEnd() {} - - public void writeBool(boolean b) throws TException { - writeByte(b ? (byte)1 : (byte)0); - } - - private byte [] bout = new byte[1]; - public void writeByte(byte b) throws TException { - bout[0] = b; - trans_.write(bout, 0, 1); - } - - private byte[] i16out = new byte[2]; - public void writeI16(short i16) throws TException { - i16out[0] = (byte)(0xff & (i16 >> 8)); - i16out[1] = (byte)(0xff & (i16)); - trans_.write(i16out, 0, 2); - } - - private byte[] i32out = new byte[4]; - public void writeI32(int i32) throws TException { - i32out[0] = (byte)(0xff & (i32 >> 24)); - i32out[1] = (byte)(0xff & (i32 >> 16)); - i32out[2] = (byte)(0xff & (i32 >> 8)); - i32out[3] = (byte)(0xff & (i32)); - trans_.write(i32out, 0, 4); - } - - private byte[] i64out = new byte[8]; - public void writeI64(long i64) throws TException { - i64out[0] = (byte)(0xff & (i64 >> 56)); - i64out[1] = (byte)(0xff & (i64 >> 48)); - i64out[2] = (byte)(0xff & (i64 >> 40)); - i64out[3] = (byte)(0xff & (i64 >> 32)); - i64out[4] = (byte)(0xff & (i64 >> 24)); - i64out[5] = (byte)(0xff & (i64 >> 16)); - i64out[6] = (byte)(0xff & (i64 >> 8)); - i64out[7] = (byte)(0xff & (i64)); - trans_.write(i64out, 0, 8); - } - - public void writeDouble(double dub) throws TException { - writeI64(Double.doubleToLongBits(dub)); - } - - public void writeString(String str) throws TException { - try { - byte[] dat = str.getBytes("UTF-8"); - writeI32(dat.length); - trans_.write(dat, 0, dat.length); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - public void writeBinary(ByteBuffer bin) throws TException { - int length = bin.limit() - bin.position(); - writeI32(length); - trans_.write(bin.array(), bin.position() + bin.arrayOffset(), length); - } - - /** - * Reading methods. - */ - - public TMessage readMessageBegin() throws TException { - int size = readI32(); - if (size < 0) { - int version = size & VERSION_MASK; - if (version != VERSION_1) { - throw new TProtocolException(TProtocolException.BAD_VERSION, "Bad version in readMessageBegin"); - } - return new TMessage(readString(), (byte)(size & 0x000000ff), readI32()); - } else { - if (strictRead_) { - throw new TProtocolException(TProtocolException.BAD_VERSION, "Missing version in readMessageBegin, old client?"); - } - return new TMessage(readStringBody(size), readByte(), readI32()); - } - } - - public void readMessageEnd() {} - - public TStruct readStructBegin() { - return ANONYMOUS_STRUCT; - } - - public void readStructEnd() {} - - public TField readFieldBegin() throws TException { - byte type = readByte(); - short id = type == TType.STOP ? 0 : readI16(); - return new TField("", type, id); - } - - public void readFieldEnd() {} - - public TMap readMapBegin() throws TException { - return new TMap(readByte(), readByte(), readI32()); - } - - public void readMapEnd() {} - - public TList readListBegin() throws TException { - return new TList(readByte(), readI32()); - } - - public void readListEnd() {} - - public TSet readSetBegin() throws TException { - return new TSet(readByte(), readI32()); - } - - public void readSetEnd() {} - - public boolean readBool() throws TException { - return (readByte() == 1); - } - - private byte[] bin = new byte[1]; - public byte readByte() throws TException { - if (trans_.getBytesRemainingInBuffer() >= 1) { - byte b = trans_.getBuffer()[trans_.getBufferPosition()]; - trans_.consumeBuffer(1); - return b; - } - readAll(bin, 0, 1); - return bin[0]; - } - - private byte[] i16rd = new byte[2]; - public short readI16() throws TException { - byte[] buf = i16rd; - int off = 0; - - if (trans_.getBytesRemainingInBuffer() >= 2) { - buf = trans_.getBuffer(); - off = trans_.getBufferPosition(); - trans_.consumeBuffer(2); - } else { - readAll(i16rd, 0, 2); - } - - return - (short) - (((buf[off] & 0xff) << 8) | - ((buf[off+1] & 0xff))); - } - - private byte[] i32rd = new byte[4]; - public int readI32() throws TException { - byte[] buf = i32rd; - int off = 0; - - if (trans_.getBytesRemainingInBuffer() >= 4) { - buf = trans_.getBuffer(); - off = trans_.getBufferPosition(); - trans_.consumeBuffer(4); - } else { - readAll(i32rd, 0, 4); - } - return - ((buf[off] & 0xff) << 24) | - ((buf[off+1] & 0xff) << 16) | - ((buf[off+2] & 0xff) << 8) | - ((buf[off+3] & 0xff)); - } - - private byte[] i64rd = new byte[8]; - public long readI64() throws TException { - byte[] buf = i64rd; - int off = 0; - - if (trans_.getBytesRemainingInBuffer() >= 8) { - buf = trans_.getBuffer(); - off = trans_.getBufferPosition(); - trans_.consumeBuffer(8); - } else { - readAll(i64rd, 0, 8); - } - - return - ((long)(buf[off] & 0xff) << 56) | - ((long)(buf[off+1] & 0xff) << 48) | - ((long)(buf[off+2] & 0xff) << 40) | - ((long)(buf[off+3] & 0xff) << 32) | - ((long)(buf[off+4] & 0xff) << 24) | - ((long)(buf[off+5] & 0xff) << 16) | - ((long)(buf[off+6] & 0xff) << 8) | - ((long)(buf[off+7] & 0xff)); - } - - public double readDouble() throws TException { - return Double.longBitsToDouble(readI64()); - } - - public String readString() throws TException { - int size = readI32(); - - if (trans_.getBytesRemainingInBuffer() >= size) { - try { - String s = new String(trans_.getBuffer(), trans_.getBufferPosition(), size, "UTF-8"); - trans_.consumeBuffer(size); - return s; - } catch (UnsupportedEncodingException e) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - return readStringBody(size); - } - - public String readStringBody(int size) throws TException { - try { - checkReadLength(size); - byte[] buf = new byte[size]; - trans_.readAll(buf, 0, size); - return new String(buf, "UTF-8"); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - public ByteBuffer readBinary() throws TException { - int size = readI32(); - checkReadLength(size); - - if (trans_.getBytesRemainingInBuffer() >= size) { - ByteBuffer bb = ByteBuffer.wrap(trans_.getBuffer(), trans_.getBufferPosition(), size); - trans_.consumeBuffer(size); - return bb; - } - - byte[] buf = new byte[size]; - trans_.readAll(buf, 0, size); - return ByteBuffer.wrap(buf); - } - - private int readAll(byte[] buf, int off, int len) throws TException { - checkReadLength(len); - return trans_.readAll(buf, off, len); - } - - public void setReadLength(int readLength) { - readLength_ = readLength; - checkReadLength_ = true; - } - - protected void checkReadLength(int length) throws TException { - if (length < 0) { - throw new TException("Negative length: " + length); - } - if (checkReadLength_) { - readLength_ -= length; - if (readLength_ < 0) { - throw new TException("Message length exceeded: " + length); - } - } - } - -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java b/app/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java deleted file mode 100644 index 3b1d886..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TCompactProtocol.java +++ /dev/null @@ -1,816 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -package org.apache.thrift.protocol; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; - -import org.apache.thrift.ShortStack; -import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransport; - -/** - * TCompactProtocol2 is the Java implementation of the compact protocol specified - * in THRIFT-110. The fundamental approach to reducing the overhead of - * structures is a) use variable-length integers all over the place and b) make - * use of unused bits wherever possible. Your savings will obviously vary - * based on the specific makeup of your structs, but in general, the more - * fields, nested structures, short strings and collections, and low-value i32 - * and i64 fields you have, the more benefit you'll see. - */ -public class TCompactProtocol extends TProtocol { - - private final static TStruct ANONYMOUS_STRUCT = new TStruct(""); - private final static TField TSTOP = new TField("", TType.STOP, (short)0); - - private final static byte[] ttypeToCompactType = new byte[16]; - - static { - ttypeToCompactType[TType.STOP] = TType.STOP; - ttypeToCompactType[TType.BOOL] = Types.BOOLEAN_TRUE; - ttypeToCompactType[TType.BYTE] = Types.BYTE; - ttypeToCompactType[TType.I16] = Types.I16; - ttypeToCompactType[TType.I32] = Types.I32; - ttypeToCompactType[TType.I64] = Types.I64; - ttypeToCompactType[TType.DOUBLE] = Types.DOUBLE; - ttypeToCompactType[TType.STRING] = Types.BINARY; - ttypeToCompactType[TType.LIST] = Types.LIST; - ttypeToCompactType[TType.SET] = Types.SET; - ttypeToCompactType[TType.MAP] = Types.MAP; - ttypeToCompactType[TType.STRUCT] = Types.STRUCT; - } - - /** - * TProtocolFactory that produces TCompactProtocols. - */ - public static class Factory implements TProtocolFactory { - public Factory() {} - - public TProtocol getProtocol(TTransport trans) { - return new TCompactProtocol(trans); - } - } - - private static final byte PROTOCOL_ID = (byte)0x82; - private static final byte VERSION = 1; - private static final byte VERSION_MASK = 0x1f; // 0001 1111 - private static final byte TYPE_MASK = (byte)0xE0; // 1110 0000 - private static final int TYPE_SHIFT_AMOUNT = 5; - - /** - * All of the on-wire type codes. - */ - private static class Types { - public static final byte BOOLEAN_TRUE = 0x01; - public static final byte BOOLEAN_FALSE = 0x02; - public static final byte BYTE = 0x03; - public static final byte I16 = 0x04; - public static final byte I32 = 0x05; - public static final byte I64 = 0x06; - public static final byte DOUBLE = 0x07; - public static final byte BINARY = 0x08; - public static final byte LIST = 0x09; - public static final byte SET = 0x0A; - public static final byte MAP = 0x0B; - public static final byte STRUCT = 0x0C; - } - - /** - * Used to keep track of the last field for the current and previous structs, - * so we can do the delta stuff. - */ - private ShortStack lastField_ = new ShortStack(15); - - private short lastFieldId_ = 0; - - /** - * If we encounter a boolean field begin, save the TField here so it can - * have the value incorporated. - */ - private TField booleanField_ = null; - - /** - * If we read a field header, and it's a boolean field, save the boolean - * value here so that readBool can use it. - */ - private Boolean boolValue_ = null; - - /** - * Create a TCompactProtocol. - * - * @param transport the TTransport object to read from or write to. - */ - public TCompactProtocol(TTransport transport) { - super(transport); - } - - @Override - public void reset() { - lastField_.clear(); - lastFieldId_ = 0; - } - - // - // Public Writing methods. - // - - /** - * Write a message header to the wire. Compact Protocol messages contain the - * protocol version so we can migrate forwards in the future if need be. - */ - public void writeMessageBegin(TMessage message) throws TException { - writeByteDirect(PROTOCOL_ID); - writeByteDirect((VERSION & VERSION_MASK) | ((message.type << TYPE_SHIFT_AMOUNT) & TYPE_MASK)); - writeVarint32(message.seqid); - writeString(message.name); - } - - /** - * Write a struct begin. This doesn't actually put anything on the wire. We - * use it as an opportunity to put special placeholder markers on the field - * stack so we can get the field id deltas correct. - */ - public void writeStructBegin(TStruct struct) throws TException { - lastField_.push(lastFieldId_); - lastFieldId_ = 0; - } - - /** - * Write a struct end. This doesn't actually put anything on the wire. We use - * this as an opportunity to pop the last field from the current struct off - * of the field stack. - */ - public void writeStructEnd() throws TException { - lastFieldId_ = lastField_.pop(); - } - - /** - * Write a field header containing the field id and field type. If the - * difference between the current field id and the last one is small (< 15), - * then the field id will be encoded in the 4 MSB as a delta. Otherwise, the - * field id will follow the type header as a zigzag varint. - */ - public void writeFieldBegin(TField field) throws TException { - if (field.type == TType.BOOL) { - // we want to possibly include the value, so we'll wait. - booleanField_ = field; - } else { - writeFieldBeginInternal(field, (byte)-1); - } - } - - /** - * The workhorse of writeFieldBegin. It has the option of doing a - * 'type override' of the type header. This is used specifically in the - * boolean field case. - */ - private void writeFieldBeginInternal(TField field, byte typeOverride) throws TException { - // short lastField = lastField_.pop(); - - // if there's a type override, use that. - byte typeToWrite = typeOverride == -1 ? getCompactType(field.type) : typeOverride; - - // check if we can use delta encoding for the field id - if (field.id > lastFieldId_ && field.id - lastFieldId_ <= 15) { - // write them together - writeByteDirect((field.id - lastFieldId_) << 4 | typeToWrite); - } else { - // write them separate - writeByteDirect(typeToWrite); - writeI16(field.id); - } - - lastFieldId_ = field.id; - // lastField_.push(field.id); - } - - /** - * Write the STOP symbol so we know there are no more fields in this struct. - */ - public void writeFieldStop() throws TException { - writeByteDirect(TType.STOP); - } - - /** - * Write a map header. If the map is empty, omit the key and value type - * headers, as we don't need any additional information to skip it. - */ - public void writeMapBegin(TMap map) throws TException { - if (map.size == 0) { - writeByteDirect(0); - } else { - writeVarint32(map.size); - writeByteDirect(getCompactType(map.keyType) << 4 | getCompactType(map.valueType)); - } - } - - /** - * Write a list header. - */ - public void writeListBegin(TList list) throws TException { - writeCollectionBegin(list.elemType, list.size); - } - - /** - * Write a set header. - */ - public void writeSetBegin(TSet set) throws TException { - writeCollectionBegin(set.elemType, set.size); - } - - /** - * Write a boolean value. Potentially, this could be a boolean field, in - * which case the field header info isn't written yet. If so, decide what the - * right type header is for the value and then write the field header. - * Otherwise, write a single byte. - */ - public void writeBool(boolean b) throws TException { - if (booleanField_ != null) { - // we haven't written the field header yet - writeFieldBeginInternal(booleanField_, b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE); - booleanField_ = null; - } else { - // we're not part of a field, so just write the value. - writeByteDirect(b ? Types.BOOLEAN_TRUE : Types.BOOLEAN_FALSE); - } - } - - /** - * Write a byte. Nothing to see here! - */ - public void writeByte(byte b) throws TException { - writeByteDirect(b); - } - - /** - * Write an I16 as a zigzag varint. - */ - public void writeI16(short i16) throws TException { - writeVarint32(intToZigZag(i16)); - } - - /** - * Write an i32 as a zigzag varint. - */ - public void writeI32(int i32) throws TException { - writeVarint32(intToZigZag(i32)); - } - - /** - * Write an i64 as a zigzag varint. - */ - public void writeI64(long i64) throws TException { - writeVarint64(longToZigzag(i64)); - } - - /** - * Write a double to the wire as 8 bytes. - */ - public void writeDouble(double dub) throws TException { - byte[] data = new byte[]{0, 0, 0, 0, 0, 0, 0, 0}; - fixedLongToBytes(Double.doubleToLongBits(dub), data, 0); - trans_.write(data); - } - - /** - * Write a string to the wire with a varint size preceding. - */ - public void writeString(String str) throws TException { - try { - byte[] bytes = str.getBytes("UTF-8"); - writeBinary(bytes, 0, bytes.length); - } catch (UnsupportedEncodingException e) { - throw new TException("UTF-8 not supported!"); - } - } - - /** - * Write a byte array, using a varint for the size. - */ - public void writeBinary(ByteBuffer bin) throws TException { - int length = bin.limit() - bin.position(); - writeBinary(bin.array(), bin.position() + bin.arrayOffset(), length); - } - - private void writeBinary(byte[] buf, int offset, int length) throws TException { - writeVarint32(length); - trans_.write(buf, offset, length); - } - - // - // These methods are called by structs, but don't actually have any wire - // output or purpose. - // - - public void writeMessageEnd() throws TException {} - public void writeMapEnd() throws TException {} - public void writeListEnd() throws TException {} - public void writeSetEnd() throws TException {} - public void writeFieldEnd() throws TException {} - - // - // Internal writing methods - // - - /** - * Abstract method for writing the start of lists and sets. List and sets on - * the wire differ only by the type indicator. - */ - protected void writeCollectionBegin(byte elemType, int size) throws TException { - if (size <= 14) { - writeByteDirect(size << 4 | getCompactType(elemType)); - } else { - writeByteDirect(0xf0 | getCompactType(elemType)); - writeVarint32(size); - } - } - - /** - * Write an i32 as a varint. Results in 1-5 bytes on the wire. - * TODO: make a permanent buffer like writeVarint64? - */ - byte[] i32buf = new byte[5]; - private void writeVarint32(int n) throws TException { - int idx = 0; - while (true) { - if ((n & ~0x7F) == 0) { - i32buf[idx++] = (byte)n; - // writeByteDirect((byte)n); - break; - // return; - } else { - i32buf[idx++] = (byte)((n & 0x7F) | 0x80); - // writeByteDirect((byte)((n & 0x7F) | 0x80)); - n >>>= 7; - } - } - trans_.write(i32buf, 0, idx); - } - - /** - * Write an i64 as a varint. Results in 1-10 bytes on the wire. - */ - byte[] varint64out = new byte[10]; - private void writeVarint64(long n) throws TException { - int idx = 0; - while (true) { - if ((n & ~0x7FL) == 0) { - varint64out[idx++] = (byte)n; - break; - } else { - varint64out[idx++] = ((byte)((n & 0x7F) | 0x80)); - n >>>= 7; - } - } - trans_.write(varint64out, 0, idx); - } - - /** - * Convert l into a zigzag long. This allows negative numbers to be - * represented compactly as a varint. - */ - private long longToZigzag(long l) { - return (l << 1) ^ (l >> 63); - } - - /** - * Convert n into a zigzag int. This allows negative numbers to be - * represented compactly as a varint. - */ - private int intToZigZag(int n) { - return (n << 1) ^ (n >> 31); - } - - /** - * Convert a long into little-endian bytes in buf starting at off and going - * until off+7. - */ - private void fixedLongToBytes(long n, byte[] buf, int off) { - buf[off+0] = (byte)( n & 0xff); - buf[off+1] = (byte)((n >> 8 ) & 0xff); - buf[off+2] = (byte)((n >> 16) & 0xff); - buf[off+3] = (byte)((n >> 24) & 0xff); - buf[off+4] = (byte)((n >> 32) & 0xff); - buf[off+5] = (byte)((n >> 40) & 0xff); - buf[off+6] = (byte)((n >> 48) & 0xff); - buf[off+7] = (byte)((n >> 56) & 0xff); - } - - /** - * Writes a byte without any possibility of all that field header nonsense. - * Used internally by other writing methods that know they need to write a byte. - */ - private byte[] byteDirectBuffer = new byte[1]; - private void writeByteDirect(byte b) throws TException { - byteDirectBuffer[0] = b; - trans_.write(byteDirectBuffer); - } - - /** - * Writes a byte without any possibility of all that field header nonsense. - */ - private void writeByteDirect(int n) throws TException { - writeByteDirect((byte)n); - } - - - // - // Reading methods. - // - - /** - * Read a message header. - */ - public TMessage readMessageBegin() throws TException { - byte protocolId = readByte(); - if (protocolId != PROTOCOL_ID) { - throw new TProtocolException("Expected protocol id " + Integer.toHexString(PROTOCOL_ID) + " but got " + Integer.toHexString(protocolId)); - } - byte versionAndType = readByte(); - byte version = (byte)(versionAndType & VERSION_MASK); - if (version != VERSION) { - throw new TProtocolException("Expected version " + VERSION + " but got " + version); - } - byte type = (byte)((versionAndType >> TYPE_SHIFT_AMOUNT) & 0x03); - int seqid = readVarint32(); - String messageName = readString(); - return new TMessage(messageName, type, seqid); - } - - /** - * Read a struct begin. There's nothing on the wire for this, but it is our - * opportunity to push a new struct begin marker onto the field stack. - */ - public TStruct readStructBegin() throws TException { - lastField_.push(lastFieldId_); - lastFieldId_ = 0; - return ANONYMOUS_STRUCT; - } - - /** - * Doesn't actually consume any wire data, just removes the last field for - * this struct from the field stack. - */ - public void readStructEnd() throws TException { - // consume the last field we read off the wire. - lastFieldId_ = lastField_.pop(); - } - - /** - * Read a field header off the wire. - */ - public TField readFieldBegin() throws TException { - byte type = readByte(); - - // if it's a stop, then we can return immediately, as the struct is over. - if (type == TType.STOP) { - return TSTOP; - } - - short fieldId; - - // mask off the 4 MSB of the type header. it could contain a field id delta. - short modifier = (short)((type & 0xf0) >> 4); - if (modifier == 0) { - // not a delta. look ahead for the zigzag varint field id. - fieldId = readI16(); - } else { - // has a delta. add the delta to the last read field id. - fieldId = (short)(lastFieldId_ + modifier); - } - - TField field = new TField("", getTType((byte)(type & 0x0f)), fieldId); - - // if this happens to be a boolean field, the value is encoded in the type - if (isBoolType(type)) { - // save the boolean value in a special instance variable. - boolValue_ = (byte)(type & 0x0f) == Types.BOOLEAN_TRUE ? Boolean.TRUE : Boolean.FALSE; - } - - // push the new field onto the field stack so we can keep the deltas going. - lastFieldId_ = field.id; - return field; - } - - /** - * Read a map header off the wire. If the size is zero, skip reading the key - * and value type. This means that 0-length maps will yield TMaps without the - * "correct" types. - */ - public TMap readMapBegin() throws TException { - int size = readVarint32(); - byte keyAndValueType = size == 0 ? 0 : readByte(); - return new TMap(getTType((byte)(keyAndValueType >> 4)), getTType((byte)(keyAndValueType & 0xf)), size); - } - - /** - * Read a list header off the wire. If the list size is 0-14, the size will - * be packed into the element type header. If it's a longer list, the 4 MSB - * of the element type header will be 0xF, and a varint will follow with the - * true size. - */ - public TList readListBegin() throws TException { - byte size_and_type = readByte(); - int size = (size_and_type >> 4) & 0x0f; - if (size == 15) { - size = readVarint32(); - } - byte type = getTType(size_and_type); - return new TList(type, size); - } - - /** - * Read a set header off the wire. If the set size is 0-14, the size will - * be packed into the element type header. If it's a longer set, the 4 MSB - * of the element type header will be 0xF, and a varint will follow with the - * true size. - */ - public TSet readSetBegin() throws TException { - return new TSet(readListBegin()); - } - - /** - * Read a boolean off the wire. If this is a boolean field, the value should - * already have been read during readFieldBegin, so we'll just consume the - * pre-stored value. Otherwise, read a byte. - */ - public boolean readBool() throws TException { - if (boolValue_ != null) { - boolean result = boolValue_.booleanValue(); - boolValue_ = null; - return result; - } - return readByte() == Types.BOOLEAN_TRUE; - } - - byte[] byteRawBuf = new byte[1]; - /** - * Read a single byte off the wire. Nothing interesting here. - */ - public byte readByte() throws TException { - byte b; - if (trans_.getBytesRemainingInBuffer() > 0) { - b = trans_.getBuffer()[trans_.getBufferPosition()]; - trans_.consumeBuffer(1); - } else { - trans_.readAll(byteRawBuf, 0, 1); - b = byteRawBuf[0]; - } - return b; - } - - /** - * Read an i16 from the wire as a zigzag varint. - */ - public short readI16() throws TException { - return (short)zigzagToInt(readVarint32()); - } - - /** - * Read an i32 from the wire as a zigzag varint. - */ - public int readI32() throws TException { - return zigzagToInt(readVarint32()); - } - - /** - * Read an i64 from the wire as a zigzag varint. - */ - public long readI64() throws TException { - return zigzagToLong(readVarint64()); - } - - /** - * No magic here - just read a double off the wire. - */ - public double readDouble() throws TException { - byte[] longBits = new byte[8]; - trans_.readAll(longBits, 0, 8); - return Double.longBitsToDouble(bytesToLong(longBits)); - } - - /** - * Reads a byte[] (via readBinary), and then UTF-8 decodes it. - */ - public String readString() throws TException { - int length = readVarint32(); - - if (length == 0) { - return ""; - } - - try { - if (trans_.getBytesRemainingInBuffer() >= length) { - String str = new String(trans_.getBuffer(), trans_.getBufferPosition(), length, "UTF-8"); - trans_.consumeBuffer(length); - return str; - } else { - return new String(readBinary(length), "UTF-8"); - } - } catch (UnsupportedEncodingException e) { - throw new TException("UTF-8 not supported!"); - } - } - - /** - * Read a byte[] from the wire. - */ - public ByteBuffer readBinary() throws TException { - int length = readVarint32(); - if (length == 0) return ByteBuffer.wrap(new byte[0]); - - byte[] buf = new byte[length]; - trans_.readAll(buf, 0, length); - return ByteBuffer.wrap(buf); - } - - /** - * Read a byte[] of a known length from the wire. - */ - private byte[] readBinary(int length) throws TException { - if (length == 0) return new byte[0]; - - byte[] buf = new byte[length]; - trans_.readAll(buf, 0, length); - return buf; - } - - // - // These methods are here for the struct to call, but don't have any wire - // encoding. - // - public void readMessageEnd() throws TException {} - public void readFieldEnd() throws TException {} - public void readMapEnd() throws TException {} - public void readListEnd() throws TException {} - public void readSetEnd() throws TException {} - - // - // Internal reading methods - // - - /** - * Read an i32 from the wire as a varint. The MSB of each byte is set - * if there is another byte to follow. This can read up to 5 bytes. - */ - private int readVarint32() throws TException { - int result = 0; - int shift = 0; - if (trans_.getBytesRemainingInBuffer() >= 5) { - byte[] buf = trans_.getBuffer(); - int pos = trans_.getBufferPosition(); - int off = 0; - while (true) { - byte b = buf[pos+off]; - result |= (int) (b & 0x7f) << shift; - if ((b & 0x80) != 0x80) break; - shift += 7; - off++; - } - trans_.consumeBuffer(off+1); - } else { - while (true) { - byte b = readByte(); - result |= (int) (b & 0x7f) << shift; - if ((b & 0x80) != 0x80) break; - shift += 7; - } - } - return result; - } - - /** - * Read an i64 from the wire as a proper varint. The MSB of each byte is set - * if there is another byte to follow. This can read up to 10 bytes. - */ - private long readVarint64() throws TException { - int shift = 0; - long result = 0; - if (trans_.getBytesRemainingInBuffer() >= 10) { - byte[] buf = trans_.getBuffer(); - int pos = trans_.getBufferPosition(); - int off = 0; - while (true) { - byte b = buf[pos+off]; - result |= (long) (b & 0x7f) << shift; - if ((b & 0x80) != 0x80) break; - shift += 7; - off++; - } - trans_.consumeBuffer(off+1); - } else { - while (true) { - byte b = readByte(); - result |= (long) (b & 0x7f) << shift; - if ((b & 0x80) != 0x80) break; - shift +=7; - } - } - return result; - } - - // - // encoding helpers - // - - /** - * Convert from zigzag int to int. - */ - private int zigzagToInt(int n) { - return (n >>> 1) ^ -(n & 1); - } - - /** - * Convert from zigzag long to long. - */ - private long zigzagToLong(long n) { - return (n >>> 1) ^ -(n & 1); - } - - /** - * Note that it's important that the mask bytes are long literals, - * otherwise they'll default to ints, and when you shift an int left 56 bits, - * you just get a messed up int. - */ - private long bytesToLong(byte[] bytes) { - return - ((bytes[7] & 0xffL) << 56) | - ((bytes[6] & 0xffL) << 48) | - ((bytes[5] & 0xffL) << 40) | - ((bytes[4] & 0xffL) << 32) | - ((bytes[3] & 0xffL) << 24) | - ((bytes[2] & 0xffL) << 16) | - ((bytes[1] & 0xffL) << 8) | - ((bytes[0] & 0xffL)); - } - - // - // type testing and converting - // - - private boolean isBoolType(byte b) { - int lowerNibble = b & 0x0f; - return lowerNibble == Types.BOOLEAN_TRUE || lowerNibble == Types.BOOLEAN_FALSE; - } - - /** - * Given a TCompactProtocol.Types constant, convert it to its corresponding - * TType value. - */ - private byte getTType(byte type) throws TProtocolException { - switch ((byte)(type & 0x0f)) { - case TType.STOP: - return TType.STOP; - case Types.BOOLEAN_FALSE: - case Types.BOOLEAN_TRUE: - return TType.BOOL; - case Types.BYTE: - return TType.BYTE; - case Types.I16: - return TType.I16; - case Types.I32: - return TType.I32; - case Types.I64: - return TType.I64; - case Types.DOUBLE: - return TType.DOUBLE; - case Types.BINARY: - return TType.STRING; - case Types.LIST: - return TType.LIST; - case Types.SET: - return TType.SET; - case Types.MAP: - return TType.MAP; - case Types.STRUCT: - return TType.STRUCT; - default: - throw new TProtocolException("don't know what type: " + (byte)(type & 0x0f)); - } - } - - /** - * Given a TType value, find the appropriate TCompactProtocol.Types constant. - */ - private byte getCompactType(byte ttype) { - return ttypeToCompactType[ttype]; - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TField.java b/app/src/main/java/org/apache/thrift/protocol/TField.java deleted file mode 100644 index 03affda..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TField.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Helper class that encapsulates field metadata. - * - */ -public class TField { - public TField() { - this("", TType.STOP, (short)0); - } - - public TField(String n, byte t, short i) { - name = n; - type = t; - id = i; - } - - public final String name; - public final byte type; - public final short id; - - public String toString() { - return ""; - } - - public boolean equals(TField otherField) { - return type == otherField.type && id == otherField.id; - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java b/app/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java deleted file mode 100644 index f07a4a7..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TJSONProtocol.java +++ /dev/null @@ -1,936 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; -import java.util.Stack; - -import org.apache.thrift.TByteArrayOutputStream; -import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransport; - -/** - * JSON protocol implementation for thrift. - * - * This is a full-featured protocol supporting write and read. - * - * Please see the C++ class header for a detailed description of the - * protocol's wire format. - * - */ -public class TJSONProtocol extends TProtocol { - - /** - * Factory for JSON protocol objects - */ - public static class Factory implements TProtocolFactory { - - public TProtocol getProtocol(TTransport trans) { - return new TJSONProtocol(trans); - } - - } - - private static final byte[] COMMA = new byte[] {','}; - private static final byte[] COLON = new byte[] {':'}; - private static final byte[] LBRACE = new byte[] {'{'}; - private static final byte[] RBRACE = new byte[] {'}'}; - private static final byte[] LBRACKET = new byte[] {'['}; - private static final byte[] RBRACKET = new byte[] {']'}; - private static final byte[] QUOTE = new byte[] {'"'}; - private static final byte[] BACKSLASH = new byte[] {'\\'}; - private static final byte[] ZERO = new byte[] {'0'}; - - private static final byte[] ESCSEQ = new byte[] {'\\','u','0','0'}; - - private static final long VERSION = 1; - - private static final byte[] JSON_CHAR_TABLE = { - /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - 0, 0, 0, 0, 0, 0, 0, 0,'b','t','n', 0,'f','r', 0, 0, // 0 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 - 1, 1,'"', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 2 - }; - - private static final String ESCAPE_CHARS = "\"\\bfnrt"; - - private static final byte[] ESCAPE_CHAR_VALS = { - '"', '\\', '\b', '\f', '\n', '\r', '\t', - }; - - private static final int DEF_STRING_SIZE = 16; - - private static final byte[] NAME_BOOL = new byte[] {'t', 'f'}; - private static final byte[] NAME_BYTE = new byte[] {'i','8'}; - private static final byte[] NAME_I16 = new byte[] {'i','1','6'}; - private static final byte[] NAME_I32 = new byte[] {'i','3','2'}; - private static final byte[] NAME_I64 = new byte[] {'i','6','4'}; - private static final byte[] NAME_DOUBLE = new byte[] {'d','b','l'}; - private static final byte[] NAME_STRUCT = new byte[] {'r','e','c'}; - private static final byte[] NAME_STRING = new byte[] {'s','t','r'}; - private static final byte[] NAME_MAP = new byte[] {'m','a','p'}; - private static final byte[] NAME_LIST = new byte[] {'l','s','t'}; - private static final byte[] NAME_SET = new byte[] {'s','e','t'}; - - private static final TStruct ANONYMOUS_STRUCT = new TStruct(); - - private static final byte[] getTypeNameForTypeID(byte typeID) - throws TException { - switch (typeID) { - case TType.BOOL: - return NAME_BOOL; - case TType.BYTE: - return NAME_BYTE; - case TType.I16: - return NAME_I16; - case TType.I32: - return NAME_I32; - case TType.I64: - return NAME_I64; - case TType.DOUBLE: - return NAME_DOUBLE; - case TType.STRING: - return NAME_STRING; - case TType.STRUCT: - return NAME_STRUCT; - case TType.MAP: - return NAME_MAP; - case TType.SET: - return NAME_SET; - case TType.LIST: - return NAME_LIST; - default: - throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, - "Unrecognized type"); - } - } - - private static final byte getTypeIDForTypeName(byte[] name) - throws TException { - byte result = TType.STOP; - if (name.length > 1) { - switch (name[0]) { - case 'd': - result = TType.DOUBLE; - break; - case 'i': - switch (name[1]) { - case '8': - result = TType.BYTE; - break; - case '1': - result = TType.I16; - break; - case '3': - result = TType.I32; - break; - case '6': - result = TType.I64; - break; - } - break; - case 'l': - result = TType.LIST; - break; - case 'm': - result = TType.MAP; - break; - case 'r': - result = TType.STRUCT; - break; - case 's': - if (name[1] == 't') { - result = TType.STRING; - } - else if (name[1] == 'e') { - result = TType.SET; - } - break; - case 't': - result = TType.BOOL; - break; - } - } - if (result == TType.STOP) { - throw new TProtocolException(TProtocolException.NOT_IMPLEMENTED, - "Unrecognized type"); - } - return result; - } - - // Base class for tracking JSON contexts that may require inserting/reading - // additional JSON syntax characters - // This base context does nothing. - protected class JSONBaseContext { - protected void write() throws TException {} - - protected void read() throws TException {} - - protected boolean escapeNum() { return false; } - } - - // Context for JSON lists. Will insert/read commas before each item except - // for the first one - protected class JSONListContext extends JSONBaseContext { - private boolean first_ = true; - - @Override - protected void write() throws TException { - if (first_) { - first_ = false; - } else { - trans_.write(COMMA); - } - } - - @Override - protected void read() throws TException { - if (first_) { - first_ = false; - } else { - readJSONSyntaxChar(COMMA); - } - } - } - - // Context for JSON records. Will insert/read colons before the value portion - // of each record pair, and commas before each key except the first. In - // addition, will indicate that numbers in the key position need to be - // escaped in quotes (since JSON keys must be strings). - protected class JSONPairContext extends JSONBaseContext { - private boolean first_ = true; - private boolean colon_ = true; - - @Override - protected void write() throws TException { - if (first_) { - first_ = false; - colon_ = true; - } else { - trans_.write(colon_ ? COLON : COMMA); - colon_ = !colon_; - } - } - - @Override - protected void read() throws TException { - if (first_) { - first_ = false; - colon_ = true; - } else { - readJSONSyntaxChar(colon_ ? COLON : COMMA); - colon_ = !colon_; - } - } - - @Override - protected boolean escapeNum() { - return colon_; - } - } - - // Holds up to one byte from the transport - protected class LookaheadReader { - - private boolean hasData_; - private byte[] data_ = new byte[1]; - - // Return and consume the next byte to be read, either taking it from the - // data buffer if present or getting it from the transport otherwise. - protected byte read() throws TException { - if (hasData_) { - hasData_ = false; - } - else { - trans_.readAll(data_, 0, 1); - } - return data_[0]; - } - - // Return the next byte to be read without consuming, filling the data - // buffer if it has not been filled already. - protected byte peek() throws TException { - if (!hasData_) { - trans_.readAll(data_, 0, 1); - } - hasData_ = true; - return data_[0]; - } - } - - // Stack of nested contexts that we may be in - private Stack contextStack_ = new Stack(); - - // Current context that we are in - private JSONBaseContext context_ = new JSONBaseContext(); - - // Reader that manages a 1-byte buffer - private LookaheadReader reader_ = new LookaheadReader(); - - // Push a new JSON context onto the stack. - private void pushContext(JSONBaseContext c) { - contextStack_.push(context_); - context_ = c; - } - - // Pop the last JSON context off the stack - private void popContext() { - context_ = contextStack_.pop(); - } - - /** - * Constructor - */ - public TJSONProtocol(TTransport trans) { - super(trans); - } - - @Override - public void reset() { - contextStack_.clear(); - context_ = new JSONBaseContext(); - reader_ = new LookaheadReader(); - } - - // Temporary buffer used by several methods - private byte[] tmpbuf_ = new byte[4]; - - // Read a byte that must match b[0]; otherwise an exception is thrown. - // Marked protected to avoid synthetic accessor in JSONListContext.read - // and JSONPairContext.read - protected void readJSONSyntaxChar(byte[] b) throws TException { - byte ch = reader_.read(); - if (ch != b[0]) { - throw new TProtocolException(TProtocolException.INVALID_DATA, - "Unexpected character:" + (char)ch); - } - } - - // Convert a byte containing a hex char ('0'-'9' or 'a'-'f') into its - // corresponding hex value - private static final byte hexVal(byte ch) throws TException { - if ((ch >= '0') && (ch <= '9')) { - return (byte)((char)ch - '0'); - } - else if ((ch >= 'a') && (ch <= 'f')) { - return (byte)((char)ch - 'a' + 10); - } - else { - throw new TProtocolException(TProtocolException.INVALID_DATA, - "Expected hex character"); - } - } - - // Convert a byte containing a hex value to its corresponding hex character - private static final byte hexChar(byte val) { - val &= 0x0F; - if (val < 10) { - return (byte)((char)val + '0'); - } - else { - return (byte)((char)(val - 10) + 'a'); - } - } - - // Write the bytes in array buf as a JSON characters, escaping as needed - private void writeJSONString(byte[] b) throws TException { - context_.write(); - trans_.write(QUOTE); - int len = b.length; - for (int i = 0; i < len; i++) { - if ((b[i] & 0x00FF) >= 0x30) { - if (b[i] == BACKSLASH[0]) { - trans_.write(BACKSLASH); - trans_.write(BACKSLASH); - } - else { - trans_.write(b, i, 1); - } - } - else { - tmpbuf_[0] = JSON_CHAR_TABLE[b[i]]; - if (tmpbuf_[0] == 1) { - trans_.write(b, i, 1); - } - else if (tmpbuf_[0] > 1) { - trans_.write(BACKSLASH); - trans_.write(tmpbuf_, 0, 1); - } - else { - trans_.write(ESCSEQ); - tmpbuf_[0] = hexChar((byte)(b[i] >> 4)); - tmpbuf_[1] = hexChar(b[i]); - trans_.write(tmpbuf_, 0, 2); - } - } - } - trans_.write(QUOTE); - } - - // Write out number as a JSON value. If the context dictates so, it will be - // wrapped in quotes to output as a JSON string. - private void writeJSONInteger(long num) throws TException { - context_.write(); - String str = Long.toString(num); - boolean escapeNum = context_.escapeNum(); - if (escapeNum) { - trans_.write(QUOTE); - } - try { - byte[] buf = str.getBytes("UTF-8"); - trans_.write(buf); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - if (escapeNum) { - trans_.write(QUOTE); - } - } - - // Write out a double as a JSON value. If it is NaN or infinity or if the - // context dictates escaping, write out as JSON string. - private void writeJSONDouble(double num) throws TException { - context_.write(); - String str = Double.toString(num); - boolean special = false; - switch (str.charAt(0)) { - case 'N': // NaN - case 'I': // Infinity - special = true; - break; - case '-': - if (str.charAt(1) == 'I') { // -Infinity - special = true; - } - break; - } - - boolean escapeNum = special || context_.escapeNum(); - if (escapeNum) { - trans_.write(QUOTE); - } - try { - byte[] b = str.getBytes("UTF-8"); - trans_.write(b, 0, b.length); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - if (escapeNum) { - trans_.write(QUOTE); - } - } - - // Write out contents of byte array b as a JSON string with base-64 encoded - // data - private void writeJSONBase64(byte[] b, int offset, int length) throws TException { - context_.write(); - trans_.write(QUOTE); - int len = length; - int off = offset; - while (len >= 3) { - // Encode 3 bytes at a time - TBase64Utils.encode(b, off, 3, tmpbuf_, 0); - trans_.write(tmpbuf_, 0, 4); - off += 3; - len -= 3; - } - if (len > 0) { - // Encode remainder - TBase64Utils.encode(b, off, len, tmpbuf_, 0); - trans_.write(tmpbuf_, 0, len + 1); - } - trans_.write(QUOTE); - } - - private void writeJSONObjectStart() throws TException { - context_.write(); - trans_.write(LBRACE); - pushContext(new JSONPairContext()); - } - - private void writeJSONObjectEnd() throws TException { - popContext(); - trans_.write(RBRACE); - } - - private void writeJSONArrayStart() throws TException { - context_.write(); - trans_.write(LBRACKET); - pushContext(new JSONListContext()); - } - - private void writeJSONArrayEnd() throws TException { - popContext(); - trans_.write(RBRACKET); - } - - @Override - public void writeMessageBegin(TMessage message) throws TException { - writeJSONArrayStart(); - writeJSONInteger(VERSION); - try { - byte[] b = message.name.getBytes("UTF-8"); - writeJSONString(b); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - writeJSONInteger(message.type); - writeJSONInteger(message.seqid); - } - - @Override - public void writeMessageEnd() throws TException { - writeJSONArrayEnd(); - } - - @Override - public void writeStructBegin(TStruct struct) throws TException { - writeJSONObjectStart(); - } - - @Override - public void writeStructEnd() throws TException { - writeJSONObjectEnd(); - } - - @Override - public void writeFieldBegin(TField field) throws TException { - writeJSONInteger(field.id); - writeJSONObjectStart(); - writeJSONString(getTypeNameForTypeID(field.type)); - } - - @Override - public void writeFieldEnd() throws TException { - writeJSONObjectEnd(); - } - - @Override - public void writeFieldStop() {} - - @Override - public void writeMapBegin(TMap map) throws TException { - writeJSONArrayStart(); - writeJSONString(getTypeNameForTypeID(map.keyType)); - writeJSONString(getTypeNameForTypeID(map.valueType)); - writeJSONInteger(map.size); - writeJSONObjectStart(); - } - - @Override - public void writeMapEnd() throws TException { - writeJSONObjectEnd(); - writeJSONArrayEnd(); - } - - @Override - public void writeListBegin(TList list) throws TException { - writeJSONArrayStart(); - writeJSONString(getTypeNameForTypeID(list.elemType)); - writeJSONInteger(list.size); - } - - @Override - public void writeListEnd() throws TException { - writeJSONArrayEnd(); - } - - @Override - public void writeSetBegin(TSet set) throws TException { - writeJSONArrayStart(); - writeJSONString(getTypeNameForTypeID(set.elemType)); - writeJSONInteger(set.size); - } - - @Override - public void writeSetEnd() throws TException { - writeJSONArrayEnd(); - } - - @Override - public void writeBool(boolean b) throws TException { - writeJSONInteger(b ? (long)1 : (long)0); - } - - @Override - public void writeByte(byte b) throws TException { - writeJSONInteger((long)b); - } - - @Override - public void writeI16(short i16) throws TException { - writeJSONInteger((long)i16); - } - - @Override - public void writeI32(int i32) throws TException { - writeJSONInteger((long)i32); - } - - @Override - public void writeI64(long i64) throws TException { - writeJSONInteger(i64); - } - - @Override - public void writeDouble(double dub) throws TException { - writeJSONDouble(dub); - } - - @Override - public void writeString(String str) throws TException { - try { - byte[] b = str.getBytes("UTF-8"); - writeJSONString(b); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - @Override - public void writeBinary(ByteBuffer bin) throws TException { - writeJSONBase64(bin.array(), bin.position() + bin.arrayOffset(), bin.limit() - bin.position() - bin.arrayOffset()); - } - - /** - * Reading methods. - */ - - // Read in a JSON string, unescaping as appropriate.. Skip reading from the - // context if skipContext is true. - private TByteArrayOutputStream readJSONString(boolean skipContext) - throws TException { - TByteArrayOutputStream arr = new TByteArrayOutputStream(DEF_STRING_SIZE); - if (!skipContext) { - context_.read(); - } - readJSONSyntaxChar(QUOTE); - while (true) { - byte ch = reader_.read(); - if (ch == QUOTE[0]) { - break; - } - if (ch == ESCSEQ[0]) { - ch = reader_.read(); - if (ch == ESCSEQ[1]) { - readJSONSyntaxChar(ZERO); - readJSONSyntaxChar(ZERO); - trans_.readAll(tmpbuf_, 0, 2); - ch = (byte)((hexVal((byte)tmpbuf_[0]) << 4) + hexVal(tmpbuf_[1])); - } - else { - int off = ESCAPE_CHARS.indexOf(ch); - if (off == -1) { - throw new TProtocolException(TProtocolException.INVALID_DATA, - "Expected control char"); - } - ch = ESCAPE_CHAR_VALS[off]; - } - } - arr.write(ch); - } - return arr; - } - - // Return true if the given byte could be a valid part of a JSON number. - private boolean isJSONNumeric(byte b) { - switch (b) { - case '+': - case '-': - case '.': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case 'E': - case 'e': - return true; - } - return false; - } - - // Read in a sequence of characters that are all valid in JSON numbers. Does - // not do a complete regex check to validate that this is actually a number. - private String readJSONNumericChars() throws TException { - StringBuilder strbld = new StringBuilder(); - while (true) { - byte ch = reader_.peek(); - if (!isJSONNumeric(ch)) { - break; - } - strbld.append((char)reader_.read()); - } - return strbld.toString(); - } - - // Read in a JSON number. If the context dictates, read in enclosing quotes. - private long readJSONInteger() throws TException { - context_.read(); - if (context_.escapeNum()) { - readJSONSyntaxChar(QUOTE); - } - String str = readJSONNumericChars(); - if (context_.escapeNum()) { - readJSONSyntaxChar(QUOTE); - } - try { - return Long.valueOf(str); - } - catch (NumberFormatException ex) { - throw new TProtocolException(TProtocolException.INVALID_DATA, - "Bad data encounted in numeric data"); - } - } - - // Read in a JSON double value. Throw if the value is not wrapped in quotes - // when expected or if wrapped in quotes when not expected. - private double readJSONDouble() throws TException { - context_.read(); - if (reader_.peek() == QUOTE[0]) { - TByteArrayOutputStream arr = readJSONString(true); - try { - double dub = Double.valueOf(arr.toString("UTF-8")); - if (!context_.escapeNum() && !Double.isNaN(dub) && - !Double.isInfinite(dub)) { - // Throw exception -- we should not be in a string in this case - throw new TProtocolException(TProtocolException.INVALID_DATA, - "Numeric data unexpectedly quoted"); - } - return dub; - } - catch (UnsupportedEncodingException ex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - else { - if (context_.escapeNum()) { - // This will throw - we should have had a quote if escapeNum == true - readJSONSyntaxChar(QUOTE); - } - try { - return Double.valueOf(readJSONNumericChars()); - } - catch (NumberFormatException ex) { - throw new TProtocolException(TProtocolException.INVALID_DATA, - "Bad data encounted in numeric data"); - } - } - } - - // Read in a JSON string containing base-64 encoded data and decode it. - private byte[] readJSONBase64() throws TException { - TByteArrayOutputStream arr = readJSONString(false); - byte[] b = arr.get(); - int len = arr.len(); - int off = 0; - int size = 0; - while (len >= 4) { - // Decode 4 bytes at a time - TBase64Utils.decode(b, off, 4, b, size); // NB: decoded in place - off += 4; - len -= 4; - size += 3; - } - // Don't decode if we hit the end or got a single leftover byte (invalid - // base64 but legal for skip of regular string type) - if (len > 1) { - // Decode remainder - TBase64Utils.decode(b, off, len, b, size); // NB: decoded in place - size += len - 1; - } - // Sadly we must copy the byte[] (any way around this?) - byte [] result = new byte[size]; - System.arraycopy(b, 0, result, 0, size); - return result; - } - - private void readJSONObjectStart() throws TException { - context_.read(); - readJSONSyntaxChar(LBRACE); - pushContext(new JSONPairContext()); - } - - private void readJSONObjectEnd() throws TException { - readJSONSyntaxChar(RBRACE); - popContext(); - } - - private void readJSONArrayStart() throws TException { - context_.read(); - readJSONSyntaxChar(LBRACKET); - pushContext(new JSONListContext()); - } - - private void readJSONArrayEnd() throws TException { - readJSONSyntaxChar(RBRACKET); - popContext(); - } - - @Override - public TMessage readMessageBegin() throws TException { - readJSONArrayStart(); - if (readJSONInteger() != VERSION) { - throw new TProtocolException(TProtocolException.BAD_VERSION, - "Message contained bad version."); - } - String name; - try { - name = readJSONString(false).toString("UTF-8"); - } - catch (UnsupportedEncodingException ex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - byte type = (byte) readJSONInteger(); - int seqid = (int) readJSONInteger(); - return new TMessage(name, type, seqid); - } - - @Override - public void readMessageEnd() throws TException { - readJSONArrayEnd(); - } - - @Override - public TStruct readStructBegin() throws TException { - readJSONObjectStart(); - return ANONYMOUS_STRUCT; - } - - @Override - public void readStructEnd() throws TException { - readJSONObjectEnd(); - } - - @Override - public TField readFieldBegin() throws TException { - byte ch = reader_.peek(); - byte type; - short id = 0; - if (ch == RBRACE[0]) { - type = TType.STOP; - } - else { - id = (short) readJSONInteger(); - readJSONObjectStart(); - type = getTypeIDForTypeName(readJSONString(false).get()); - } - return new TField("", type, id); - } - - @Override - public void readFieldEnd() throws TException { - readJSONObjectEnd(); - } - - @Override - public TMap readMapBegin() throws TException { - readJSONArrayStart(); - byte keyType = getTypeIDForTypeName(readJSONString(false).get()); - byte valueType = getTypeIDForTypeName(readJSONString(false).get()); - int size = (int)readJSONInteger(); - readJSONObjectStart(); - return new TMap(keyType, valueType, size); - } - - @Override - public void readMapEnd() throws TException { - readJSONObjectEnd(); - readJSONArrayEnd(); - } - - @Override - public TList readListBegin() throws TException { - readJSONArrayStart(); - byte elemType = getTypeIDForTypeName(readJSONString(false).get()); - int size = (int)readJSONInteger(); - return new TList(elemType, size); - } - - @Override - public void readListEnd() throws TException { - readJSONArrayEnd(); - } - - @Override - public TSet readSetBegin() throws TException { - readJSONArrayStart(); - byte elemType = getTypeIDForTypeName(readJSONString(false).get()); - int size = (int)readJSONInteger(); - return new TSet(elemType, size); - } - - @Override - public void readSetEnd() throws TException { - readJSONArrayEnd(); - } - - @Override - public boolean readBool() throws TException { - return (readJSONInteger() == 0 ? false : true); - } - - @Override - public byte readByte() throws TException { - return (byte) readJSONInteger(); - } - - @Override - public short readI16() throws TException { - return (short) readJSONInteger(); - } - - @Override - public int readI32() throws TException { - return (int) readJSONInteger(); - } - - @Override - public long readI64() throws TException { - return (long) readJSONInteger(); - } - - @Override - public double readDouble() throws TException { - return readJSONDouble(); - } - - @Override - public String readString() throws TException { - try { - return readJSONString(false).toString("UTF-8"); - } - catch (UnsupportedEncodingException ex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - @Override - public ByteBuffer readBinary() throws TException { - return ByteBuffer.wrap(readJSONBase64()); - } - -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TList.java b/app/src/main/java/org/apache/thrift/protocol/TList.java deleted file mode 100644 index 0d36e83..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TList.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Helper class that encapsulates list metadata. - * - */ -public final class TList { - public TList() { - this(TType.STOP, 0); - } - - public TList(byte t, int s) { - elemType = t; - size = s; - } - - public final byte elemType; - public final int size; -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TMap.java b/app/src/main/java/org/apache/thrift/protocol/TMap.java deleted file mode 100644 index 20881f7..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TMap.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Helper class that encapsulates map metadata. - * - */ -public final class TMap { - public TMap() { - this(TType.STOP, TType.STOP, 0); - } - - public TMap(byte k, byte v, int s) { - keyType = k; - valueType = v; - size = s; - } - - public final byte keyType; - public final byte valueType; - public final int size; -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TMessage.java b/app/src/main/java/org/apache/thrift/protocol/TMessage.java deleted file mode 100644 index 1438b11..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TMessage.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Helper class that encapsulates struct metadata. - * - */ -public final class TMessage { - public TMessage() { - this("", TType.STOP, 0); - } - - public TMessage(String n, byte t, int s) { - name = n; - type = t; - seqid = s; - } - - public final String name; - public final byte type; - public final int seqid; - - @Override - public String toString() { - return ""; - } - - @Override - public boolean equals(Object other) { - if (other instanceof TMessage) { - return equals((TMessage) other); - } - return false; - } - - public boolean equals(TMessage other) { - return name.equals(other.name) && type == other.type && seqid == other.seqid; - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TMessageType.java b/app/src/main/java/org/apache/thrift/protocol/TMessageType.java deleted file mode 100644 index aa3f931..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TMessageType.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Message type constants in the Thrift protocol. - * - */ -public final class TMessageType { - public static final byte CALL = 1; - public static final byte REPLY = 2; - public static final byte EXCEPTION = 3; - public static final byte ONEWAY = 4; -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TProtocol.java b/app/src/main/java/org/apache/thrift/protocol/TProtocol.java deleted file mode 100644 index 0e96368..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TProtocol.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import java.nio.ByteBuffer; - -import org.apache.thrift.TException; -import org.apache.thrift.scheme.IScheme; -import org.apache.thrift.scheme.StandardScheme; -import org.apache.thrift.transport.TTransport; - -/** - * Protocol interface definition. - * - */ -public abstract class TProtocol { - - /** - * Prevent direct instantiation - */ - @SuppressWarnings("unused") - private TProtocol() {} - - /** - * Transport - */ - protected TTransport trans_; - - /** - * Constructor - */ - protected TProtocol(TTransport trans) { - trans_ = trans; - } - - /** - * Transport accessor - */ - public TTransport getTransport() { - return trans_; - } - - /** - * Writing methods. - */ - - public abstract void writeMessageBegin(TMessage message) throws TException; - - public abstract void writeMessageEnd() throws TException; - - public abstract void writeStructBegin(TStruct struct) throws TException; - - public abstract void writeStructEnd() throws TException; - - public abstract void writeFieldBegin(TField field) throws TException; - - public abstract void writeFieldEnd() throws TException; - - public abstract void writeFieldStop() throws TException; - - public abstract void writeMapBegin(TMap map) throws TException; - - public abstract void writeMapEnd() throws TException; - - public abstract void writeListBegin(TList list) throws TException; - - public abstract void writeListEnd() throws TException; - - public abstract void writeSetBegin(TSet set) throws TException; - - public abstract void writeSetEnd() throws TException; - - public abstract void writeBool(boolean b) throws TException; - - public abstract void writeByte(byte b) throws TException; - - public abstract void writeI16(short i16) throws TException; - - public abstract void writeI32(int i32) throws TException; - - public abstract void writeI64(long i64) throws TException; - - public abstract void writeDouble(double dub) throws TException; - - public abstract void writeString(String str) throws TException; - - public abstract void writeBinary(ByteBuffer buf) throws TException; - - /** - * Reading methods. - */ - - public abstract TMessage readMessageBegin() throws TException; - - public abstract void readMessageEnd() throws TException; - - public abstract TStruct readStructBegin() throws TException; - - public abstract void readStructEnd() throws TException; - - public abstract TField readFieldBegin() throws TException; - - public abstract void readFieldEnd() throws TException; - - public abstract TMap readMapBegin() throws TException; - - public abstract void readMapEnd() throws TException; - - public abstract TList readListBegin() throws TException; - - public abstract void readListEnd() throws TException; - - public abstract TSet readSetBegin() throws TException; - - public abstract void readSetEnd() throws TException; - - public abstract boolean readBool() throws TException; - - public abstract byte readByte() throws TException; - - public abstract short readI16() throws TException; - - public abstract int readI32() throws TException; - - public abstract long readI64() throws TException; - - public abstract double readDouble() throws TException; - - public abstract String readString() throws TException; - - public abstract ByteBuffer readBinary() throws TException; - - /** - * Reset any internal state back to a blank slate. This method only needs to - * be implemented for stateful protocols. - */ - public void reset() {} - - /** - * Scheme accessor - */ - public Class getScheme() { - return StandardScheme.class; - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TProtocolException.java b/app/src/main/java/org/apache/thrift/protocol/TProtocolException.java deleted file mode 100644 index 248815b..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TProtocolException.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import org.apache.thrift.TException; - -/** - * Protocol exceptions. - * - */ -public class TProtocolException extends TException { - - - private static final long serialVersionUID = 1L; - public static final int UNKNOWN = 0; - public static final int INVALID_DATA = 1; - public static final int NEGATIVE_SIZE = 2; - public static final int SIZE_LIMIT = 3; - public static final int BAD_VERSION = 4; - public static final int NOT_IMPLEMENTED = 5; - - protected int type_ = UNKNOWN; - - public TProtocolException() { - super(); - } - - public TProtocolException(int type) { - super(); - type_ = type; - } - - public TProtocolException(int type, String message) { - super(message); - type_ = type; - } - - public TProtocolException(String message) { - super(message); - } - - public TProtocolException(int type, Throwable cause) { - super(cause); - type_ = type; - } - - public TProtocolException(Throwable cause) { - super(cause); - } - - public TProtocolException(String message, Throwable cause) { - super(message, cause); - } - - public TProtocolException(int type, String message, Throwable cause) { - super(message, cause); - type_ = type; - } - - public int getType() { - return type_; - } - -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TProtocolFactory.java b/app/src/main/java/org/apache/thrift/protocol/TProtocolFactory.java deleted file mode 100644 index b72e87b..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TProtocolFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import java.io.Serializable; - -import org.apache.thrift.transport.TTransport; - -/** - * Factory interface for constructing protocol instances. - */ -public interface TProtocolFactory extends Serializable { - public TProtocol getProtocol(TTransport trans); -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TProtocolUtil.java b/app/src/main/java/org/apache/thrift/protocol/TProtocolUtil.java deleted file mode 100644 index 752520a..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TProtocolUtil.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import org.apache.thrift.TException; - -/** - * Utility class with static methods for interacting with protocol data - * streams. - * - */ -public class TProtocolUtil { - - /** - * The maximum recursive depth the skip() function will traverse before - * throwing a TException. - */ - private static int maxSkipDepth = Integer.MAX_VALUE; - - /** - * Specifies the maximum recursive depth that the skip function will - * traverse before throwing a TException. This is a global setting, so - * any call to skip in this JVM will enforce this value. - * - * @param depth the maximum recursive depth. A value of 2 would allow - * the skip function to skip a structure or collection with basic children, - * but it would not permit skipping a struct that had a field containing - * a child struct. A value of 1 would only allow skipping of simple - * types and empty structs/collections. - */ - public static void setMaxSkipDepth(int depth) { - maxSkipDepth = depth; - } - - /** - * Skips over the next data element from the provided input TProtocol object. - * - * @param prot the protocol object to read from - * @param type the next value will be interpreted as this TType value. - */ - public static void skip(TProtocol prot, byte type) - throws TException { - skip(prot, type, maxSkipDepth); - } - - /** - * Skips over the next data element from the provided input TProtocol object. - * - * @param prot the protocol object to read from - * @param type the next value will be interpreted as this TType value. - * @param maxDepth this function will only skip complex objects to this - * recursive depth, to prevent Java stack overflow. - */ - public static void skip(TProtocol prot, byte type, int maxDepth) - throws TException { - if (maxDepth <= 0) { - throw new TException("Maximum skip depth exceeded"); - } - switch (type) { - case TType.BOOL: - prot.readBool(); - break; - - case TType.BYTE: - prot.readByte(); - break; - - case TType.I16: - prot.readI16(); - break; - - case TType.I32: - prot.readI32(); - break; - - case TType.I64: - prot.readI64(); - break; - - case TType.DOUBLE: - prot.readDouble(); - break; - - case TType.STRING: - prot.readBinary(); - break; - - case TType.STRUCT: - prot.readStructBegin(); - while (true) { - TField field = prot.readFieldBegin(); - if (field.type == TType.STOP) { - break; - } - skip(prot, field.type, maxDepth - 1); - prot.readFieldEnd(); - } - prot.readStructEnd(); - break; - - case TType.MAP: - TMap map = prot.readMapBegin(); - for (int i = 0; i < map.size; i++) { - skip(prot, map.keyType, maxDepth - 1); - skip(prot, map.valueType, maxDepth - 1); - } - prot.readMapEnd(); - break; - - case TType.SET: - TSet set = prot.readSetBegin(); - for (int i = 0; i < set.size; i++) { - skip(prot, set.elemType, maxDepth - 1); - } - prot.readSetEnd(); - break; - - case TType.LIST: - TList list = prot.readListBegin(); - for (int i = 0; i < list.size; i++) { - skip(prot, list.elemType, maxDepth - 1); - } - prot.readListEnd(); - break; - - default: - break; - } - } - - /** - * Attempt to determine the protocol used to serialize some data. - * - * The guess is based on known specificities of supported protocols. - * In some cases, no guess can be done, in that case we return the - * fallback TProtocolFactory. - * To be certain to correctly detect the protocol, the first encoded - * field should have a field id < 256 - * - * @param data The serialized data to guess the protocol for. - * @param fallback The TProtocol to return if no guess can be made. - * @return a Class implementing TProtocolFactory which can be used to create a deserializer. - */ - public static TProtocolFactory guessProtocolFactory(byte[] data, TProtocolFactory fallback) { - // - // If the first and last bytes are opening/closing curly braces we guess the protocol as - // being TJSONProtocol. - // It could not be a TCompactBinary encoding for a field of type 0xb (Map) - // with delta id 7 as the last byte for TCompactBinary is always 0. - // - - if ('{' == data[0] && '}' == data[data.length - 1]) { - return new TJSONProtocol.Factory(); - } - - // - // If the last byte is not 0, then it cannot be TCompactProtocol, it must be - // TBinaryProtocol. - // - - if (data[data.length - 1] != 0) { - return new TBinaryProtocol.Factory(); - } - - // - // A first byte of value > 16 indicates TCompactProtocol was used, and the first byte - // encodes a delta field id (id <= 15) and a field type. - // - - if (data[0] > 0x10) { - return new TCompactProtocol.Factory(); - } - - // - // If the second byte is 0 then it is a field id < 256 encoded by TBinaryProtocol. - // It cannot possibly be TCompactProtocol since a value of 0 would imply a field id - // of 0 as the zig zag varint encoding would end. - // - - if (data.length > 1 && 0 == data[1]) { - return new TBinaryProtocol.Factory(); - } - - // - // If bit 7 of the first byte of the field id is set then we have two choices: - // 1. A field id > 63 was encoded with TCompactProtocol. - // 2. A field id > 0x7fff (32767) was encoded with TBinaryProtocol and the last byte of the - // serialized data is 0. - // Option 2 is impossible since field ids are short and thus limited to 32767. - // - - if (data.length > 1 && (data[1] & 0x80) != 0) { - return new TCompactProtocol.Factory(); - } - - // - // The remaining case is either a field id <= 63 encoded as TCompactProtocol, - // one >= 256 encoded with TBinaryProtocol with a last byte at 0, or an empty structure. - // As we cannot really decide, we return the fallback protocol. - // - return fallback; - } -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TSet.java b/app/src/main/java/org/apache/thrift/protocol/TSet.java deleted file mode 100644 index 38be9a9..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TSet.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Helper class that encapsulates set metadata. - * - */ -public final class TSet { - public TSet() { - this(TType.STOP, 0); - } - - public TSet(byte t, int s) { - elemType = t; - size = s; - } - - public TSet(TList list) { - this(list.elemType, list.size); - } - - public final byte elemType; - public final int size; -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java b/app/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java deleted file mode 100644 index 33cad24..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TSimpleJSONProtocol.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -import java.io.UnsupportedEncodingException; -import java.nio.ByteBuffer; -import java.util.Stack; - -import org.apache.thrift.TException; -import org.apache.thrift.transport.TTransport; - -/** - * JSON protocol implementation for thrift. - * - * This protocol is write-only and produces a simple output format - * suitable for parsing by scripting languages. It should not be - * confused with the full-featured TJSONProtocol. - * - */ -public class TSimpleJSONProtocol extends TProtocol { - - /** - * Factory - */ - public static class Factory implements TProtocolFactory { - public TProtocol getProtocol(TTransport trans) { - return new TSimpleJSONProtocol(trans); - } - } - - public static final byte[] COMMA = new byte[] {','}; - public static final byte[] COLON = new byte[] {':'}; - public static final byte[] LBRACE = new byte[] {'{'}; - public static final byte[] RBRACE = new byte[] {'}'}; - public static final byte[] LBRACKET = new byte[] {'['}; - public static final byte[] RBRACKET = new byte[] {']'}; - public static final char QUOTE = '"'; - - private static final TStruct ANONYMOUS_STRUCT = new TStruct(); - private static final TField ANONYMOUS_FIELD = new TField(); - private static final TMessage EMPTY_MESSAGE = new TMessage(); - private static final TSet EMPTY_SET = new TSet(); - private static final TList EMPTY_LIST = new TList(); - private static final TMap EMPTY_MAP = new TMap(); - - protected class Context { - protected void write() throws TException {} - } - - protected class ListContext extends Context { - protected boolean first_ = true; - - protected void write() throws TException { - if (first_) { - first_ = false; - } else { - trans_.write(COMMA); - } - } - } - - protected class StructContext extends Context { - protected boolean first_ = true; - protected boolean colon_ = true; - - protected void write() throws TException { - if (first_) { - first_ = false; - colon_ = true; - } else { - trans_.write(colon_ ? COLON : COMMA); - colon_ = !colon_; - } - } - } - - protected final Context BASE_CONTEXT = new Context(); - - /** - * Stack of nested contexts that we may be in. - */ - protected Stack writeContextStack_ = new Stack(); - - /** - * Current context that we are in - */ - protected Context writeContext_ = BASE_CONTEXT; - - /** - * Push a new write context onto the stack. - */ - protected void pushWriteContext(Context c) { - writeContextStack_.push(writeContext_); - writeContext_ = c; - } - - /** - * Pop the last write context off the stack - */ - protected void popWriteContext() { - writeContext_ = writeContextStack_.pop(); - } - - /** - * Constructor - */ - public TSimpleJSONProtocol(TTransport trans) { - super(trans); - } - - public void writeMessageBegin(TMessage message) throws TException { - trans_.write(LBRACKET); - pushWriteContext(new ListContext()); - writeString(message.name); - writeByte(message.type); - writeI32(message.seqid); - } - - public void writeMessageEnd() throws TException { - popWriteContext(); - trans_.write(RBRACKET); - } - - public void writeStructBegin(TStruct struct) throws TException { - writeContext_.write(); - trans_.write(LBRACE); - pushWriteContext(new StructContext()); - } - - public void writeStructEnd() throws TException { - popWriteContext(); - trans_.write(RBRACE); - } - - public void writeFieldBegin(TField field) throws TException { - // Note that extra type information is omitted in JSON! - writeString(field.name); - } - - public void writeFieldEnd() {} - - public void writeFieldStop() {} - - public void writeMapBegin(TMap map) throws TException { - writeContext_.write(); - trans_.write(LBRACE); - pushWriteContext(new StructContext()); - // No metadata! - } - - public void writeMapEnd() throws TException { - popWriteContext(); - trans_.write(RBRACE); - } - - public void writeListBegin(TList list) throws TException { - writeContext_.write(); - trans_.write(LBRACKET); - pushWriteContext(new ListContext()); - // No metadata! - } - - public void writeListEnd() throws TException { - popWriteContext(); - trans_.write(RBRACKET); - } - - public void writeSetBegin(TSet set) throws TException { - writeContext_.write(); - trans_.write(LBRACKET); - pushWriteContext(new ListContext()); - // No metadata! - } - - public void writeSetEnd() throws TException { - popWriteContext(); - trans_.write(RBRACKET); - } - - public void writeBool(boolean b) throws TException { - writeByte(b ? (byte)1 : (byte)0); - } - - public void writeByte(byte b) throws TException { - writeI32(b); - } - - public void writeI16(short i16) throws TException { - writeI32(i16); - } - - public void writeI32(int i32) throws TException { - writeContext_.write(); - _writeStringData(Integer.toString(i32)); - } - - public void _writeStringData(String s) throws TException { - try { - byte[] b = s.getBytes("UTF-8"); - trans_.write(b); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - public void writeI64(long i64) throws TException { - writeContext_.write(); - _writeStringData(Long.toString(i64)); - } - - public void writeDouble(double dub) throws TException { - writeContext_.write(); - _writeStringData(Double.toString(dub)); - } - - public void writeString(String str) throws TException { - writeContext_.write(); - int length = str.length(); - StringBuffer escape = new StringBuffer(length + 16); - escape.append(QUOTE); - for (int i = 0; i < length; ++i) { - char c = str.charAt(i); - switch (c) { - case '"': - case '\\': - escape.append('\\'); - escape.append(c); - break; - case '\b': - escape.append('\\'); - escape.append('b'); - break; - case '\f': - escape.append('\\'); - escape.append('f'); - break; - case '\n': - escape.append('\\'); - escape.append('n'); - break; - case '\r': - escape.append('\\'); - escape.append('r'); - break; - case '\t': - escape.append('\\'); - escape.append('t'); - break; - default: - // Control characters! According to JSON RFC u0020 (space) - if (c < ' ') { - String hex = Integer.toHexString(c); - escape.append('\\'); - escape.append('u'); - for (int j = 4; j > hex.length(); --j) { - escape.append('0'); - } - escape.append(hex); - } else { - escape.append(c); - } - break; - } - } - escape.append(QUOTE); - _writeStringData(escape.toString()); - } - - public void writeBinary(ByteBuffer bin) throws TException { - try { - // TODO(mcslee): Fix this - writeString(new String(bin.array(), bin.position() + bin.arrayOffset(), bin.limit() - bin.position() - bin.arrayOffset(), "UTF-8")); - } catch (UnsupportedEncodingException uex) { - throw new TException("JVM DOES NOT SUPPORT UTF-8"); - } - } - - /** - * Reading methods. - */ - - public TMessage readMessageBegin() throws TException { - // TODO(mcslee): implement - return EMPTY_MESSAGE; - } - - public void readMessageEnd() {} - - public TStruct readStructBegin() { - // TODO(mcslee): implement - return ANONYMOUS_STRUCT; - } - - public void readStructEnd() {} - - public TField readFieldBegin() throws TException { - // TODO(mcslee): implement - return ANONYMOUS_FIELD; - } - - public void readFieldEnd() {} - - public TMap readMapBegin() throws TException { - // TODO(mcslee): implement - return EMPTY_MAP; - } - - public void readMapEnd() {} - - public TList readListBegin() throws TException { - // TODO(mcslee): implement - return EMPTY_LIST; - } - - public void readListEnd() {} - - public TSet readSetBegin() throws TException { - // TODO(mcslee): implement - return EMPTY_SET; - } - - public void readSetEnd() {} - - public boolean readBool() throws TException { - return (readByte() == 1); - } - - public byte readByte() throws TException { - // TODO(mcslee): implement - return 0; - } - - public short readI16() throws TException { - // TODO(mcslee): implement - return 0; - } - - public int readI32() throws TException { - // TODO(mcslee): implement - return 0; - } - - public long readI64() throws TException { - // TODO(mcslee): implement - return 0; - } - - public double readDouble() throws TException { - // TODO(mcslee): implement - return 0; - } - - public String readString() throws TException { - // TODO(mcslee): implement - return ""; - } - - public String readStringBody(int size) throws TException { - // TODO(mcslee): implement - return ""; - } - - public ByteBuffer readBinary() throws TException { - // TODO(mcslee): implement - return ByteBuffer.wrap(new byte[0]); - } - -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TStruct.java b/app/src/main/java/org/apache/thrift/protocol/TStruct.java deleted file mode 100644 index a0f7901..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TStruct.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Helper class that encapsulates struct metadata. - * - */ -public final class TStruct { - public TStruct() { - this(""); - } - - public TStruct(String n) { - name = n; - } - - public final String name; -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java b/app/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java deleted file mode 100644 index 14d50a6..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TTupleProtocol.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.protocol; - -import java.util.BitSet; - -import org.apache.thrift.TException; -import org.apache.thrift.scheme.IScheme; -import org.apache.thrift.scheme.TupleScheme; -import org.apache.thrift.transport.TTransport; - -public final class TTupleProtocol extends TCompactProtocol { - public static class Factory implements TProtocolFactory { - public Factory() {} - - public TProtocol getProtocol(TTransport trans) { - return new TTupleProtocol(trans); - } - } - - public TTupleProtocol(TTransport transport) { - super(transport); - } - - @Override - public Class getScheme() { - return TupleScheme.class; - } - - public void writeBitSet(BitSet bs, int vectorWidth) throws TException { - byte[] bytes = toByteArray(bs, vectorWidth); - for (byte b : bytes) { - writeByte(b); - } - } - - public BitSet readBitSet(int i) throws TException { - int length = (int) Math.ceil(i/8.0); - byte[] bytes = new byte[length]; - for (int j = 0; j < length; j++) { - bytes[j] = readByte(); - } - BitSet bs = fromByteArray(bytes); - return bs; - } - - /** - * Returns a bitset containing the values in bytes. The byte-ordering must be - * big-endian. - */ - public static BitSet fromByteArray(byte[] bytes) { - BitSet bits = new BitSet(); - for (int i = 0; i < bytes.length * 8; i++) { - if ((bytes[bytes.length - i / 8 - 1] & (1 << (i % 8))) > 0) { - bits.set(i); - } - } - return bits; - } - - /** - * Returns a byte array of at least length 1. The most significant bit in the - * result is guaranteed not to be a 1 (since BitSet does not support sign - * extension). The byte-ordering of the result is big-endian which means the - * most significant bit is in element 0. The bit at index 0 of the bit set is - * assumed to be the least significant bit. - * - * @param bits - * @param vectorWidth - * @return a byte array of at least length 1 - */ - public static byte[] toByteArray(BitSet bits, int vectorWidth) { - byte[] bytes = new byte[vectorWidth / 8 + 1]; - for (int i = 0; i < bits.length(); i++) { - if (bits.get(i)) { - bytes[bytes.length - i / 8 - 1] |= 1 << (i % 8); - } - } - return bytes; - } - -} diff --git a/app/src/main/java/org/apache/thrift/protocol/TType.java b/app/src/main/java/org/apache/thrift/protocol/TType.java deleted file mode 100644 index c3c1a0a..0000000 --- a/app/src/main/java/org/apache/thrift/protocol/TType.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.protocol; - -/** - * Type constants in the Thrift protocol. - */ -public final class TType { - public static final byte STOP = 0; - public static final byte VOID = 1; - public static final byte BOOL = 2; - public static final byte BYTE = 3; - public static final byte DOUBLE = 4; - public static final byte I16 = 6; - public static final byte I32 = 8; - public static final byte I64 = 10; - public static final byte STRING = 11; - public static final byte STRUCT = 12; - public static final byte MAP = 13; - public static final byte SET = 14; - public static final byte LIST = 15; - public static final byte ENUM = 16; -} diff --git a/app/src/main/java/org/apache/thrift/scheme/IScheme.java b/app/src/main/java/org/apache/thrift/scheme/IScheme.java deleted file mode 100644 index aa35507..0000000 --- a/app/src/main/java/org/apache/thrift/scheme/IScheme.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.scheme; - -import org.apache.thrift.TBase; - -public interface IScheme { - - public void read(org.apache.thrift.protocol.TProtocol iproto, T struct) throws org.apache.thrift.TException; - - public void write(org.apache.thrift.protocol.TProtocol oproto, T struct) throws org.apache.thrift.TException; - -} diff --git a/app/src/main/java/org/apache/thrift/scheme/SchemeFactory.java b/app/src/main/java/org/apache/thrift/scheme/SchemeFactory.java deleted file mode 100644 index 006a668..0000000 --- a/app/src/main/java/org/apache/thrift/scheme/SchemeFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.scheme; - -public interface SchemeFactory { - - public S getScheme(); - -} diff --git a/app/src/main/java/org/apache/thrift/scheme/StandardScheme.java b/app/src/main/java/org/apache/thrift/scheme/StandardScheme.java deleted file mode 100644 index ffab04d..0000000 --- a/app/src/main/java/org/apache/thrift/scheme/StandardScheme.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.scheme; - -import org.apache.thrift.TBase; - -public abstract class StandardScheme implements IScheme { - -} diff --git a/app/src/main/java/org/apache/thrift/scheme/TupleScheme.java b/app/src/main/java/org/apache/thrift/scheme/TupleScheme.java deleted file mode 100644 index 365242b..0000000 --- a/app/src/main/java/org/apache/thrift/scheme/TupleScheme.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.scheme; - -import org.apache.thrift.TBase; - -public abstract class TupleScheme implements IScheme { - -} diff --git a/app/src/main/java/org/apache/thrift/transport/AutoExpandingBuffer.java b/app/src/main/java/org/apache/thrift/transport/AutoExpandingBuffer.java deleted file mode 100644 index b02905f..0000000 --- a/app/src/main/java/org/apache/thrift/transport/AutoExpandingBuffer.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.transport; - -/** - * Helper class that wraps a byte[] so that it can expand and be reused. Users - * should call resizeIfNecessary to make sure the buffer has suitable capacity, - * and then use the array as needed. Note that the internal array will grow at a - * rate slightly faster than the requested capacity with the (untested) - * objective of avoiding expensive buffer allocations and copies. - */ -public class AutoExpandingBuffer { - private byte[] array; - - private final double growthCoefficient; - - public AutoExpandingBuffer(int initialCapacity, double growthCoefficient) { - if (growthCoefficient < 1.0) { - throw new IllegalArgumentException("Growth coefficient must be >= 1.0"); - } - array = new byte[initialCapacity]; - this.growthCoefficient = growthCoefficient; - } - - public void resizeIfNecessary(int size) { - if (array.length < size) { - byte[] newBuf = new byte[(int)(size * growthCoefficient)]; - System.arraycopy(array, 0, newBuf, 0, array.length); - array = newBuf; - } - } - - public byte[] array() { - return array; - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java b/app/src/main/java/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java deleted file mode 100644 index d29d60b..0000000 --- a/app/src/main/java/org/apache/thrift/transport/AutoExpandingBufferReadTransport.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.transport; - -import org.apache.commons.lang.NotImplementedException; - -/** - * TTransport for reading from an AutoExpandingBuffer. - */ -public class AutoExpandingBufferReadTransport extends TTransport { - - private final AutoExpandingBuffer buf; - - private int pos = 0; - private int limit = 0; - - public AutoExpandingBufferReadTransport(int initialCapacity, double overgrowthCoefficient) { - this.buf = new AutoExpandingBuffer(initialCapacity, overgrowthCoefficient); - } - - public void fill(TTransport inTrans, int length) throws TTransportException { - buf.resizeIfNecessary(length); - inTrans.readAll(buf.array(), 0, length); - pos = 0; - limit = length; - } - - @Override - public void close() {} - - @Override - public boolean isOpen() { return true; } - - @Override - public void open() throws TTransportException {} - - @Override - public final int read(byte[] target, int off, int len) throws TTransportException { - int amtToRead = Math.min(len, getBytesRemainingInBuffer()); - System.arraycopy(buf.array(), pos, target, off, amtToRead); - consumeBuffer(amtToRead); - return amtToRead; - } - - @Override - public void write(byte[] buf, int off, int len) throws TTransportException { - throw new NotImplementedException(); - } - - @Override - public final void consumeBuffer(int len) { - pos += len; - } - - @Override - public final byte[] getBuffer() { - return buf.array(); - } - - @Override - public final int getBufferPosition() { - return pos; - } - - @Override - public final int getBytesRemainingInBuffer() { - return limit - pos; - } -} - \ No newline at end of file diff --git a/app/src/main/java/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java b/app/src/main/java/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java deleted file mode 100644 index 2376cf3..0000000 --- a/app/src/main/java/org/apache/thrift/transport/AutoExpandingBufferWriteTransport.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.transport; - -import org.apache.commons.lang.NotImplementedException; - -/** - * TTransport for writing to an AutoExpandingBuffer. - */ -public final class AutoExpandingBufferWriteTransport extends TTransport { - - private final AutoExpandingBuffer buf; - private int pos; - - public AutoExpandingBufferWriteTransport(int initialCapacity, double growthCoefficient) { - this.buf = new AutoExpandingBuffer(initialCapacity, growthCoefficient); - this.pos = 0; - } - - @Override - public void close() {} - - @Override - public boolean isOpen() {return true;} - - @Override - public void open() throws TTransportException {} - - @Override - public int read(byte[] buf, int off, int len) throws TTransportException { - throw new NotImplementedException(); - } - - @Override - public void write(byte[] toWrite, int off, int len) throws TTransportException { - buf.resizeIfNecessary(pos + len); - System.arraycopy(toWrite, off, buf.array(), pos, len); - pos += len; - } - - public AutoExpandingBuffer getBuf() { - return buf; - } - - public int getPos() { - return pos; - } - - public void reset() { - pos = 0; - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TFastFramedTransport.java b/app/src/main/java/org/apache/thrift/transport/TFastFramedTransport.java deleted file mode 100644 index e32b7db..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TFastFramedTransport.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.transport; - -/** - * This transport is wire compatible with {@link TFramedTransport}, but makes - * use of reusable, expanding read and write buffers in order to avoid - * allocating new byte[]s all the time. Since the buffers only expand, you - * should probably only use this transport if your messages are not too variably - * large, unless the persistent memory cost is not an issue. - * - * This implementation is NOT threadsafe. - */ -public class TFastFramedTransport extends TTransport { - - public static class Factory extends TTransportFactory { - private final int initialCapacity; - private final int maxLength; - - public Factory() { - this(DEFAULT_BUF_CAPACITY, DEFAULT_MAX_LENGTH); - } - - public Factory(int initialCapacity) { - this(initialCapacity, DEFAULT_MAX_LENGTH); - } - - public Factory(int initialCapacity, int maxLength) { - this.initialCapacity = initialCapacity; - this.maxLength = maxLength; - } - - @Override - public TTransport getTransport(TTransport trans) { - return new TFastFramedTransport(trans, - initialCapacity, - maxLength); - } - } - - /** - * How big should the default read and write buffers be? - */ - public static final int DEFAULT_BUF_CAPACITY = 1024; - /** - * How big is the largest allowable frame? Defaults to 16MB. - */ - public static final int DEFAULT_MAX_LENGTH = 16384000; - - private final TTransport underlying; - private final AutoExpandingBufferWriteTransport writeBuffer; - private final AutoExpandingBufferReadTransport readBuffer; - private final byte[] i32buf = new byte[4]; - private final int maxLength; - - /** - * Create a new {@link TFastFramedTransport}. Use the defaults - * for initial buffer size and max frame length. - * @param underlying Transport that real reads and writes will go through to. - */ - public TFastFramedTransport(TTransport underlying) { - this(underlying, DEFAULT_BUF_CAPACITY, DEFAULT_MAX_LENGTH); - } - - /** - * Create a new {@link TFastFramedTransport}. Use the specified - * initial buffer capacity and the default max frame length. - * @param underlying Transport that real reads and writes will go through to. - * @param initialBufferCapacity The initial size of the read and write buffers. - * In practice, it's not critical to set this unless you know in advance that - * your messages are going to be very large. - */ - public TFastFramedTransport(TTransport underlying, int initialBufferCapacity) { - this(underlying, initialBufferCapacity, DEFAULT_MAX_LENGTH); - } - - /** - * - * @param underlying Transport that real reads and writes will go through to. - * @param initialBufferCapacity The initial size of the read and write buffers. - * In practice, it's not critical to set this unless you know in advance that - * your messages are going to be very large. (You can pass - * TFramedTransportWithReusableBuffer.DEFAULT_BUF_CAPACITY if you're only - * using this constructor because you want to set the maxLength.) - * @param maxLength The max frame size you are willing to read. You can use - * this parameter to limit how much memory can be allocated. - */ - public TFastFramedTransport(TTransport underlying, int initialBufferCapacity, int maxLength) { - this.underlying = underlying; - this.maxLength = maxLength; - writeBuffer = new AutoExpandingBufferWriteTransport(initialBufferCapacity, 1.5); - readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity, 1.5); - } - - @Override - public void close() { - underlying.close(); - } - - @Override - public boolean isOpen() { - return underlying.isOpen(); - } - - @Override - public void open() throws TTransportException { - underlying.open(); - } - - @Override - public int read(byte[] buf, int off, int len) throws TTransportException { - int got = readBuffer.read(buf, off, len); - if (got > 0) { - return got; - } - - // Read another frame of data - readFrame(); - - return readBuffer.read(buf, off, len); - } - - private void readFrame() throws TTransportException { - underlying.readAll(i32buf , 0, 4); - int size = TFramedTransport.decodeFrameSize(i32buf); - - if (size < 0) { - throw new TTransportException("Read a negative frame size (" + size + ")!"); - } - - if (size > maxLength) { - throw new TTransportException("Frame size (" + size + ") larger than max length (" + maxLength + ")!"); - } - - readBuffer.fill(underlying, size); - } - - @Override - public void write(byte[] buf, int off, int len) throws TTransportException { - writeBuffer.write(buf, off, len); - } - - @Override - public void consumeBuffer(int len) { - readBuffer.consumeBuffer(len); - } - - @Override - public void flush() throws TTransportException { - int length = writeBuffer.getPos(); - TFramedTransport.encodeFrameSize(length, i32buf); - underlying.write(i32buf, 0, 4); - underlying.write(writeBuffer.getBuf().array(), 0, length); - writeBuffer.reset(); - underlying.flush(); - } - - @Override - public byte[] getBuffer() { - return readBuffer.getBuffer(); - } - - @Override - public int getBufferPosition() { - return readBuffer.getBufferPosition(); - } - - @Override - public int getBytesRemainingInBuffer() { - return readBuffer.getBytesRemainingInBuffer(); - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TFileProcessor.java b/app/src/main/java/org/apache/thrift/transport/TFileProcessor.java deleted file mode 100644 index 19db896..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TFileProcessor.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.apache.thrift.TProcessor; -import org.apache.thrift.TException; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.protocol.TProtocolFactory; - - -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.RandomAccessFile; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.IOException; - -/** - * FileProcessor: helps in processing files generated by TFileTransport. - * Port of original cpp implementation - * - * @author Joydeep Sen Sarma - */ -public class TFileProcessor { - - private TProcessor processor_; - private TProtocolFactory inputProtocolFactory_; - private TProtocolFactory outputProtocolFactory_; - private TFileTransport inputTransport_; - private TTransport outputTransport_; - - public TFileProcessor(TProcessor processor, TProtocolFactory protocolFactory, - TFileTransport inputTransport, - TTransport outputTransport) { - processor_ = processor; - inputProtocolFactory_ = outputProtocolFactory_ = protocolFactory; - inputTransport_ = inputTransport; - outputTransport_ = outputTransport; - } - - public TFileProcessor(TProcessor processor, - TProtocolFactory inputProtocolFactory, - TProtocolFactory outputProtocolFactory, - TFileTransport inputTransport, - TTransport outputTransport) { - processor_ = processor; - inputProtocolFactory_ = inputProtocolFactory; - outputProtocolFactory_ = outputProtocolFactory; - inputTransport_ = inputTransport; - outputTransport_ = outputTransport; - } - - private void processUntil(int lastChunk) throws TException { - TProtocol ip = inputProtocolFactory_.getProtocol(inputTransport_); - TProtocol op = outputProtocolFactory_.getProtocol(outputTransport_); - int curChunk = inputTransport_.getCurChunk(); - - try { - while (lastChunk >= curChunk) { - processor_.process(ip, op); - int newChunk = inputTransport_.getCurChunk(); - curChunk = newChunk; - } - } catch (TTransportException e) { - // if we are processing the last chunk - we could have just hit EOF - // on EOF - trap the error and stop processing. - if(e.getType() != TTransportException.END_OF_FILE) - throw e; - else { - return; - } - } - } - - /** - * Process from start to last chunk both inclusive where chunks begin from 0 - - * @param startChunkNum first chunk to be processed - * @param endChunkNum last chunk to be processed - */ - public void processChunk(int startChunkNum, int endChunkNum) throws TException { - int numChunks = inputTransport_.getNumChunks(); - if(endChunkNum < 0) - endChunkNum += numChunks; - - if(startChunkNum < 0) - startChunkNum += numChunks; - - if(endChunkNum < startChunkNum) - throw new TException("endChunkNum " + endChunkNum + " is less than " + startChunkNum); - - inputTransport_.seekToChunk(startChunkNum); - processUntil(endChunkNum); - } - - /** - * Process a single chunk - * - * @param chunkNum chunk to be processed - */ - public void processChunk(int chunkNum) throws TException { - processChunk(chunkNum, chunkNum); - } - - /** - * Process a current chunk - */ - public void processChunk() throws TException { - processChunk(inputTransport_.getCurChunk()); - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TFileTransport.java b/app/src/main/java/org/apache/thrift/transport/TFileTransport.java deleted file mode 100644 index f5abe53..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TFileTransport.java +++ /dev/null @@ -1,628 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.IOException; -import java.util.Random; - -/** - * FileTransport implementation of the TTransport interface. - * Currently this is a straightforward port of the cpp implementation - * - * It may make better sense to provide a basic stream access on top of the framed file format - * The FileTransport can then be a user of this framed file format with some additional logic - * for chunking. - * - * @author Joydeep Sen Sarma - */ -public class TFileTransport extends TTransport { - - public static class truncableBufferedInputStream extends BufferedInputStream { - public void trunc() { - pos = count = 0; - } - public truncableBufferedInputStream(InputStream in) { - super(in); - } - public truncableBufferedInputStream(InputStream in, int size) { - super(in, size); - } - } - - - public static class Event { - private byte[] buf_; - private int nread_; - private int navailable_; - - /** - * Initialize an event. Initially, it has no valid contents - * - * @param buf byte array buffer to store event - */ - public Event(byte[] buf) { - buf_ = buf; - nread_ = navailable_ = 0; - } - - public byte[] getBuf() { return buf_;} - public int getSize() { return buf_.length; } - - - public void setAvailable(int sz) { nread_ = 0; navailable_=sz;} - public int getRemaining() { return (navailable_ - nread_); } - - public int emit(byte[] buf, int offset, int ndesired) { - if((ndesired == 0) || (ndesired > getRemaining())) - ndesired = getRemaining(); - - if(ndesired <= 0) - return (ndesired); - - System.arraycopy(buf_, nread_, buf, offset, ndesired); - nread_ += ndesired; - - return(ndesired); - } - }; - - public static class chunkState { - /** - * Chunk Size. Must be same across all implementations - */ - public static final int DEFAULT_CHUNK_SIZE = 16 * 1024 * 1024; - - private int chunk_size_ = DEFAULT_CHUNK_SIZE; - private long offset_ = 0; - - public chunkState() {} - public chunkState(int chunk_size) { chunk_size_ = chunk_size; } - - public void skip(int size) {offset_ += size; } - public void seek(long offset) {offset_ = offset;} - - public int getChunkSize() { return chunk_size_;} - public int getChunkNum() { return ((int)(offset_/chunk_size_));} - public int getRemaining() { return (chunk_size_ - ((int)(offset_ % chunk_size_)));} - public long getOffset() { return (offset_);} - } - - public static enum tailPolicy { - - NOWAIT(0, 0), - WAIT_FOREVER(500, -1); - - /** - * Time in milliseconds to sleep before next read - * If 0, no sleep - */ - public final int timeout_; - - /** - * Number of retries before giving up - * if 0, no retries - * if -1, retry forever - */ - public final int retries_; - - /** - * ctor for policy - * - * @param timeout sleep time for this particular policy - * @param retries number of retries - */ - - tailPolicy(int timeout, int retries) { - timeout_ = timeout; - retries_ = retries; - } - } - - /** - * Current tailing policy - */ - tailPolicy currentPolicy_ = tailPolicy.NOWAIT; - - - /** - * Underlying file being read - */ - protected TSeekableFile inputFile_ = null; - - /** - * Underlying outputStream - */ - protected OutputStream outputStream_ = null; - - - /** - * Event currently read in - */ - Event currentEvent_ = null; - - /** - * InputStream currently being used for reading - */ - InputStream inputStream_ = null; - - /** - * current Chunk state - */ - chunkState cs = null; - - /** - * Read timeout - */ - private int readTimeout_ = 0; - - /** - * is read only? - */ - private boolean readOnly_ = false; - - /** - * Get File Tailing Policy - * - * @return current read policy - */ - public tailPolicy getTailPolicy() { - return (currentPolicy_); - } - - /** - * Set file Tailing Policy - * - * @param policy New policy to set - * @return Old policy - */ - public tailPolicy setTailPolicy(tailPolicy policy) { - tailPolicy old = currentPolicy_; - currentPolicy_ = policy; - return (old); - } - - - /** - * Initialize read input stream - * - * @return input stream to read from file - */ - private InputStream createInputStream() throws TTransportException { - InputStream is; - try { - if(inputStream_ != null) { - ((truncableBufferedInputStream)inputStream_).trunc(); - is = inputStream_; - } else { - is = new truncableBufferedInputStream(inputFile_.getInputStream()); - } - } catch (IOException iox) { - System.err.println("createInputStream: "+iox.getMessage()); - throw new TTransportException(iox.getMessage(), iox); - } - return(is); - } - - /** - * Read (potentially tailing) an input stream - * - * @param is InputStream to read from - * @param buf Buffer to read into - * @param off Offset in buffer to read into - * @param len Number of bytes to read - * @param tp policy to use if we hit EOF - * - * @return number of bytes read - */ - private int tailRead(InputStream is, byte[] buf, - int off, int len, tailPolicy tp) throws TTransportException { - int orig_len = len; - try { - int retries = 0; - while(len > 0) { - int cnt = is.read(buf, off, len); - if(cnt > 0) { - off += cnt; - len -= cnt; - retries = 0; - cs.skip(cnt); // remember that we read so many bytes - } else if (cnt == -1) { - // EOF - retries++; - - if((tp.retries_ != -1) && tp.retries_ < retries) - return (orig_len - len); - - if(tp.timeout_ > 0) { - try {Thread.sleep(tp.timeout_);} catch(InterruptedException e) {} - } - } else { - // either non-zero or -1 is what the contract says! - throw new - TTransportException("Unexpected return from InputStream.read = " - + cnt); - } - } - } catch (IOException iox) { - throw new TTransportException(iox.getMessage(), iox); - } - - return(orig_len - len); - } - - /** - * Event is corrupted. Do recovery - * - * @return true if recovery could be performed and we can read more data - * false is returned only when nothing more can be read - */ - private boolean performRecovery() throws TTransportException { - int numChunks = getNumChunks(); - int curChunk = cs.getChunkNum(); - - if(curChunk >= (numChunks-1)) { - return false; - } - seekToChunk(curChunk+1); - return true; - } - - /** - * Read event from underlying file - * - * @return true if event could be read, false otherwise (on EOF) - */ - private boolean readEvent() throws TTransportException { - byte[] ebytes = new byte[4]; - int esize; - int nread; - int nrequested; - - retry: - do { - // corner case. read to end of chunk - nrequested = cs.getRemaining(); - if(nrequested < 4) { - nread = tailRead(inputStream_, ebytes, 0, nrequested, currentPolicy_); - if(nread != nrequested) { - return(false); - } - } - - // assuming serialized on little endian machine - nread = tailRead(inputStream_, ebytes, 0, 4, currentPolicy_); - if(nread != 4) { - return(false); - } - - esize=0; - for(int i=3; i>=0; i--) { - int val = (0x000000ff & (int)ebytes[i]); - esize |= (val << (i*8)); - } - - // check if event is corrupted and do recovery as required - if(esize > cs.getRemaining()) { - throw new TTransportException("FileTransport error: bad event size"); - /* - if(performRecovery()) { - esize=0; - } else { - return false; - } - */ - } - } while (esize == 0); - - // reset existing event or get a larger one - if(currentEvent_.getSize() < esize) - currentEvent_ = new Event(new byte [esize]); - - // populate the event - byte[] buf = currentEvent_.getBuf(); - nread = tailRead(inputStream_, buf, 0, esize, currentPolicy_); - if(nread != esize) { - return(false); - } - currentEvent_.setAvailable(esize); - return(true); - } - - /** - * open if both input/output open unless readonly - * - * @return true - */ - public boolean isOpen() { - return ((inputStream_ != null) && (readOnly_ || (outputStream_ != null))); - } - - - /** - * Diverging from the cpp model and sticking to the TSocket model - * Files are not opened in ctor - but in explicit open call - */ - public void open() throws TTransportException { - if (isOpen()) - throw new TTransportException(TTransportException.ALREADY_OPEN); - - try { - inputStream_ = createInputStream(); - cs = new chunkState(); - currentEvent_ = new Event(new byte [256]); - - if(!readOnly_) - outputStream_ = new BufferedOutputStream(inputFile_.getOutputStream(), 8192); - } catch (IOException iox) { - throw new TTransportException(TTransportException.NOT_OPEN, iox); - } - } - - /** - * Closes the transport. - */ - public void close() { - if (inputFile_ != null) { - try { - inputFile_.close(); - } catch (IOException iox) { - System.err.println("WARNING: Error closing input file: " + - iox.getMessage()); - } - inputFile_ = null; - } - if (outputStream_ != null) { - try { - outputStream_.close(); - } catch (IOException iox) { - System.err.println("WARNING: Error closing output stream: " + - iox.getMessage()); - } - outputStream_ = null; - } - } - - - /** - * File Transport ctor - * - * @param path File path to read and write from - * @param readOnly Whether this is a read-only transport - */ - public TFileTransport(final String path, boolean readOnly) throws IOException { - inputFile_ = new TStandardFile(path); - readOnly_ = readOnly; - } - - /** - * File Transport ctor - * - * @param inputFile open TSeekableFile to read/write from - * @param readOnly Whether this is a read-only transport - */ - public TFileTransport(TSeekableFile inputFile, boolean readOnly) { - inputFile_ = inputFile; - readOnly_ = readOnly; - } - - - /** - * Cloned from TTransport.java:readAll(). Only difference is throwing an EOF exception - * where one is detected. - */ - public int readAll(byte[] buf, int off, int len) - throws TTransportException { - int got = 0; - int ret = 0; - while (got < len) { - ret = read(buf, off+got, len-got); - if (ret < 0) { - throw new TTransportException("Error in reading from file"); - } - if(ret == 0) { - throw new TTransportException(TTransportException.END_OF_FILE, - "End of File reached"); - } - got += ret; - } - return got; - } - - - /** - * Reads up to len bytes into buffer buf, starting at offset off. - * - * @param buf Array to read into - * @param off Index to start reading at - * @param len Maximum number of bytes to read - * @return The number of bytes actually read - * @throws TTransportException if there was an error reading data - */ - public int read(byte[] buf, int off, int len) throws TTransportException { - if(!isOpen()) - throw new TTransportException(TTransportException.NOT_OPEN, - "Must open before reading"); - - if(currentEvent_.getRemaining() == 0) { - if(!readEvent()) - return(0); - } - - int nread = currentEvent_.emit(buf, off, len); - return nread; - } - - public int getNumChunks() throws TTransportException { - if(!isOpen()) - throw new TTransportException(TTransportException.NOT_OPEN, - "Must open before getNumChunks"); - try { - long len = inputFile_.length(); - if(len == 0) - return 0; - else - return (((int)(len/cs.getChunkSize())) + 1); - - } catch (IOException iox) { - throw new TTransportException(iox.getMessage(), iox); - } - } - - public int getCurChunk() throws TTransportException { - if(!isOpen()) - throw new TTransportException(TTransportException.NOT_OPEN, - "Must open before getCurChunk"); - return (cs.getChunkNum()); - - } - - - public void seekToChunk(int chunk) throws TTransportException { - if(!isOpen()) - throw new TTransportException(TTransportException.NOT_OPEN, - "Must open before seeking"); - - int numChunks = getNumChunks(); - - // file is empty, seeking to chunk is pointless - if (numChunks == 0) { - return; - } - - // negative indicates reverse seek (from the end) - if (chunk < 0) { - chunk += numChunks; - } - - // too large a value for reverse seek, just seek to beginning - if (chunk < 0) { - chunk = 0; - } - - long eofOffset=0; - boolean seekToEnd = (chunk >= numChunks); - if(seekToEnd) { - chunk = chunk - 1; - try { eofOffset = inputFile_.length(); } - catch (IOException iox) {throw new TTransportException(iox.getMessage(), - iox);} - } - - if(chunk*cs.getChunkSize() != cs.getOffset()) { - try { inputFile_.seek((long)chunk*cs.getChunkSize()); } - catch (IOException iox) { - System.err.println("createInputStream: "+iox.getMessage()); - throw new TTransportException("Seek to chunk " + - chunk + " " +iox.getMessage(), iox); - } - - cs.seek((long)chunk*cs.getChunkSize()); - currentEvent_.setAvailable(0); - inputStream_ = createInputStream(); - } - - if(seekToEnd) { - // waiting forever here - otherwise we can hit EOF and end up - // having consumed partial data from the data stream. - tailPolicy old = setTailPolicy(tailPolicy.WAIT_FOREVER); - while(cs.getOffset() < eofOffset) { readEvent(); } - currentEvent_.setAvailable(0); - setTailPolicy(old); - } - } - - public void seekToEnd() throws TTransportException { - if(!isOpen()) - throw new TTransportException(TTransportException.NOT_OPEN, - "Must open before seeking"); - seekToChunk(getNumChunks()); - } - - - /** - * Writes up to len bytes from the buffer. - * - * @param buf The output data buffer - * @param off The offset to start writing from - * @param len The number of bytes to write - * @throws TTransportException if there was an error writing data - */ - public void write(byte[] buf, int off, int len) throws TTransportException { - throw new TTransportException("Not Supported"); - } - - /** - * Flush any pending data out of a transport buffer. - * - * @throws TTransportException if there was an error writing out data. - */ - public void flush() throws TTransportException { - throw new TTransportException("Not Supported"); - } - - /** - * test program - * - */ - public static void main(String[] args) throws Exception { - - int num_chunks = 10; - - if((args.length < 1) || args[0].equals("--help") - || args[0].equals("-h") || args[0].equals("-?")) { - printUsage(); - } - - if(args.length > 1) { - try { - num_chunks = Integer.parseInt(args[1]); - } catch (Exception e) { - System.err.println("Cannot parse " + args[1]); - printUsage(); - } - } - - TFileTransport t = new TFileTransport(args[0], true); - t.open(); - System.out.println("NumChunks="+t.getNumChunks()); - - Random r = new Random(); - for(int j=0; j [num_chunks]"); - System.err.println(" (Opens and reads num_chunks chunks from file randomly)"); - System.exit(1); - } - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TFramedTransport.java b/app/src/main/java/org/apache/thrift/transport/TFramedTransport.java deleted file mode 100644 index c948aa4..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TFramedTransport.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.apache.thrift.TByteArrayOutputStream; - -/** - * TFramedTransport is a buffered TTransport that ensures a fully read message - * every time by preceding messages with a 4-byte frame size. - */ -public class TFramedTransport extends TTransport { - - protected static final int DEFAULT_MAX_LENGTH = 16384000; - - private int maxLength_; - - /** - * Underlying transport - */ - private TTransport transport_ = null; - - /** - * Buffer for output - */ - private final TByteArrayOutputStream writeBuffer_ = - new TByteArrayOutputStream(1024); - - /** - * Buffer for input - */ - private TMemoryInputTransport readBuffer_ = new TMemoryInputTransport(new byte[0]); - - public static class Factory extends TTransportFactory { - private int maxLength_; - - public Factory() { - maxLength_ = TFramedTransport.DEFAULT_MAX_LENGTH; - } - - public Factory(int maxLength) { - maxLength_ = maxLength; - } - - @Override - public TTransport getTransport(TTransport base) { - return new TFramedTransport(base, maxLength_); - } - } - - /** - * Constructor wraps around another transport - */ - public TFramedTransport(TTransport transport, int maxLength) { - transport_ = transport; - maxLength_ = maxLength; - } - - public TFramedTransport(TTransport transport) { - transport_ = transport; - maxLength_ = TFramedTransport.DEFAULT_MAX_LENGTH; - } - - public void open() throws TTransportException { - transport_.open(); - } - - public boolean isOpen() { - return transport_.isOpen(); - } - - public void close() { - transport_.close(); - } - - public int read(byte[] buf, int off, int len) throws TTransportException { - if (readBuffer_ != null) { - int got = readBuffer_.read(buf, off, len); - if (got > 0) { - return got; - } - } - - // Read another frame of data - readFrame(); - - return readBuffer_.read(buf, off, len); - } - - @Override - public byte[] getBuffer() { - return readBuffer_.getBuffer(); - } - - @Override - public int getBufferPosition() { - return readBuffer_.getBufferPosition(); - } - - @Override - public int getBytesRemainingInBuffer() { - return readBuffer_.getBytesRemainingInBuffer(); - } - - @Override - public void consumeBuffer(int len) { - readBuffer_.consumeBuffer(len); - } - - private final byte[] i32buf = new byte[4]; - - private void readFrame() throws TTransportException { - transport_.readAll(i32buf, 0, 4); - int size = decodeFrameSize(i32buf); - - if (size < 0) { - throw new TTransportException("Read a negative frame size (" + size + ")!"); - } - - if (size > maxLength_) { - throw new TTransportException("Frame size (" + size + ") larger than max length (" + maxLength_ + ")!"); - } - - byte[] buff = new byte[size]; - transport_.readAll(buff, 0, size); - readBuffer_.reset(buff); - } - - public void write(byte[] buf, int off, int len) throws TTransportException { - writeBuffer_.write(buf, off, len); - } - - @Override - public void flush() throws TTransportException { - byte[] buf = writeBuffer_.get(); - int len = writeBuffer_.len(); - writeBuffer_.reset(); - - encodeFrameSize(len, i32buf); - transport_.write(i32buf, 0, 4); - transport_.write(buf, 0, len); - transport_.flush(); - } - - public static final void encodeFrameSize(final int frameSize, final byte[] buf) { - buf[0] = (byte)(0xff & (frameSize >> 24)); - buf[1] = (byte)(0xff & (frameSize >> 16)); - buf[2] = (byte)(0xff & (frameSize >> 8)); - buf[3] = (byte)(0xff & (frameSize)); - } - - public static final int decodeFrameSize(final byte[] buf) { - return - ((buf[0] & 0xff) << 24) | - ((buf[1] & 0xff) << 16) | - ((buf[2] & 0xff) << 8) | - ((buf[3] & 0xff)); - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java b/app/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java deleted file mode 100644 index c8cd118..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TIOStreamTransport.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -/** - * This is the most commonly used base transport. It takes an InputStream - * and an OutputStream and uses those to perform all transport operations. - * This allows for compatibility with all the nice constructs Java already - * has to provide a variety of types of streams. - * - */ -public class TIOStreamTransport extends TTransport { - - private static final Logger LOGGER = LoggerFactory.getLogger(TIOStreamTransport.class.getName()); - - /** Underlying inputStream */ - protected InputStream inputStream_ = null; - - /** Underlying outputStream */ - protected OutputStream outputStream_ = null; - - /** - * Subclasses can invoke the default constructor and then assign the input - * streams in the open method. - */ - protected TIOStreamTransport() {} - - /** - * Input stream constructor. - * - * @param is Input stream to read from - */ - public TIOStreamTransport(InputStream is) { - inputStream_ = is; - } - - /** - * Output stream constructor. - * - * @param os Output stream to read from - */ - public TIOStreamTransport(OutputStream os) { - outputStream_ = os; - } - - /** - * Two-way stream constructor. - * - * @param is Input stream to read from - * @param os Output stream to read from - */ - public TIOStreamTransport(InputStream is, OutputStream os) { - inputStream_ = is; - outputStream_ = os; - } - - /** - * The streams must already be open at construction time, so this should - * always return true. - * - * @return true - */ - public boolean isOpen() { - return true; - } - - /** - * The streams must already be open. This method does nothing. - */ - public void open() throws TTransportException {} - - /** - * Closes both the input and output streams. - */ - public void close() { - if (inputStream_ != null) { - try { - inputStream_.close(); - } catch (IOException iox) { - LOGGER.warn("Error closing input stream.", iox); - } - inputStream_ = null; - } - if (outputStream_ != null) { - try { - outputStream_.close(); - } catch (IOException iox) { - LOGGER.warn("Error closing output stream.", iox); - } - outputStream_ = null; - } - } - - /** - * Reads from the underlying input stream if not null. - */ - public int read(byte[] buf, int off, int len) throws TTransportException { - if (inputStream_ == null) { - throw new TTransportException(TTransportException.NOT_OPEN, "Cannot read from null inputStream"); - } - int bytesRead; - try { - bytesRead = inputStream_.read(buf, off, len); - } catch (IOException iox) { - throw new TTransportException(TTransportException.UNKNOWN, iox); - } - if (bytesRead < 0) { - throw new TTransportException(TTransportException.END_OF_FILE); - } - return bytesRead; - } - - /** - * Writes to the underlying output stream if not null. - */ - public void write(byte[] buf, int off, int len) throws TTransportException { - if (outputStream_ == null) { - throw new TTransportException(TTransportException.NOT_OPEN, "Cannot write to null outputStream"); - } - try { - outputStream_.write(buf, off, len); - } catch (IOException iox) { - throw new TTransportException(TTransportException.UNKNOWN, iox); - } - } - - /** - * Flushes the underlying output stream if not null. - */ - public void flush() throws TTransportException { - if (outputStream_ == null) { - throw new TTransportException(TTransportException.NOT_OPEN, "Cannot flush null outputStream"); - } - try { - outputStream_.flush(); - } catch (IOException iox) { - throw new TTransportException(TTransportException.UNKNOWN, iox); - } - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TMemoryBuffer.java b/app/src/main/java/org/apache/thrift/transport/TMemoryBuffer.java deleted file mode 100644 index 53354af..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TMemoryBuffer.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.apache.thrift.TByteArrayOutputStream; -import java.io.UnsupportedEncodingException; - -/** - * Memory buffer-based implementation of the TTransport interface. - */ -public class TMemoryBuffer extends TTransport { - /** - * Create a TMemoryBuffer with an initial buffer size of size. The - * internal buffer will grow as necessary to accommodate the size of the data - * being written to it. - */ - public TMemoryBuffer(int size) { - arr_ = new TByteArrayOutputStream(size); - } - - @Override - public boolean isOpen() { - return true; - } - - @Override - public void open() { - /* Do nothing */ - } - - @Override - public void close() { - /* Do nothing */ - } - - @Override - public int read(byte[] buf, int off, int len) { - byte[] src = arr_.get(); - int amtToRead = (len > arr_.len() - pos_ ? arr_.len() - pos_ : len); - if (amtToRead > 0) { - System.arraycopy(src, pos_, buf, off, amtToRead); - pos_ += amtToRead; - } - return amtToRead; - } - - @Override - public void write(byte[] buf, int off, int len) { - arr_.write(buf, off, len); - } - - /** - * Output the contents of the memory buffer as a String, using the supplied - * encoding - * @param enc the encoding to use - * @return the contents of the memory buffer as a String - */ - public String toString(String enc) throws UnsupportedEncodingException { - return arr_.toString(enc); - } - - public String inspect() { - String buf = ""; - byte[] bytes = arr_.toByteArray(); - for (int i = 0; i < bytes.length; i++) { - buf += (pos_ == i ? "==>" : "" ) + Integer.toHexString(bytes[i] & 0xff) + " "; - } - return buf; - } - - // The contents of the buffer - private TByteArrayOutputStream arr_; - - // Position to read next byte from - private int pos_; - - public int length() { - return arr_.size(); - } - - public byte[] getArray() { - return arr_.get(); - } -} - diff --git a/app/src/main/java/org/apache/thrift/transport/TMemoryInputTransport.java b/app/src/main/java/org/apache/thrift/transport/TMemoryInputTransport.java deleted file mode 100644 index 2530dcc..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TMemoryInputTransport.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.thrift.transport; - -public final class TMemoryInputTransport extends TTransport { - - private byte[] buf_; - private int pos_; - private int endPos_; - - public TMemoryInputTransport() { - } - - public TMemoryInputTransport(byte[] buf) { - reset(buf); - } - - public TMemoryInputTransport(byte[] buf, int offset, int length) { - reset(buf, offset, length); - } - - public void reset(byte[] buf) { - reset(buf, 0, buf.length); - } - - public void reset(byte[] buf, int offset, int length) { - buf_ = buf; - pos_ = offset; - endPos_ = offset + length; - } - - public void clear() { - buf_ = null; - } - - @Override - public void close() {} - - @Override - public boolean isOpen() { - return true; - } - - @Override - public void open() throws TTransportException {} - - @Override - public int read(byte[] buf, int off, int len) throws TTransportException { - int bytesRemaining = getBytesRemainingInBuffer(); - int amtToRead = (len > bytesRemaining ? bytesRemaining : len); - if (amtToRead > 0) { - System.arraycopy(buf_, pos_, buf, off, amtToRead); - consumeBuffer(amtToRead); - } - return amtToRead; - } - - @Override - public void write(byte[] buf, int off, int len) throws TTransportException { - throw new UnsupportedOperationException("No writing allowed!"); - } - - @Override - public byte[] getBuffer() { - return buf_; - } - - public int getBufferPosition() { - return pos_; - } - - public int getBytesRemainingInBuffer() { - return endPos_ - pos_; - } - - public void consumeBuffer(int len) { - pos_ += len; - } - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TNonblockingServerSocket.java b/app/src/main/java/org/apache/thrift/transport/TNonblockingServerSocket.java deleted file mode 100644 index 25b487e..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TNonblockingServerSocket.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -package org.apache.thrift.transport; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.SocketException; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Wrapper around ServerSocketChannel - */ -public class TNonblockingServerSocket extends TNonblockingServerTransport { - private static final Logger LOGGER = LoggerFactory.getLogger(TNonblockingServerTransport.class.getName()); - - /** - * This channel is where all the nonblocking magic happens. - */ - private ServerSocketChannel serverSocketChannel = null; - - /** - * Underlying ServerSocket object - */ - private ServerSocket serverSocket_ = null; - - /** - * Timeout for client sockets from accept - */ - private int clientTimeout_ = 0; - - /** - * Creates just a port listening server socket - */ - public TNonblockingServerSocket(int port) throws TTransportException { - this(port, 0); - } - - /** - * Creates just a port listening server socket - */ - public TNonblockingServerSocket(int port, int clientTimeout) throws TTransportException { - this(new InetSocketAddress(port), clientTimeout); - } - - public TNonblockingServerSocket(InetSocketAddress bindAddr) throws TTransportException { - this(bindAddr, 0); - } - - public TNonblockingServerSocket(InetSocketAddress bindAddr, int clientTimeout) throws TTransportException { - clientTimeout_ = clientTimeout; - try { - serverSocketChannel = ServerSocketChannel.open(); - serverSocketChannel.configureBlocking(false); - - // Make server socket - serverSocket_ = serverSocketChannel.socket(); - // Prevent 2MSL delay problem on server restarts - serverSocket_.setReuseAddress(true); - // Bind to listening port - serverSocket_.bind(bindAddr); - } catch (IOException ioe) { - serverSocket_ = null; - throw new TTransportException("Could not create ServerSocket on address " + bindAddr.toString() + "."); - } - } - - public void listen() throws TTransportException { - // Make sure not to block on accept - if (serverSocket_ != null) { - try { - serverSocket_.setSoTimeout(0); - } catch (SocketException sx) { - sx.printStackTrace(); - } - } - } - - protected TNonblockingSocket acceptImpl() throws TTransportException { - if (serverSocket_ == null) { - throw new TTransportException(TTransportException.NOT_OPEN, "No underlying server socket."); - } - try { - SocketChannel socketChannel = serverSocketChannel.accept(); - if (socketChannel == null) { - return null; - } - - TNonblockingSocket tsocket = new TNonblockingSocket(socketChannel); - tsocket.setTimeout(clientTimeout_); - return tsocket; - } catch (IOException iox) { - throw new TTransportException(iox); - } - } - - public void registerSelector(Selector selector) { - try { - // Register the server socket channel, indicating an interest in - // accepting new connections - serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); - } catch (ClosedChannelException e) { - // this shouldn't happen, ideally... - // TODO: decide what to do with this. - } - } - - public void close() { - if (serverSocket_ != null) { - try { - serverSocket_.close(); - } catch (IOException iox) { - LOGGER.warn("WARNING: Could not close server socket: " + iox.getMessage()); - } - serverSocket_ = null; - } - } - - public void interrupt() { - // The thread-safeness of this is dubious, but Java documentation suggests - // that it is safe to do this from a different thread context - close(); - } - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TNonblockingServerTransport.java b/app/src/main/java/org/apache/thrift/transport/TNonblockingServerTransport.java deleted file mode 100644 index ba45b09..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TNonblockingServerTransport.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -package org.apache.thrift.transport; - -import java.nio.channels.Selector; - -/** - * Server transport that can be operated in a nonblocking fashion. - */ -public abstract class TNonblockingServerTransport extends TServerTransport { - - public abstract void registerSelector(Selector selector); -} diff --git a/app/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java b/app/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java deleted file mode 100644 index 482bd14..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TNonblockingSocket.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -package org.apache.thrift.transport; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketAddress; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.SocketChannel; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Transport for use with async client. - */ -public class TNonblockingSocket extends TNonblockingTransport { - - private static final Logger LOGGER = LoggerFactory.getLogger(TNonblockingSocket.class.getName()); - - /** - * Host and port if passed in, used for lazy non-blocking connect. - */ - private final SocketAddress socketAddress_; - - private final SocketChannel socketChannel_; - - public TNonblockingSocket(String host, int port) throws IOException { - this(host, port, 0); - } - - /** - * Create a new nonblocking socket transport that will be connected to host:port. - * @param host - * @param port - * @throws TTransportException - * @throws IOException - */ - public TNonblockingSocket(String host, int port, int timeout) throws IOException { - this(SocketChannel.open(), timeout, new InetSocketAddress(host, port)); - } - - /** - * Constructor that takes an already created socket. - * - * @param socketChannel Already created SocketChannel object - * @throws IOException if there is an error setting up the streams - */ - public TNonblockingSocket(SocketChannel socketChannel) throws IOException { - this(socketChannel, 0, null); - if (!socketChannel.isConnected()) throw new IOException("Socket must already be connected"); - } - - private TNonblockingSocket(SocketChannel socketChannel, int timeout, SocketAddress socketAddress) - throws IOException { - socketChannel_ = socketChannel; - socketAddress_ = socketAddress; - - // make it a nonblocking channel - socketChannel.configureBlocking(false); - - // set options - Socket socket = socketChannel.socket(); - socket.setSoLinger(false, 0); - socket.setTcpNoDelay(true); - setTimeout(timeout); - } - - /** - * Register the new SocketChannel with our Selector, indicating - * we'd like to be notified when it's ready for I/O. - * - * @param selector - * @return the selection key for this socket. - */ - public SelectionKey registerSelector(Selector selector, int interests) throws IOException { - return socketChannel_.register(selector, interests); - } - - /** - * Sets the socket timeout, although this implementation never uses blocking operations so it is unused. - * - * @param timeout Milliseconds timeout - */ - public void setTimeout(int timeout) { - try { - socketChannel_.socket().setSoTimeout(timeout); - } catch (SocketException sx) { - LOGGER.warn("Could not set socket timeout.", sx); - } - } - - /** - * Returns a reference to the underlying SocketChannel. - */ - public SocketChannel getSocketChannel() { - return socketChannel_; - } - - /** - * Checks whether the socket is connected. - */ - public boolean isOpen() { - // isConnected() does not return false after close(), but isOpen() does - return socketChannel_.isOpen() && socketChannel_.isConnected(); - } - - /** - * Do not call, the implementation provides its own lazy non-blocking connect. - */ - public void open() throws TTransportException { - throw new RuntimeException("open() is not implemented for TNonblockingSocket"); - } - - /** - * Perform a nonblocking read into buffer. - */ - public int read(ByteBuffer buffer) throws IOException { - return socketChannel_.read(buffer); - } - - - /** - * Reads from the underlying input stream if not null. - */ - public int read(byte[] buf, int off, int len) throws TTransportException { - if ((socketChannel_.validOps() & SelectionKey.OP_READ) != SelectionKey.OP_READ) { - throw new TTransportException(TTransportException.NOT_OPEN, - "Cannot read from write-only socket channel"); - } - try { - return socketChannel_.read(ByteBuffer.wrap(buf, off, len)); - } catch (IOException iox) { - throw new TTransportException(TTransportException.UNKNOWN, iox); - } - } - - /** - * Perform a nonblocking write of the data in buffer; - */ - public int write(ByteBuffer buffer) throws IOException { - return socketChannel_.write(buffer); - } - - /** - * Writes to the underlying output stream if not null. - */ - public void write(byte[] buf, int off, int len) throws TTransportException { - if ((socketChannel_.validOps() & SelectionKey.OP_WRITE) != SelectionKey.OP_WRITE) { - throw new TTransportException(TTransportException.NOT_OPEN, - "Cannot write to write-only socket channel"); - } - try { - socketChannel_.write(ByteBuffer.wrap(buf, off, len)); - } catch (IOException iox) { - throw new TTransportException(TTransportException.UNKNOWN, iox); - } - } - - /** - * Noop. - */ - public void flush() throws TTransportException { - // Not supported by SocketChannel. - } - - /** - * Closes the socket. - */ - public void close() { - try { - socketChannel_.close(); - } catch (IOException iox) { - LOGGER.warn("Could not close socket.", iox); - } - } - - /** {@inheritDoc} */ - public boolean startConnect() throws IOException { - return socketChannel_.connect(socketAddress_); - } - - /** {@inheritDoc} */ - public boolean finishConnect() throws IOException { - return socketChannel_.finishConnect(); - } - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TNonblockingTransport.java b/app/src/main/java/org/apache/thrift/transport/TNonblockingTransport.java deleted file mode 100644 index 43c1306..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TNonblockingTransport.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import java.io.IOException; -import java.net.SocketAddress; -import java.nio.ByteBuffer; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; - -public abstract class TNonblockingTransport extends TTransport { - - /** - * Non-blocking connection initialization. - * @see java.nio.channels.SocketChannel#connect(SocketAddress remote) - */ - public abstract boolean startConnect() throws IOException; - - /** - * Non-blocking connection completion. - * @see java.nio.channels.SocketChannel#finishConnect() - */ - public abstract boolean finishConnect() throws IOException; - - public abstract SelectionKey registerSelector(Selector selector, int interests) throws IOException; - - public abstract int read(ByteBuffer buffer) throws IOException; - - public abstract int write(ByteBuffer buffer) throws IOException; -} diff --git a/app/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java b/app/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java deleted file mode 100644 index 86d4913..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TSSLTransportFactory.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import java.io.FileInputStream; -import java.net.InetAddress; -import java.security.KeyStore; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLServerSocket; -import javax.net.ssl.SSLServerSocketFactory; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManagerFactory; - -/** - * A Factory for providing and setting up Client and Server SSL wrapped - * TSocket and TServerSocket - */ -public class TSSLTransportFactory { - - /** - * Get a SSL wrapped TServerSocket bound to the specified port. In this - * configuration the default settings are used. Default settings are retrieved - * from System properties that are set. - * - * Example system properties: - * -Djavax.net.ssl.trustStore= - * -Djavax.net.ssl.trustStorePassword=password - * -Djavax.net.ssl.keyStore= - * -Djavax.net.ssl.keyStorePassword=password - * - * @param port - * @return A SSL wrapped TServerSocket - * @throws TTransportException - */ - public static TServerSocket getServerSocket(int port) throws TTransportException { - return getServerSocket(port, 0); - } - - /** - * Get a default SSL wrapped TServerSocket bound to the specified port - * - * @param port - * @param clientTimeout - * @return A SSL wrapped TServerSocket - * @throws TTransportException - */ - public static TServerSocket getServerSocket(int port, int clientTimeout) throws TTransportException { - return getServerSocket(port, clientTimeout, false, null); - } - - /** - * Get a default SSL wrapped TServerSocket bound to the specified port and interface - * - * @param port - * @param clientTimeout - * @param ifAddress - * @return A SSL wrapped TServerSocket - * @throws TTransportException - */ - public static TServerSocket getServerSocket(int port, int clientTimeout, boolean clientAuth, InetAddress ifAddress) throws TTransportException { - SSLServerSocketFactory factory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); - return createServer(factory, port, clientTimeout, clientAuth, ifAddress, null); - } - - /** - * Get a configured SSL wrapped TServerSocket bound to the specified port and interface. - * Here the TSSLTransportParameters are used to set the values for the algorithms, keystore, - * truststore and other settings - * - * @param port - * @param clientTimeout - * @param ifAddress - * @param params - * @return A SSL wrapped TServerSocket - * @throws TTransportException - */ - public static TServerSocket getServerSocket(int port, int clientTimeout, InetAddress ifAddress, TSSLTransportParameters params) throws TTransportException { - if (params == null || !(params.isKeyStoreSet || params.isTrustStoreSet)) { - throw new TTransportException("Either one of the KeyStore or TrustStore must be set for SSLTransportParameters"); - } - - SSLContext ctx = createSSLContext(params); - return createServer(ctx.getServerSocketFactory(), port, clientTimeout, params.clientAuth, ifAddress, params); - } - - private static TServerSocket createServer(SSLServerSocketFactory factory, int port, int timeout, boolean clientAuth, - InetAddress ifAddress, TSSLTransportParameters params) throws TTransportException { - try { - SSLServerSocket serverSocket = (SSLServerSocket) factory.createServerSocket(port, 100, ifAddress); - serverSocket.setSoTimeout(timeout); - serverSocket.setNeedClientAuth(clientAuth); - if (params != null && params.cipherSuites != null) { - serverSocket.setEnabledCipherSuites(params.cipherSuites); - } - return new TServerSocket(serverSocket); - } catch (Exception e) { - throw new TTransportException("Could not bind to port " + port, e); - } - } - - /** - * Get a default SSL wrapped TSocket connected to the specified host and port. All - * the client methods return a bound connection. So there is no need to call open() on the - * TTransport. - * - * @param host - * @param port - * @param timeout - * @return A SSL wrapped TSocket - * @throws TTransportException - */ - public static TSocket getClientSocket(String host, int port, int timeout) throws TTransportException { - SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); - return createClient(factory, host, port, timeout); - } - - /** - * Get a default SSL wrapped TSocket connected to the specified host and port. - * - * @param host - * @param port - * @return A SSL wrapped TSocket - * @throws TTransportException - */ - public static TSocket getClientSocket(String host, int port) throws TTransportException { - return getClientSocket(host, port, 0); - } - - /** - * Get a custom configured SSL wrapped TSocket. The SSL settings are obtained from the - * passed in TSSLTransportParameters. - * - * @param host - * @param port - * @param timeout - * @param params - * @return A SSL wrapped TSocket - * @throws TTransportException - */ - public static TSocket getClientSocket(String host, int port, int timeout, TSSLTransportParameters params) throws TTransportException { - if (params == null || !(params.isKeyStoreSet || params.isTrustStoreSet)) { - throw new TTransportException("Either one of the KeyStore or TrustStore must be set for SSLTransportParameters"); - } - - SSLContext ctx = createSSLContext(params); - return createClient(ctx.getSocketFactory(), host, port, timeout); - } - - private static SSLContext createSSLContext(TSSLTransportParameters params) throws TTransportException { - SSLContext ctx; - try { - ctx = SSLContext.getInstance(params.protocol); - TrustManagerFactory tmf = null; - KeyManagerFactory kmf = null; - - if (params.isTrustStoreSet) { - tmf = TrustManagerFactory.getInstance(params.trustManagerType); - KeyStore ts = KeyStore.getInstance(params.trustStoreType); - ts.load(new FileInputStream(params.trustStore), params.trustPass.toCharArray()); - tmf.init(ts); - } - - if (params.isKeyStoreSet) { - kmf = KeyManagerFactory.getInstance(params.keyManagerType); - KeyStore ks = KeyStore.getInstance(params.keyStoreType); - ks.load(new FileInputStream(params.keyStore), params.keyPass.toCharArray()); - kmf.init(ks, params.keyPass.toCharArray()); - } - - if (params.isKeyStoreSet && params.isTrustStoreSet) { - ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); - } - else if (params.isKeyStoreSet) { - ctx.init(kmf.getKeyManagers(), null, null); - } - else { - ctx.init(null, tmf.getTrustManagers(), null); - } - - } catch (Exception e) { - throw new TTransportException("Error creating the transport", e); - } - return ctx; - } - - public static TSocket createClient(SSLSocketFactory factory, String host, int port, int timeout) throws TTransportException { - try { - SSLSocket socket = (SSLSocket) factory.createSocket(host, port); - socket.setSoTimeout(timeout); - return new TSocket(socket); - } catch (Exception e) { - throw new TTransportException("Could not connect to " + host + " on port " + port, e); - } - } - - - /** - * A Class to hold all the SSL parameters - */ - public static class TSSLTransportParameters { - protected String protocol = "TLS"; - protected String keyStore; - protected String keyPass; - protected String keyManagerType = KeyManagerFactory.getDefaultAlgorithm(); - protected String keyStoreType = "JKS"; - protected String trustStore; - protected String trustPass; - protected String trustManagerType = TrustManagerFactory.getDefaultAlgorithm(); - protected String trustStoreType = "JKS"; - protected String[] cipherSuites; - protected boolean clientAuth = false; - protected boolean isKeyStoreSet = false; - protected boolean isTrustStoreSet = false; - - public TSSLTransportParameters() {} - - /** - * Create parameters specifying the protocol and cipher suites - * - * @param protocol The specific protocol (TLS/SSL) can be specified with versions - * @param cipherSuites - */ - public TSSLTransportParameters(String protocol, String[] cipherSuites) { - this(protocol, cipherSuites, false); - } - - /** - * Create parameters specifying the protocol, cipher suites and if client authentication - * is required - * - * @param protocol The specific protocol (TLS/SSL) can be specified with versions - * @param cipherSuites - * @param clientAuth - */ - public TSSLTransportParameters(String protocol, String[] cipherSuites, boolean clientAuth) { - if (protocol != null) { - this.protocol = protocol; - } - this.cipherSuites = cipherSuites; - this.clientAuth = clientAuth; - } - - /** - * Set the keystore, password, certificate type and the store type - * - * @param keyStore Location of the Keystore on disk - * @param keyPass Keystore password - * @param keyManagerType The default is X509 - * @param keyStoreType The default is JKS - */ - public void setKeyStore(String keyStore, String keyPass, String keyManagerType, String keyStoreType) { - this.keyStore = keyStore; - this.keyPass = keyPass; - if (keyManagerType != null) { - this.keyManagerType = keyManagerType; - } - if (keyStoreType != null) { - this.keyStoreType = keyStoreType; - } - isKeyStoreSet = true; - } - - /** - * Set the keystore and password - * - * @param keyStore Location of the Keystore on disk - * @param keyPass Keystore password - */ - public void setKeyStore(String keyStore, String keyPass) { - setKeyStore(keyStore, keyPass, null, null); - } - - /** - * Set the truststore, password, certificate type and the store type - * - * @param trustStore Location of the Truststore on disk - * @param trustPass Truststore password - * @param trustManagerType The default is X509 - * @param trustStoreType The default is JKS - */ - public void setTrustStore(String trustStore, String trustPass, String trustManagerType, String trustStoreType) { - this.trustStore = trustStore; - this.trustPass = trustPass; - if (trustManagerType != null) { - this.trustManagerType = trustManagerType; - } - if (trustStoreType != null) { - this.trustStoreType = trustStoreType; - } - isTrustStoreSet = true; - } - - /** - * Set the truststore and password - * - * @param trustStore Location of the Truststore on disk - * @param trustPass Truststore password - */ - public void setTrustStore(String trustStore, String trustPass) { - setTrustStore(trustStore, trustPass, null, null); - } - - /** - * Set if client authentication is required - * - * @param clientAuth - */ - public void requireClientAuth(boolean clientAuth) { - this.clientAuth = clientAuth; - } - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TSeekableFile.java b/app/src/main/java/org/apache/thrift/transport/TSeekableFile.java deleted file mode 100644 index e02d36f..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TSeekableFile.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import java.io.InputStream; -import java.io.OutputStream; -import java.io.IOException; - -public interface TSeekableFile { - - public InputStream getInputStream() throws IOException; - public OutputStream getOutputStream() throws IOException; - public void close() throws IOException; - public long length() throws IOException; - public void seek(long pos) throws IOException; -} diff --git a/app/src/main/java/org/apache/thrift/transport/TServerSocket.java b/app/src/main/java/org/apache/thrift/transport/TServerSocket.java deleted file mode 100644 index 147074a..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TServerSocket.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.ServerSocket; -import java.net.Socket; -import java.net.SocketException; - -/** - * Wrapper around ServerSocket for Thrift. - * - */ -public class TServerSocket extends TServerTransport { - - private static final Logger LOGGER = LoggerFactory.getLogger(TServerSocket.class.getName()); - - /** - * Underlying ServerSocket object - */ - private ServerSocket serverSocket_ = null; - - /** - * Timeout for client sockets from accept - */ - private int clientTimeout_ = 0; - - /** - * Creates a server socket from underlying socket object - */ - public TServerSocket(ServerSocket serverSocket) { - this(serverSocket, 0); - } - - /** - * Creates a server socket from underlying socket object - */ - public TServerSocket(ServerSocket serverSocket, int clientTimeout) { - serverSocket_ = serverSocket; - clientTimeout_ = clientTimeout; - } - - /** - * Creates just a port listening server socket - */ - public TServerSocket(int port) throws TTransportException { - this(port, 0); - } - - /** - * Creates just a port listening server socket - */ - public TServerSocket(int port, int clientTimeout) throws TTransportException { - this(new InetSocketAddress(port), clientTimeout); - } - - public TServerSocket(InetSocketAddress bindAddr) throws TTransportException { - this(bindAddr, 0); - } - - public TServerSocket(InetSocketAddress bindAddr, int clientTimeout) throws TTransportException { - clientTimeout_ = clientTimeout; - try { - // Make server socket - serverSocket_ = new ServerSocket(); - // Prevent 2MSL delay problem on server restarts - serverSocket_.setReuseAddress(true); - // Bind to listening port - serverSocket_.bind(bindAddr); - } catch (IOException ioe) { - serverSocket_ = null; - throw new TTransportException("Could not create ServerSocket on address " + bindAddr.toString() + "."); - } - } - - public void listen() throws TTransportException { - // Make sure not to block on accept - if (serverSocket_ != null) { - try { - serverSocket_.setSoTimeout(0); - } catch (SocketException sx) { - LOGGER.error("Could not set socket timeout.", sx); - } - } - } - - protected TSocket acceptImpl() throws TTransportException { - if (serverSocket_ == null) { - throw new TTransportException(TTransportException.NOT_OPEN, "No underlying server socket."); - } - try { - Socket result = serverSocket_.accept(); - TSocket result2 = new TSocket(result); - result2.setTimeout(clientTimeout_); - return result2; - } catch (IOException iox) { - throw new TTransportException(iox); - } - } - - public void close() { - if (serverSocket_ != null) { - try { - serverSocket_.close(); - } catch (IOException iox) { - LOGGER.warn("Could not close server socket.", iox); - } - serverSocket_ = null; - } - } - - public void interrupt() { - // The thread-safeness of this is dubious, but Java documentation suggests - // that it is safe to do this from a different thread context - close(); - } - - public ServerSocket getServerSocket() { - return serverSocket_; - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TServerTransport.java b/app/src/main/java/org/apache/thrift/transport/TServerTransport.java deleted file mode 100644 index 17ff86b..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TServerTransport.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -/** - * Server transport. Object which provides client transports. - * - */ -public abstract class TServerTransport { - - public abstract void listen() throws TTransportException; - - public final TTransport accept() throws TTransportException { - TTransport transport = acceptImpl(); - if (transport == null) { - throw new TTransportException("accept() may not return NULL"); - } - return transport; - } - - public abstract void close(); - - protected abstract TTransport acceptImpl() throws TTransportException; - - /** - * Optional method implementation. This signals to the server transport - * that it should break out of any accept() or listen() that it is currently - * blocked on. This method, if implemented, MUST be thread safe, as it may - * be called from a different thread context than the other TServerTransport - * methods. - */ - public void interrupt() {} - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TSocket.java b/app/src/main/java/org/apache/thrift/transport/TSocket.java deleted file mode 100644 index 606e8a9..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TSocket.java +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketException; - -/** - * Socket implementation of the TTransport interface. To be commented soon! - * - */ -public class TSocket extends TIOStreamTransport { - - private static final Logger LOGGER = LoggerFactory.getLogger(TSocket.class.getName()); - - /** - * Wrapped Socket object - */ - private Socket socket_ = null; - - /** - * Remote host - */ - private String host_ = null; - - /** - * Remote port - */ - private int port_ = 0; - - /** - * Socket timeout - */ - private int timeout_ = 0; - - /** - * Constructor that takes an already created socket. - * - * @param socket Already created socket object - * @throws TTransportException if there is an error setting up the streams - */ - public TSocket(Socket socket) throws TTransportException { - socket_ = socket; - try { - socket_.setSoLinger(false, 0); - socket_.setTcpNoDelay(true); - } catch (SocketException sx) { - LOGGER.warn("Could not configure socket.", sx); - } - - if (isOpen()) { - try { - inputStream_ = new BufferedInputStream(socket_.getInputStream(), 1024); - outputStream_ = new BufferedOutputStream(socket_.getOutputStream(), 1024); - } catch (IOException iox) { - close(); - throw new TTransportException(TTransportException.NOT_OPEN, iox); - } - } - } - - /** - * Creates a new unconnected socket that will connect to the given host - * on the given port. - * - * @param host Remote host - * @param port Remote port - */ - public TSocket(String host, int port) { - this(host, port, 0); - } - - /** - * Creates a new unconnected socket that will connect to the given host - * on the given port. - * - * @param host Remote host - * @param port Remote port - * @param timeout Socket timeout - */ - public TSocket(String host, int port, int timeout) { - host_ = host; - port_ = port; - timeout_ = timeout; - initSocket(); - } - - /** - * Initializes the socket object - */ - private void initSocket() { - socket_ = new Socket(); - try { - socket_.setSoLinger(false, 0); - socket_.setTcpNoDelay(true); - socket_.setSoTimeout(timeout_); - } catch (SocketException sx) { - LOGGER.error("Could not configure socket.", sx); - } - } - - /** - * Sets the socket timeout - * - * @param timeout Milliseconds timeout - */ - public void setTimeout(int timeout) { - timeout_ = timeout; - try { - socket_.setSoTimeout(timeout); - } catch (SocketException sx) { - LOGGER.warn("Could not set socket timeout.", sx); - } - } - - /** - * Returns a reference to the underlying socket. - */ - public Socket getSocket() { - if (socket_ == null) { - initSocket(); - } - return socket_; - } - - /** - * Checks whether the socket is connected. - */ - public boolean isOpen() { - if (socket_ == null) { - return false; - } - return socket_.isConnected(); - } - - /** - * Connects the socket, creating a new socket object if necessary. - */ - public void open() throws TTransportException { - if (isOpen()) { - throw new TTransportException(TTransportException.ALREADY_OPEN, "Socket already connected."); - } - - if (host_.length() == 0) { - throw new TTransportException(TTransportException.NOT_OPEN, "Cannot open null host."); - } - if (port_ <= 0) { - throw new TTransportException(TTransportException.NOT_OPEN, "Cannot open without port."); - } - - if (socket_ == null) { - initSocket(); - } - - try { - socket_.connect(new InetSocketAddress(host_, port_), timeout_); - inputStream_ = new BufferedInputStream(socket_.getInputStream(), 1024); - outputStream_ = new BufferedOutputStream(socket_.getOutputStream(), 1024); - } catch (IOException iox) { - close(); - throw new TTransportException(TTransportException.NOT_OPEN, iox); - } - } - - /** - * Closes the socket. - */ - public void close() { - // Close the underlying streams - super.close(); - - // Close the socket - if (socket_ != null) { - try { - socket_.close(); - } catch (IOException iox) { - LOGGER.warn("Could not close socket.", iox); - } - socket_ = null; - } - } - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TStandardFile.java b/app/src/main/java/org/apache/thrift/transport/TStandardFile.java deleted file mode 100644 index 7a33af8..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TStandardFile.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import java.io.InputStream; -import java.io.OutputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.io.FileInputStream; -import java.io.FileOutputStream; - -public class TStandardFile implements TSeekableFile { - - protected String path_ = null; - protected RandomAccessFile inputFile_ = null; - - public TStandardFile(String path) throws IOException { - path_ = path; - inputFile_ = new RandomAccessFile(path_, "r"); - } - - public InputStream getInputStream() throws IOException { - return new FileInputStream(inputFile_.getFD()); - } - - public OutputStream getOutputStream() throws IOException { - return new FileOutputStream(path_); - } - - public void close() throws IOException { - if(inputFile_ != null) { - inputFile_.close(); - } - } - - public long length() throws IOException { - return inputFile_.length(); - } - - public void seek(long pos) throws IOException { - inputFile_.seek(pos); - } -} diff --git a/app/src/main/java/org/apache/thrift/transport/TTransport.java b/app/src/main/java/org/apache/thrift/transport/TTransport.java deleted file mode 100644 index 6eab3b0..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TTransport.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -/** - * Generic class that encapsulates the I/O layer. This is basically a thin - * wrapper around the combined functionality of Java input/output streams. - * - */ -public abstract class TTransport { - - /** - * Queries whether the transport is open. - * - * @return True if the transport is open. - */ - public abstract boolean isOpen(); - - /** - * Is there more data to be read? - * - * @return True if the remote side is still alive and feeding us - */ - public boolean peek() { - return isOpen(); - } - - /** - * Opens the transport for reading/writing. - * - * @throws TTransportException if the transport could not be opened - */ - public abstract void open() - throws TTransportException; - - /** - * Closes the transport. - */ - public abstract void close(); - - /** - * Reads up to len bytes into buffer buf, starting at offset off. - * - * @param buf Array to read into - * @param off Index to start reading at - * @param len Maximum number of bytes to read - * @return The number of bytes actually read - * @throws TTransportException if there was an error reading data - */ - public abstract int read(byte[] buf, int off, int len) - throws TTransportException; - - /** - * Guarantees that all of len bytes are actually read off the transport. - * - * @param buf Array to read into - * @param off Index to start reading at - * @param len Maximum number of bytes to read - * @return The number of bytes actually read, which must be equal to len - * @throws TTransportException if there was an error reading data - */ - public int readAll(byte[] buf, int off, int len) - throws TTransportException { - int got = 0; - int ret = 0; - while (got < len) { - ret = read(buf, off+got, len-got); - if (ret <= 0) { - throw new TTransportException( - "Cannot read. Remote side has closed. Tried to read " - + len - + " bytes, but only got " - + got - + " bytes. (This is often indicative of an internal error on the server side. Please check your server logs.)"); - } - got += ret; - } - return got; - } - - /** - * Writes the buffer to the output - * - * @param buf The output data buffer - * @throws TTransportException if an error occurs writing data - */ - public void write(byte[] buf) throws TTransportException { - write(buf, 0, buf.length); - } - - /** - * Writes up to len bytes from the buffer. - * - * @param buf The output data buffer - * @param off The offset to start writing from - * @param len The number of bytes to write - * @throws TTransportException if there was an error writing data - */ - public abstract void write(byte[] buf, int off, int len) - throws TTransportException; - - /** - * Flush any pending data out of a transport buffer. - * - * @throws TTransportException if there was an error writing out data. - */ - public void flush() - throws TTransportException {} - - /** - * Access the protocol's underlying buffer directly. If this is not a - * buffered transport, return null. - * @return protocol's Underlying buffer - */ - public byte[] getBuffer() { - return null; - } - - /** - * Return the index within the underlying buffer that specifies the next spot - * that should be read from. - * @return index within the underlying buffer that specifies the next spot - * that should be read from - */ - public int getBufferPosition() { - return 0; - } - - /** - * Get the number of bytes remaining in the underlying buffer. Returns -1 if - * this is a non-buffered transport. - * @return the number of bytes remaining in the underlying buffer.
Returns -1 if - * this is a non-buffered transport. - */ - public int getBytesRemainingInBuffer() { - return -1; - } - - /** - * Consume len bytes from the underlying buffer. - * @param len - */ - public void consumeBuffer(int len) {} -} diff --git a/app/src/main/java/org/apache/thrift/transport/TTransportException.java b/app/src/main/java/org/apache/thrift/transport/TTransportException.java deleted file mode 100644 index d08f3b0..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TTransportException.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -import org.apache.thrift.TException; - -/** - * Transport exceptions. - * - */ -public class TTransportException extends TException { - - private static final long serialVersionUID = 1L; - - public static final int UNKNOWN = 0; - public static final int NOT_OPEN = 1; - public static final int ALREADY_OPEN = 2; - public static final int TIMED_OUT = 3; - public static final int END_OF_FILE = 4; - - protected int type_ = UNKNOWN; - - public TTransportException() { - super(); - } - - public TTransportException(int type) { - super(); - type_ = type; - } - - public TTransportException(int type, String message) { - super(message); - type_ = type; - } - - public TTransportException(String message) { - super(message); - } - - public TTransportException(int type, Throwable cause) { - super(cause); - type_ = type; - } - - public TTransportException(Throwable cause) { - super(cause); - } - - public TTransportException(String message, Throwable cause) { - super(message, cause); - } - - public TTransportException(int type, String message, Throwable cause) { - super(message, cause); - type_ = type; - } - - public int getType() { - return type_; - } - -} diff --git a/app/src/main/java/org/apache/thrift/transport/TTransportFactory.java b/app/src/main/java/org/apache/thrift/transport/TTransportFactory.java deleted file mode 100644 index 3e71630..0000000 --- a/app/src/main/java/org/apache/thrift/transport/TTransportFactory.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.thrift.transport; - -/** - * Factory class used to create wrapped instance of Transports. - * This is used primarily in servers, which get Transports from - * a ServerTransport and then may want to mutate them (i.e. create - * a BufferedTransport from the underlying base transport) - * - */ -public class TTransportFactory { - - /** - * Return a wrapped instance of the base Transport. - * - * @param trans The base transport - * @return Wrapped Transport - */ - public TTransport getTransport(TTransport trans) { - return trans; - } - -} diff --git a/app/src/main/java/org/pyload/android/client/AddLinksActivity.java b/app/src/main/java/org/pyload/android/client/AddLinksActivity.java index d1ab4e7..441ddf3 100644 --- a/app/src/main/java/org/pyload/android/client/AddLinksActivity.java +++ b/app/src/main/java/org/pyload/android/client/AddLinksActivity.java @@ -17,7 +17,7 @@ import android.widget.Spinner; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; -import org.pyload.android.client.module.FileChooser; +import org.pyload.android.client.module.Utils; import java.util.regex.Matcher; @@ -26,6 +26,8 @@ public class AddLinksActivity extends Activity { public static final int NEW_PACKAGE = 0; private static final int PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 1; + private static final int REQUEST_FILE_PICK = 1001; + private String filename = "uploaded_from_android.dlc"; @Override @@ -129,8 +131,11 @@ public void pickFile(View button){ } private void browseForFile() { - Intent intent = new Intent().setClass(this, FileChooser.class); - startActivityForResult(intent, FileChooser.CHOOSE_FILE); + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); // All file types + + startActivityForResult(intent, REQUEST_FILE_PICK); } @RequiresApi(api = Build.VERSION_CODES.M) @@ -202,25 +207,16 @@ private void startAppSettings() { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case FileChooser.CHOOSE_FILE: - switch (resultCode) { - case RESULT_OK: - - String path = data.getStringExtra("filepath"); - filename = data.getStringExtra("filename"); - EditText view = (EditText) findViewById(R.id.filename); - view.setText(path); - - break; - - default: - break; - } - break; - default: - super.onActivityResult(requestCode, resultCode, data); - } + if (requestCode == REQUEST_FILE_PICK) { + if (resultCode == RESULT_OK) { + Uri uri = data.getData(); + filename = Utils.getFileName(this, uri); + EditText view = (EditText) findViewById(R.id.filename); + view.setText(uri.toString()); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } } } diff --git a/app/src/main/java/org/pyload/android/client/dialogs/AccountDialog.java b/app/src/main/java/org/pyload/android/client/dialogs/AccountDialog.java index a0ab0ae..f10f08a 100644 --- a/app/src/main/java/org/pyload/android/client/dialogs/AccountDialog.java +++ b/app/src/main/java/org/pyload/android/client/dialogs/AccountDialog.java @@ -15,8 +15,8 @@ import org.pyload.android.client.module.GuiTask; import org.pyload.android.client.module.Utils; import org.pyload.android.client.pyLoadApp; -import org.pyload.thrift.AccountInfo; -import org.pyload.thrift.Pyload; +import org.pyload.android.openapi.api.PyLoadRestApi; +import org.pyload.android.openapi.models.AccountInfo; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -32,8 +32,9 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { final pyLoadApp app = (pyLoadApp) getActivity().getApplication(); GuiTask task = new GuiTask(new Runnable() { public void run() { - Pyload.Client client = app.getClient(); - adapter.setData(client.getAccounts(false)); + PyLoadRestApi client = app.getClient(); + List accountData = app.executeNetworkCall(client.apiGetAccountsPost(false)); + adapter.setData(accountData); } }); app.addTask(task); @@ -112,24 +113,24 @@ public View getView(int pos, View view, ViewGroup group) { holder = (ViewHolder) view.getTag(); - holder.type.setText(acc.type); - holder.name.setText(acc.login); + holder.type.setText(acc.getType()); + holder.name.setText(acc.getLogin()); - if (acc.valid) + if (acc.getValid()) holder.valid.setText(R.string.valid); else holder.valid.setText(R.string.invalid); - if (acc.trafficleft < 0) + if (acc.getTrafficleft() < 0) holder.trafficleft.setText(R.string.unlimited); else - holder.trafficleft.setText(Utils.formatSize(acc.trafficleft)); + holder.trafficleft.setText(Utils.formatSize(acc.getTrafficleft())); - if (acc.validuntil < 0) + if (acc.getValiduntil() < 0) holder.validuntil.setText(R.string.unlimited); else { Date date = new Date(); - date.setTime(acc.validuntil * 1000); + date.setTime(acc.getValiduntil().longValue() * 1000); SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy"); holder.validuntil.setText(formatter.format(date)); } diff --git a/app/src/main/java/org/pyload/android/client/dialogs/CaptchaDialog.java b/app/src/main/java/org/pyload/android/client/dialogs/CaptchaDialog.java index 4ce2f73..eff9f57 100644 --- a/app/src/main/java/org/pyload/android/client/dialogs/CaptchaDialog.java +++ b/app/src/main/java/org/pyload/android/client/dialogs/CaptchaDialog.java @@ -1,9 +1,10 @@ package org.pyload.android.client.dialogs; -import org.apache.commons.codec.binary.Base64; +import android.util.Base64; import org.pyload.android.client.R; +import org.pyload.android.client.module.Utils; import org.pyload.android.client.pyLoad; -import org.pyload.thrift.CaptchaTask; +import org.pyload.android.openapi.models.CaptchaTask; import android.app.Dialog; import android.content.DialogInterface; @@ -29,7 +30,7 @@ public class CaptchaDialog extends DialogFragment { public static CaptchaDialog newInstance(CaptchaTask task) { CaptchaDialog dialog = new CaptchaDialog(); Bundle args = new Bundle(); - args.putSerializable("task", task); + args.putString("task", Utils.encodeObject(task)); dialog.setArguments(args); return dialog; } @@ -37,7 +38,7 @@ public static CaptchaDialog newInstance(CaptchaTask task) { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - task = (CaptchaTask) getArguments().getSerializable("task"); + task = Utils.decodeObject(getArguments().getString("task"), CaptchaTask.class); } @Override @@ -49,7 +50,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, ImageView image = (ImageView) dialog.findViewById(R.id.image); - byte[] decoded = Base64.decodeBase64(task.getData()); + byte[] decoded = Base64.decode(Utils.encodeObject(task.getData()), Base64.DEFAULT); Bitmap bm = BitmapFactory.decodeByteArray(decoded, 0, decoded.length); image.setImageBitmap(bm); @@ -84,7 +85,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) { } public void onClick(){ - ((pyLoad) getActivity()).setCaptchaResult(task.tid, text.getText().toString()); + ((pyLoad) getActivity()).setCaptchaResult(task.getTid(), text.getText().toString()); } public void setOnDismissListener(OnDismissListener listener) { diff --git a/app/src/main/java/org/pyload/android/client/dialogs/FileInfoDialog.java b/app/src/main/java/org/pyload/android/client/dialogs/FileInfoDialog.java index 7a07508..e07457e 100644 --- a/app/src/main/java/org/pyload/android/client/dialogs/FileInfoDialog.java +++ b/app/src/main/java/org/pyload/android/client/dialogs/FileInfoDialog.java @@ -1,8 +1,9 @@ package org.pyload.android.client.dialogs; import org.pyload.android.client.R; -import org.pyload.thrift.FileData; -import org.pyload.thrift.PackageData; +import org.pyload.android.client.module.Utils; +import org.pyload.android.openapi.models.FileData; +import org.pyload.android.openapi.models.PackageData; import android.app.Dialog; import android.os.Bundle; @@ -24,8 +25,8 @@ public static FileInfoDialog newInstance(PackageData pack, FileData file){ FileInfoDialog dialog = new FileInfoDialog(); Bundle args = new Bundle(); - args.putSerializable("pack", pack); - args.putSerializable("file", file); + args.putString("pack", Utils.encodeObject(pack)); + args.putString("file", Utils.encodeObject(file)); dialog.setArguments(args); return dialog; @@ -34,8 +35,8 @@ public static FileInfoDialog newInstance(PackageData pack, FileData file){ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - pack = (PackageData) getArguments().getSerializable("pack"); - file = (FileData) getArguments().getSerializable("file"); + pack = Utils.decodeObject(getArguments().getString("pack"), PackageData.class); + file = Utils.decodeObject(getArguments().getString("file"), FileData.class); } @Override @@ -44,25 +45,25 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, View dialog = inflater.inflate(R.layout.fileinfo_dialog, container, false); TextView view = (TextView) dialog.findViewById(R.id.name); - view.setText(file.name); + view.setText(file.getName()); view = (TextView) dialog.findViewById(R.id.status); - view.setText(file.statusmsg); + view.setText(file.getStatusmsg()); view = (TextView) dialog.findViewById(R.id.plugin); - view.setText(file.plugin); + view.setText(file.getPlugin()); view = (TextView) dialog.findViewById(R.id.size); - view.setText(file.format_size); + view.setText(file.getFormatSize()); view = (TextView) dialog.findViewById(R.id.error); - view.setText(file.error); + view.setText(file.getError()); view = (TextView) dialog.findViewById(R.id.packageValue); - view.setText(pack.name); + view.setText(pack.getName()); view = (TextView) dialog.findViewById(R.id.folder); - view.setText(pack.folder); + view.setText(pack.getFolder()); Button button = (Button) dialog.findViewById(R.id.close); button.setOnClickListener(new OnClickListener() { diff --git a/app/src/main/java/org/pyload/android/client/fragments/AbstractPackageFragment.java b/app/src/main/java/org/pyload/android/client/fragments/AbstractPackageFragment.java index 47baae2..f1c22d9 100644 --- a/app/src/main/java/org/pyload/android/client/fragments/AbstractPackageFragment.java +++ b/app/src/main/java/org/pyload/android/client/fragments/AbstractPackageFragment.java @@ -12,11 +12,13 @@ import org.pyload.android.client.components.TabHandler; import org.pyload.android.client.dialogs.FileInfoDialog; import org.pyload.android.client.module.GuiTask; -import org.pyload.thrift.Destination; -import org.pyload.thrift.DownloadStatus; -import org.pyload.thrift.FileData; -import org.pyload.thrift.PackageData; -import org.pyload.thrift.Pyload.Client; +import org.pyload.android.openapi.api.PyLoadRestApi; +import org.pyload.android.openapi.models.ApiDeleteFilesPostRequest; +import org.pyload.android.openapi.models.ApiDeletePackagesPostRequest; +import org.pyload.android.openapi.models.Destination; +import org.pyload.android.openapi.models.FileData; +import org.pyload.android.openapi.models.PackageData; +import org.pyload.android.openapi.models.DownloadStatus; import android.app.Activity; import android.content.Context; @@ -59,16 +61,16 @@ else if (a == null) else if (b == null) return -1; else if (a instanceof PackageData && b instanceof PackageData) - return ((Short) ((PackageData) a).order).compareTo(((PackageData) b).order); + return ((PackageData) a).getOrder().compareTo(((PackageData) b).getOrder()); else if (a instanceof FileData && b instanceof FileData) - return ((Short) ((FileData) a).order).compareTo(((FileData) b).order); + return ((FileData) a).getOrder().compareTo(((FileData) b).getOrder()); return 0; } }; protected int dest; private List data; private pyLoadApp app; - private Client client; + private PyLoadRestApi client; // tab position private int pos = -1; @@ -119,12 +121,11 @@ public boolean onContextItemSelected(MenuItem item) { int childPos = ExpandableListView .getPackedPositionChild(info.packedPosition); - final FileData file; - try { - file = data.get(groupPos).links.get(childPos); - } catch (IndexOutOfBoundsException e) { - return false; - } + List links = data.get(groupPos).getLinks(); + if (links == null || childPos < 0 || childPos >= links.size()) { + return false; + } + final FileData file = links.get(childPos); switch (item.getItemId()) { case R.id.restart: @@ -133,8 +134,8 @@ public boolean onContextItemSelected(MenuItem item) { public void run() { client = app.getClient(); - client.restartFile(file.fid); - } + app.executeNetworkCall(client.apiRestartFilePost(file.getFid())); + } }, app.handleSuccess)); break; @@ -145,10 +146,11 @@ public void run() { public void run() { client = app.getClient(); ArrayList fids = new ArrayList(); - fids.add(file.fid); + fids.add(file.getFid()); - client.deleteFiles(fids); - } + ApiDeleteFilesPostRequest request = new ApiDeleteFilesPostRequest().fileIds(fids); + app.executeNetworkCall(client.apiDeleteFilesPost(request)); + } }, app.handleSuccess)); break; @@ -181,7 +183,7 @@ public void run() { public void run() { client = app.getClient(); - client.restartPackage(pack.pid); + app.executeNetworkCall(client.apiRestartPackagePost(pack.getPid())); } }, app.handleSuccess)); @@ -193,9 +195,10 @@ public void run() { public void run() { client = app.getClient(); ArrayList pids = new ArrayList(); - pids.add(pack.pid); - client.deletePackages(pids); - } + pids.add(pack.getPid()); + ApiDeletePackagesPostRequest request = new ApiDeletePackagesPostRequest().packageIds(pids); + app.executeNetworkCall(client.apiDeletePackagesPost(request)); + } }, app.handleSuccess)); break; @@ -208,13 +211,13 @@ public void run() { client = app.getClient(); Destination newDest; if (dest == 0) { - newDest = Destination.Collector; + newDest = Destination.COLLECTOR; } else { - newDest = Destination.Queue; + newDest = Destination.QUEUE; } - client.movePackage(newDest, pack.pid); - } + app.executeNetworkCall(client.apiMovePackagePost(newDest, pack.getPid())); + } }, app.handleSuccess)); break; @@ -250,7 +253,7 @@ public boolean onChildClick(ExpandableListView parent, View v, int group, FileData file; try { pack = data.get(group); - file = pack.links.get(child); + file = pack.getLinks().get(child); } catch (Exception e) { return true; } @@ -295,9 +298,9 @@ public void refresh() { public void run() { client = app.getClient(); if (dest == 0) - data = client.getQueueData(); + data = app.executeNetworkCall(client.apiGetQueueDataGet()); else - data = client.getCollectorData(); + data = app.executeNetworkCall(client.apiGetCollectorDataGet()); } }, mUpdateResults); @@ -308,7 +311,7 @@ protected void onDataReceived() { app.setProgress(false); Collections.sort(data, mOrderComparator); for (PackageData pak : data) - Collections.sort(pak.links, mOrderComparator); + Collections.sort(pak.getLinks(), mOrderComparator); PackageListAdapter adapter = (PackageListAdapter) getExpandableListAdapter(); adapter.setData(data); @@ -348,7 +351,7 @@ public int getGroupCount() { } public int getChildrenCount(int group) { - return data.get(group).links.size(); + return data.get(group).getLinks().size(); } public Object getGroup(int group) { @@ -356,7 +359,7 @@ public Object getGroup(int group) { } public Object getChild(int group, int child) { - return data.get(group).links.get(child); + return data.get(group).getLinks().get(child); } public long getGroupId(int group) { @@ -387,15 +390,15 @@ public View getGroupView(int group, boolean isExpanded, View convertView, } GroupViewHolder holder = (GroupViewHolder) convertView.getTag(); - holder.name.setText(pack.name); + holder.name.setText(pack.getName()); - if (pack.linkstotal == 0) - pack.linkstotal = 1; + if (pack.getLinkstotal() == null || pack.getLinkstotal() == 0) + pack.setLinkstotal(1); - holder.progress.setProgress((pack.linksdone * 100) / pack.links .size()); - holder.size.setText(Utils.formatSize(pack.sizedone) + " / " - + Utils.formatSize(pack.sizetotal)); - holder.links.setText(pack.linksdone + " / " + pack.links.size()); + holder.progress.setProgress((pack.getLinksdone() * 100) / pack.getLinks().size()); + holder.size.setText(Utils.formatSize(pack.getSizedone()) + " / " + + Utils.formatSize(pack.getSizetotal())); + holder.links.setText(pack.getLinksdone() + " / " + pack.getLinks().size()); return convertView; } @@ -403,7 +406,7 @@ public View getGroupView(int group, boolean isExpanded, View convertView, public View getChildView(int group, int child, boolean isLastChild, View convertView, ViewGroup parent) { - FileData file = data.get(group).links.get(child); + FileData file = data.get(group).getLinks().get(child); if (file == null) return null; @@ -424,27 +427,27 @@ public View getChildView(int group, int child, boolean isLastChild, // seems to occure according to bug report // no idea why, and what about other data, so returning the view instantly - if (file.name == null) { + if (file.getName() == null) { holder.name.setText(R.string.lambda); return convertView; } - if (!file.name.equals(holder.name.getText())) - holder.name.setText(file.name); + if (!file.getName().equals(holder.name.getText())) + holder.name.setText(file.getName()); - holder.status.setText(file.statusmsg); - holder.size.setText(Utils.formatSize(file.size)); - holder.plugin.setText(file.plugin); + holder.status.setText(file.getStatusmsg()); + holder.size.setText(Utils.formatSize(file.getSize())); + holder.plugin.setText(file.getPlugin()); - if (file.status == DownloadStatus.Failed - || file.status == DownloadStatus.Aborted - || file.status == DownloadStatus.Offline) { + if (file.getStatus() == DownloadStatus.FAILED + || file.getStatus() == DownloadStatus.ABORTED + || file.getStatus() == DownloadStatus.OFFLINE) { holder.status_icon.setImageResource(R.drawable.stop); - } else if (file.status == DownloadStatus.Finished) { + } else if (file.getStatus() == DownloadStatus.FINISHED) { holder.status_icon.setImageResource(R.drawable.tick); - } else if (file.status == DownloadStatus.Waiting) { + } else if (file.getStatus() == DownloadStatus.WAITING) { holder.status_icon.setImageResource(R.drawable.menu_clock); - } else if (file.status == DownloadStatus.Skipped) { + } else if (file.getStatus() == DownloadStatus.SKIPPED) { holder.status_icon.setImageResource(R.drawable.tag); } else { holder.status_icon.setImageResource(0); diff --git a/app/src/main/java/org/pyload/android/client/fragments/ConfigSectionFragment.java b/app/src/main/java/org/pyload/android/client/fragments/ConfigSectionFragment.java index 9145ca4..b039a50 100644 --- a/app/src/main/java/org/pyload/android/client/fragments/ConfigSectionFragment.java +++ b/app/src/main/java/org/pyload/android/client/fragments/ConfigSectionFragment.java @@ -4,11 +4,13 @@ import java.util.HashMap; import org.pyload.android.client.R; +import org.pyload.android.client.module.Utils; import org.pyload.android.client.pyLoadApp; import org.pyload.android.client.module.GuiTask; -import org.pyload.thrift.ConfigItem; -import org.pyload.thrift.ConfigSection; -import org.pyload.thrift.Pyload.Client; +import org.pyload.android.openapi.api.PyLoadRestApi; +import org.pyload.android.openapi.models.ApiSetConfigValuePostRequest; +import org.pyload.android.openapi.models.ConfigItem; +import org.pyload.android.openapi.models.ConfigSection; import android.content.Context; import android.graphics.Color; @@ -51,7 +53,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, View view = inflater.inflate(R.layout.config_section, null, false); createLayout(view); TextView t = (TextView) view.findViewById(R.id.list_header_title); - t.setText(section.description); + t.setText(section.getDescription()); view.findViewById(R.id.button_submit) .setOnClickListener(new OnClickListener() { @@ -80,7 +82,7 @@ public void onCreate(Bundle savedInstanceState) { Bundle extras = getArguments(); - section = (ConfigSection) extras.getSerializable("section"); + section = Utils.decodeObject(extras.getString("section"), ConfigSection.class); type = extras.getString("type"); } @@ -88,9 +90,9 @@ private View createLayout(View view) { LinearLayout ll = (LinearLayout) view.findViewById(R.id.layout_root); ll.setOrientation(LinearLayout.VERTICAL); - for (ConfigItem item : section.items) { + for (ConfigItem item : section.getItems()) { ConfigItemView c = new ConfigItemView(this.getActivity(), item); - items.put(item.name, c); + items.put(item.getName(), c); ll.addView(c); } @@ -107,19 +109,24 @@ public void onSubmit() { @Override public void run() { - Client client = app.getClient(); + PyLoadRestApi client = app.getClient(); - for (ConfigItem item : section.items) { - ConfigItemView view = items.get(item.name); + for (ConfigItem item : section.getItems()) { + ConfigItemView view = items.get(item.getName()); String newValue = view.getValue(); - if (!item.value.equals(newValue)) { + if (!item.getValue().equals(newValue)) { Log.d("pyLoad", String.format( "Set config value: %s, %s, %s", type, - section.name, item.name)); + section.getName(), item.getName())); - client.setConfigValue(section.name, item.name, - newValue, type); - } + ApiSetConfigValuePostRequest request = new ApiSetConfigValuePostRequest() + .category(section.getName()) + .option(item.getName()) + .value(newValue) + .section(type); + + app.executeNetworkCall(client.apiSetConfigValuePost(request)); + } } getFragmentManager().popBackStack(); @@ -147,41 +154,41 @@ public ConfigItemView(Context context, ConfigItem item) { setOrientation(LinearLayout.VERTICAL); - if (!item.type.equals("bool")) { + if (!item.getType().equals("bool")) { TextView tv = new TextView(context); - tv.setText(item.description); + tv.setText(item.getDescription()); tv.setTextColor(Color.WHITE); tv.setTextSize(16); tv.setPadding(2, 0, 0, 0); addView(tv); } - if (item.type.equals("int")) { + if (item.getType().equals("int")) { EditText et = new EditText(context); et.setInputType(InputType.TYPE_CLASS_NUMBER); - et.setText(item.value); + et.setText(item.getValue()); v = et; - } else if (item.type.equals("password")) { + } else if (item.getType().equals("password")) { EditText et = new EditText(context); et.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); et.setTransformationMethod(PasswordTransformationMethod .getInstance()); - et.setText(item.value); + et.setText(item.getValue()); v = et; - } else if (item.type.equals("bool")) { + } else if (item.getType().equals("bool")) { CheckBox cb = new CheckBox(context); - cb.setText(item.description); + cb.setText(item.getDescription()); - if (item.value.equals("True")) { + if (item.getValue().equals("True")) { cb.setChecked(true); } v = cb; - } else if (item.type.contains(";")) { + } else if (item.getType().contains(";")) { sp = new Spinner(context); choices = new ArrayList(); - for (String s : item.type.split(";")) { + for (String s : item.getType().split(";")) { choices.add(s); } @@ -190,12 +197,12 @@ public ConfigItemView(Context context, ConfigItem item) { adp.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); sp.setAdapter(adp); - sp.setSelection(choices.indexOf(item.value)); + sp.setSelection(choices.indexOf(item.getValue())); v = sp; } else { v = new EditText(context); - ((EditText) v).setText(item.value); + ((EditText) v).setText(item.getValue()); } addView(v); @@ -208,7 +215,7 @@ public ConfigItemView(Context context, ConfigItem item) { * @return */ public String getValue() { - if (item.type.equals("bool")) { + if (item.getType().equals("bool")) { CheckBox cb = (CheckBox) v; if (cb.isChecked()) return "True"; diff --git a/app/src/main/java/org/pyload/android/client/fragments/OverviewFragment.java b/app/src/main/java/org/pyload/android/client/fragments/OverviewFragment.java index 9fdd6bb..5e1e119 100644 --- a/app/src/main/java/org/pyload/android/client/fragments/OverviewFragment.java +++ b/app/src/main/java/org/pyload/android/client/fragments/OverviewFragment.java @@ -10,11 +10,12 @@ import org.pyload.android.client.components.TabHandler; import org.pyload.android.client.dialogs.CaptchaDialog; import org.pyload.android.client.module.GuiTask; -import org.pyload.thrift.CaptchaTask; -import org.pyload.thrift.DownloadInfo; -import org.pyload.thrift.DownloadStatus; -import org.pyload.thrift.Pyload.Client; -import org.pyload.thrift.ServerStatus; +import org.pyload.android.openapi.api.PyLoadRestApi; +import org.pyload.android.openapi.models.ApiStopDownloadsPostRequest; +import org.pyload.android.openapi.models.CaptchaTask; +import org.pyload.android.openapi.models.DownloadInfo; +import org.pyload.android.openapi.models.DownloadStatus; +import org.pyload.android.openapi.models.ServerStatus; import android.app.NotificationManager; import android.app.PendingIntent; @@ -44,10 +45,8 @@ public class OverviewFragment extends ListFragment implements OnDismissListener, TabHandler { - public final static int CAPTCHA_DIALOG = 0; - private pyLoadApp app; - private Client client; + private PyLoadRestApi client; private OverviewAdapter adp; private List downloads; @@ -79,12 +78,12 @@ public void run() { public void run() { client = app.getClient(); - downloads = client.statusDownloads(); - status = client.statusServer(); - if (client.isCaptchaWaiting()) { + downloads = app.executeNetworkCall(client.apiStatusDownloadsGet()); + status = app.executeNetworkCall(client.apiStatusServerGet()); + if (app.executeNetworkCall(client.apiIsCaptchaWaitingGet())) { Log.d("pyLoad", "Captcha available"); - captcha = client.getCaptchaTask(false); - Log.d("pyload", captcha.resultType); + captcha = app.executeNetworkCall(client.apiGetCaptchaTaskPost(false)); + Log.d("pyload", captcha.getResultType()); showNotification(); } else @@ -134,9 +133,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, public void onClick(View v) { app.addTask(new GuiTask(new Runnable() { public void run() { - Client client = app.getClient(); - client.togglePause(); - } + PyLoadRestApi client = app.getClient(); + app.executeNetworkCall(client.apiTogglePauseGet()); + } }, app.handleSuccess)); } }); @@ -146,8 +145,8 @@ public void run() { public void onClick(View v) { app.addTask(new GuiTask(new Runnable() { public void run() { - Client client = app.getClient(); - client.toggleReconnect(); + PyLoadRestApi client = app.getClient(); + app.executeNetworkCall(client.apiToggleReconnectGet()); } }, app.handleSuccess)); } @@ -199,9 +198,10 @@ public boolean onContextItemSelected(MenuItem item) { public void run() { client = app.getClient(); ArrayList fids = new ArrayList(); - fids.add(info.fid); - client.stopDownloads(fids); - } + fids.add(info.getFid()); + ApiStopDownloadsPostRequest request = new ApiStopDownloadsPostRequest().fileIds(fids); + app.executeNetworkCall(client.apiStopDownloadsPost(request)); + } }, new Runnable() { public void run() { @@ -255,15 +255,15 @@ protected void onDataReceived() { adapter.setDownloads(downloads); - statusServer.setText(app.verboseBool(status.download)); - reconnect.setText(app.verboseBool(status.reconnect)); - speed.setText(Utils.formatSize(status.speed) + "/s"); - active.setText(String.format("%d / %d", status.active, status.total)); + statusServer.setText(app.verboseBool(status.getDownload())); + reconnect.setText(app.verboseBool(status.getReconnect())); + speed.setText(Utils.formatSize(status.getSpeed()) + "/s"); + active.setText(String.format("%d / %d", status.getActive(), status.getTotal())); if (captcha != null && app.prefs.getBoolean("pull_captcha", true) - && captcha.resultType != null // string null bug - && captcha.resultType.equals("textual") - && lastCaptcha != captcha.tid) { + && captcha.getResultType() != null // string null bug + && captcha.getResultType().equals("textual") + && lastCaptcha != captcha.getTid()) { showDialog(); } @@ -285,7 +285,7 @@ private void showDialog() { return; CaptchaDialog dialog = CaptchaDialog.newInstance(captcha); - lastCaptcha = captcha.tid; + lastCaptcha = captcha.getTid(); Log.d("pyLoad", "Got Captcha Task"); @@ -412,34 +412,34 @@ public View getView(int position, View convertView, ViewGroup parent) { // name is null sometimes somehow - if (info.name != null && !info.name.equals(holder.name.getText())) { - holder.name.setText(info.name); + if (info.getName() != null && !info.getName().equals(holder.name.getText())) { + holder.name.setText(info.getName()); } - holder.progress.setProgress(info.percent); + holder.progress.setProgress(info.getPercent()); - if (info.status == DownloadStatus.Downloading) { - holder.size.setText(Utils.formatSize(info.size)); - holder.percent.setText(info.percent + "%"); - holder.size_done.setText(Utils.formatSize(info.size - info.bleft)); + if (info.getStatus() == DownloadStatus.DOWNLOADING) { + holder.size.setText(Utils.formatSize(info.getSize())); + holder.percent.setText(info.getPercent() + "%"); + holder.size_done.setText(Utils.formatSize(info.getSize() - info.getBleft())); - holder.speed.setText(Utils.formatSize(info.speed) + "/s"); - holder.eta.setText(info.format_eta); + holder.speed.setText(Utils.formatSize(Math.round(info.getSpeed())) + "/s"); + holder.eta.setText(info.getFormatEta()); - } else if (info.status == DownloadStatus.Waiting) { + } else if (info.getStatus() == DownloadStatus.WAITING) { holder.size.setText(R.string.lambda); holder.percent.setText(R.string.lambda); holder.size_done.setText(R.string.lambda); - holder.speed.setText(info.statusmsg); - holder.eta.setText(info.format_wait); + holder.speed.setText(info.getStatusmsg()); + holder.eta.setText(info.getFormatWait()); } else { holder.size.setText(R.string.lambda); holder.percent.setText(R.string.lambda); holder.size_done.setText(R.string.lambda); - holder.speed.setText(info.statusmsg); + holder.speed.setText(info.getStatusmsg()); holder.eta.setText(R.string.lambda); } diff --git a/app/src/main/java/org/pyload/android/client/fragments/SettingsFragment.java b/app/src/main/java/org/pyload/android/client/fragments/SettingsFragment.java index 61cdc54..234b121 100644 --- a/app/src/main/java/org/pyload/android/client/fragments/SettingsFragment.java +++ b/app/src/main/java/org/pyload/android/client/fragments/SettingsFragment.java @@ -7,11 +7,12 @@ import java.util.Map.Entry; import org.pyload.android.client.R; +import org.pyload.android.client.module.Utils; import org.pyload.android.client.pyLoadApp; import org.pyload.android.client.module.GuiTask; import org.pyload.android.client.module.SeparatedListAdapter; -import org.pyload.thrift.ConfigSection; -import org.pyload.thrift.Pyload.Client; +import org.pyload.android.openapi.api.PyLoadRestApi; +import org.pyload.android.openapi.models.ConfigSection; import android.content.Context; import android.os.Bundle; @@ -93,10 +94,9 @@ private void update() { GuiTask task = new GuiTask(new Runnable() { public void run() { - Client client = app.getClient(); - generalData = client.getConfig(); - pluginData = client.getPluginConfig(); - + PyLoadRestApi client = app.getClient(); + generalData = app.executeNetworkCall(client.apiGetConfigGet()); + pluginData = app.executeNetworkCall(client.apiGetPluginConfigGet()); } }, mUpdateResults); @@ -118,7 +118,7 @@ public void onListItemClick(ListView l, View v, int position, long id) { args.putString("type", "plugin"); else args.putString("type", "core"); - args.putSerializable("section", item.getValue()); + args.putString("section", Utils.encodeObject(item.getValue())); Fragment f = new ConfigSectionFragment(mRefresh); f.setArguments(args); @@ -202,10 +202,10 @@ public View getView(int row, View convertView, ViewGroup viewGroup) { ConfigSection section = data.get(row).getValue(); holder = (ViewHolder) convertView.getTag(); - holder.name.setText(section.description); + holder.name.setText(section.getDescription()); - if (section.outline != null) { - holder.desc.setText(section.outline); + if (section.getOutline() != null) { + holder.desc.setText(section.getOutline()); holder.desc.setMaxHeight(100); } else { holder.desc.setMaxHeight(0); diff --git a/app/src/main/java/org/pyload/android/client/module/FileChooser.java b/app/src/main/java/org/pyload/android/client/module/FileChooser.java deleted file mode 100644 index f1dbda8..0000000 --- a/app/src/main/java/org/pyload/android/client/module/FileChooser.java +++ /dev/null @@ -1,160 +0,0 @@ -package org.pyload.android.client.module; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import android.os.Environment; -import org.pyload.android.client.R; - -import android.app.ListActivity; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.TextView; - -public class FileChooser extends ListActivity { - - public final static int CHOOSE_FILE = 0; - public final static String SD_CARD = Environment.getExternalStorageDirectory().getPath(); - - private File currentDir; - private FileArrayAdapter adapter; - - - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - currentDir = new File(SD_CARD); - fill(currentDir); - } - - private void fill(File f) { - File[] dirs = f.listFiles(); - this.setTitle(getString(R.string.current_dir) + f.getName()); - List