diff --git a/fluss-filesystems/fluss-fs-azure/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-azure/src/main/resources/META-INF/NOTICE index 90833076cd..2bd468013a 100644 --- a/fluss-filesystems/fluss-fs-azure/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-azure/src/main/resources/META-INF/NOTICE @@ -7,52 +7,43 @@ This project bundles the following dependencies under the Apache Software Licens - com.fasterxml.jackson.core:jackson-core:2.15.3 - com.fasterxml.jackson.core:jackson-databind:2.15.3 - com.fasterxml.woodstox:woodstox-core:5.4.0 -- com.google.guava:failureaccess:1.0 -- com.google.guava:guava:27.0-jre +- com.google.guava:failureaccess:1.0.1 +- com.google.guava:guava:32.0.1-jre - com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -- com.google.j2objc:j2objc-annotations:1.1 +- com.google.j2objc:j2objc-annotations:2.8 - com.microsoft.azure:azure-keyvault-core:1.0.0 - com.microsoft.azure:azure-storage:7.0.1 - commons-beanutils:commons-beanutils:1.9.4 - commons-codec:commons-codec:1.11 - commons-collections:commons-collections:3.2.2 -- commons-io:commons-io:2.14.0 +- commons-io:commons-io:2.16.1 - commons-logging:commons-logging:1.2 -- io.dropwizard.metrics:metrics-core:3.2.4 -- io.netty:netty-buffer:4.1.100.Final -- io.netty:netty-codec:4.1.100.Final -- io.netty:netty-common:4.1.100.Final -- io.netty:netty-handler:4.1.100.Final -- io.netty:netty-resolver:4.1.100.Final -- io.netty:netty-transport:4.1.100.Final -- io.netty:netty-transport-classes-epoll:4.1.100.Final -- io.netty:netty-transport-native-epoll:4.1.100.Final -- io.netty:netty-transport-native-unix-common:4.1.100.Final -- org.apache.commons:commons-compress:1.24.0 -- org.apache.commons:commons-configuration2:2.8.0 +- org.apache.commons:commons-collections4:4.4 +- org.apache.commons:commons-compress:1.26.1 +- org.apache.commons:commons-configuration2:2.10.1 - org.apache.commons:commons-lang3:3.18.0 -- org.apache.commons:commons-text:1.10.0 -- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.1.1 -- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_21:1.2.0 -- org.apache.hadoop:hadoop-annotations:3.4.0 -- org.apache.hadoop:hadoop-auth:3.4.0 -- org.apache.hadoop:hadoop-azure:3.3.4 -- org.apache.hadoop:hadoop-common:3.4.0 +- org.apache.commons:commons-text:1.14.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.5.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_25:1.5.0 +- org.apache.hadoop:hadoop-annotations:3.4.3 +- org.apache.hadoop:hadoop-auth:3.4.3 +- org.apache.hadoop:hadoop-azure:3.4.3 +- org.apache.hadoop:hadoop-common:3.4.3 - org.apache.kerby:kerb-core:2.0.3 +- org.apache.kerby:kerb-crypto:2.0.3 +- org.apache.kerby:kerb-util:2.0.3 - org.apache.kerby:kerby-asn1:2.0.3 +- org.apache.kerby:kerby-config:2.0.3 - org.apache.kerby:kerby-pkix:2.0.3 - org.apache.kerby:kerby-util:2.0.3 - org.apache.httpcomponents:httpclient:4.5.13 - org.apache.httpcomponents:httpcore:4.4.13 -- org.codehaus.jackson:jackson-core-asl:1.9.13 -- org.codehaus.jackson:jackson-mapper-asl:1.9.13 -- org.codehaus.jettison:jettison:1.5.4 -- org.wildfly.openssl:wildfly-openssl:1.0.7.Final +- org.wildfly.openssl:wildfly-openssl:2.2.5.Final - org.xerial.snappy:snappy-java:1.1.10.4 This project bundles the following dependencies under the BSD license. See bundled license files for details. -- dnsjava:dnsjava:3.4.0 +- dnsjava:dnsjava:3.6.1 - org.codehaus.woodstox:stax2-api:4.2.1 This project bundles the following dependencies under the Go License (https://golang.org/LICENSE). See bundled license files for details. @@ -70,6 +61,6 @@ This project bundles the following dependencies under the Eclipse Distribution L This project bundles the following dependencies under the MIT License (https://opensource.org/license/mit). See bundled license files for details. -- org.checkerframework:checker-qual:2.5.2 +- org.checkerframework:checker-qual:3.33.0 - org.codehaus.mojo:animal-sniffer-annotations:1.17 -- org.bouncycastle:bcprov-jdk15on:1.70 \ No newline at end of file +- org.bouncycastle:bcprov-jdk15on:1.70 diff --git a/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemBehaviorITCase.java b/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemBehaviorITCase.java index e2f1632882..1bf7edd431 100644 --- a/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemBehaviorITCase.java +++ b/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemBehaviorITCase.java @@ -34,6 +34,7 @@ class AbfsFileSystemBehaviorITCase extends FileSystemBehaviorTestSuite { private static final String CONFIG_PREFIX = "fs.azure.account"; + private static final String HNS_ENABLED = CONFIG_PREFIX + ".hns.enabled"; private static final String CLIENT_ID = "testClientId"; private static final String CLIENT_SECRET = "testClientSecret"; @@ -53,6 +54,7 @@ static void setup() { CONFIG_PREFIX + ".oauth2.client.endpoint", ENDPOINT_PREFIX + mockAuthServer.getPort()); configuration.setString(CONFIG_PREFIX + ".key", AZURE_ACCOUNT_KEY); + configuration.setBoolean(HNS_ENABLED, false); FileSystem.initialize(configuration, null); } diff --git a/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemDelegationTokenITCase.java b/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemDelegationTokenITCase.java index 453121dc0f..f63605a205 100644 --- a/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemDelegationTokenITCase.java +++ b/fluss-filesystems/fluss-fs-azure/src/test/java/org/apache/fluss/fs/azure/AbfsFileSystemDelegationTokenITCase.java @@ -45,6 +45,7 @@ class AbfsFileSystemDelegationTokenITCase extends FileSystemBehaviorTestSuite { private static final String ABFS_FS_PATH = "abfs://fluss@test.dfs.core.windows.net/test"; + private static final String HNS_ENABLED = "fs.azure.account.hns.enabled"; @BeforeAll static void setup() throws Exception { @@ -64,7 +65,9 @@ static void setup() throws Exception { new AbfsDelegationTokenReceiver().onNewTokensObtained(token); // Initialize without account key. - FileSystem.initialize(new Configuration(), null); + Configuration configuration = new Configuration(); + configuration.setBoolean(HNS_ENABLED, false); + FileSystem.initialize(configuration, null); } @AfterAll diff --git a/fluss-filesystems/fluss-fs-cos/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-cos/src/main/resources/META-INF/NOTICE index feb58a9a2e..a63c5cb91c 100644 --- a/fluss-filesystems/fluss-fs-cos/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-cos/src/main/resources/META-INF/NOTICE @@ -11,11 +11,10 @@ This project bundles the following dependencies under the Apache Software Licens - com.fasterxml.jackson.core:jackson-databind:2.15.3 - com.fasterxml.woodstox:woodstox-core:5.4.0 - com.google.code.gson:gson:2.8.9 -- com.google.guava:failureaccess:1.0 -- com.google.guava:guava:27.0-jre +- com.google.guava:failureaccess:1.0.1 +- com.google.guava:guava:32.0.1-jre - com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -- com.google.j2objc:j2objc-annotations:1.1 -- com.google.re2j:re2j:1.1 +- com.google.j2objc:j2objc-annotations:2.8 - com.qcloud:cos_api:5.6.139 - com.squareup.okhttp3:logging-interceptor:4.10.0 - com.squareup.okhttp3:okhttp:4.10.0 @@ -24,53 +23,64 @@ This project bundles the following dependencies under the Apache Software Licens - com.tencentcloudapi:tencentcloud-sdk-java-common:3.1.678 - com.tencentcloudapi:tencentcloud-sdk-java-kms:3.1.213 - com.tencentcloudapi:tencentcloud-sdk-java-sts:3.1.678 -- commons-beanutils:commons-beanutils:1.9.4 - commons-codec:commons-codec:1.13 -- commons-collections:commons-collections:3.2.2 -- commons-io:commons-io:2.14.0 +- commons-io:commons-io:2.16.1 - commons-logging:commons-logging:1.2 -- dnsjava:dnsjava:3.4.0 -- io.dropwizard.metrics:metrics-core:3.2.4 -- io.netty:netty-buffer:4.1.100.Final -- io.netty:netty-codec:4.1.100.Final -- io.netty:netty-common:4.1.100.Final -- io.netty:netty-handler:4.1.100.Final -- io.netty:netty-resolver:4.1.100.Final -- io.netty:netty-transport-classes-epoll:4.1.100.Final -- io.netty:netty-transport-native-epoll:4.1.100.Final -- io.netty:netty-transport-native-unix-common:4.1.100.Final -- io.netty:netty-transport:4.1.100.Final -- jakarta.activation:jakarta.activation-api:1.2.1 - joda-time:joda-time:2.9.9 -- org.ini4j:ini4j:0.5.4 -- org.apache.commons:commons-compress:1.24.0 -- org.apache.commons:commons-configuration2:2.8.0 +- org.apache.commons:commons-collections4:4.4 +- org.apache.commons:commons-compress:1.26.1 +- org.apache.commons:commons-configuration2:2.10.1 - org.apache.commons:commons-lang3:3.18.0 -- org.apache.commons:commons-text:1.10.0 -- org.apache.hadoop:hadoop-annotations:3.4.0 -- org.apache.hadoop:hadoop-auth:3.4.0 -- org.apache.hadoop:hadoop-common:3.4.0 +- org.apache.commons:commons-text:1.14.0 +- org.apache.hadoop:hadoop-annotations:3.4.3 +- org.apache.hadoop:hadoop-auth:3.4.3 +- org.apache.hadoop:hadoop-common:3.4.3 - org.apache.hadoop:hadoop-cos:3.3.5 -- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.2.0 -- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_21:1.2.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.5.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_25:1.5.0 - org.apache.httpcomponents:httpclient:4.5.13 - org.apache.httpcomponents:httpcore:4.4.13 - org.apache.kerby:kerb-core:2.0.3 +- org.apache.kerby:kerb-crypto:2.0.3 +- org.apache.kerby:kerb-util:2.0.3 - org.apache.kerby:kerby-asn1:2.0.3 +- org.apache.kerby:kerby-config:2.0.3 - org.apache.kerby:kerby-pkix:2.0.3 - org.apache.kerby:kerby-util:2.0.3 - org.bouncycastle:bcprov-jdk15on:1.67 -- org.checkerframework:checker-qual:2.5.2 +- org.ini4j:ini4j:0.5.4 - org.jetbrains.kotlin:kotlin-stdlib-common:1.6.20 - org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10 - org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10 - org.jetbrains.kotlin:kotlin-stdlib:1.6.20 - org.jetbrains:annotations:13.0 -- org.codehaus.jettison:jettison:1.5.4 -- org.codehaus.mojo:animal-sniffer-annotations:1.17 -- org.codehaus.woodstox:stax2-api:4.2.1 - org.xerial.snappy:snappy-java:1.1.10.4 +This project bundles the following dependencies under the MIT (https://opensource.org/licenses/MIT) +See bundled license files for details. + +- org.checkerframework:checker-qual:3.33.0 + +This project bundles the following dependencies under BSD-2 License (https://opensource.org/licenses/BSD-2-Clause). +See bundled license files for details. + +- dnsjava:dnsjava:3.6.1 + +This project bundles the following dependencies under the Go License (https://golang.org/LICENSE). +See bundled license files for details. + +- com.google.re2j:re2j:1.1 + +This project bundles the following dependencies under BSD License (https://opensource.org/licenses/bsd-license.php). +See bundled license files for details. + +- org.codehaus.woodstox:stax2-api:4.2.1 (https://github.com/FasterXML/stax2-api/tree/stax2-api-4.2.1) + +This project bundles the following dependencies under EDL 1.0 License (https://www.eclipse.org/org/documents/edl-v10.php). +See bundled license files for details. + +- jakarta.activation:jakarta.activation-api:1.2.1 + This project bundles the following dependencies under the CDDL 1.1 license. See bundled license files for details. diff --git a/fluss-filesystems/fluss-fs-gs/pom.xml b/fluss-filesystems/fluss-fs-gs/pom.xml index 97f10a77ac..28453019ab 100644 --- a/fluss-filesystems/fluss-fs-gs/pom.xml +++ b/fluss-filesystems/fluss-fs-gs/pom.xml @@ -77,6 +77,10 @@ com.github.pjfanning jersey-json + + com.sun.xml.bind + jaxb-impl + com.sun.jersey jersey-server @@ -181,6 +185,26 @@ org.slf4j slf4j-reload4j + + org.bouncycastle + bcprov-jdk18on + + + io.netty + netty-handler + + + io.netty + netty-transport-native-epoll + + + io.dropwizard.metrics + metrics-core + + + org.codehaus.jettison + jettison + @@ -430,4 +454,4 @@ - \ No newline at end of file + diff --git a/fluss-filesystems/fluss-fs-gs/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-gs/src/main/resources/META-INF/NOTICE index 55aa21d7c1..37b79fbb76 100644 --- a/fluss-filesystems/fluss-fs-gs/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-gs/src/main/resources/META-INF/NOTICE @@ -5,7 +5,7 @@ This project bundles the following dependencies under the Apache Software Licens - com.fasterxml.jackson.core:jackson-annotations:2.15.3 - com.fasterxml.jackson.core:jackson-core:2.15.3 - com.fasterxml.jackson.core:jackson-databind:2.15.3 -- com.fasterxml.woodstox:woodstox-core:5.3.0 +- com.fasterxml.woodstox:woodstox-core:5.4.0 - com.google.android:annotations:4.1.1.4 - com.google.api-client:google-api-client-jackson2:2.0.1 - com.google.api-client:google-api-client:2.2.0 @@ -31,10 +31,10 @@ This project bundles the following dependencies under the Apache Software Licens - com.google.flogger:flogger-system-backend:0.7.1 - com.google.flogger:flogger:0.7.1 - com.google.flogger:google-extensions:0.7.1 -- com.google.guava:failureaccess:1.0 -- com.google.guava:guava:27.0-jre +- com.google.guava:failureaccess:1.0.1 +- com.google.guava:guava:32.0.1-jre - com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -- com.google.j2objc:j2objc-annotations:1.1 +- com.google.j2objc:j2objc-annotations:2.8 - com.google.http-client:google-http-client-apache-v2:1.43.3 - com.google.http-client:google-http-client-appengine:1.43.3 - com.google.http-client:google-http-client-gson:1.43.3 @@ -45,8 +45,8 @@ This project bundles the following dependencies under the Apache Software Licens - commons-beanutils:commons-beanutils:1.9.4 - commons-codec:commons-codec:1.16.0 - commons-collections:commons-collections:3.2.2 -- commons-io:commons-io:2.8.0 -- commons-logging:commons-logging:1.1.3 +- commons-io:commons-io:2.16.1 +- commons-logging:commons-logging:1.3.0 - io.grpc:grpc-alts:1.59.1 - io.grpc:grpc-api:1.59.1 - io.grpc:grpc-auth:1.59.1 @@ -75,21 +75,25 @@ This project bundles the following dependencies under the Apache Software Licens - io.opencensus:opencensus-impl-core:0.31.0 - io.opencensus:opencensus-proto:0.2.0 - io.perfmark:perfmark-api:0.26.0 -- org.apache.commons:commons-compress:1.21 -- org.apache.commons:commons-configuration2:2.1.1 +- org.apache.commons:commons-collections4:4.4 +- org.apache.commons:commons-compress:1.26.1 +- org.apache.commons:commons-configuration2:2.10.1 - org.apache.commons:commons-lang3:3.18.0 -- org.apache.commons:commons-text:1.4 -- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.1.1 -- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_7:1.1.1 -- org.apache.hadoop:hadoop-annotations:3.3.4 -- org.apache.hadoop:hadoop-auth:3.3.4 -- org.apache.hadoop:hadoop-common:3.3.4 +- org.apache.commons:commons-text:1.14.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.5.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_25:1.5.0 +- org.apache.hadoop:hadoop-annotations:3.4.3 +- org.apache.hadoop:hadoop-auth:3.4.3 +- org.apache.hadoop:hadoop-common:3.4.3 - org.apache.httpcomponents:httpclient:4.5.13 - org.apache.httpcomponents:httpcore:4.4.13 -- org.apache.kerby:kerb-core:1.0.1 -- org.apache.kerby:kerby-asn1:1.0.1 -- org.apache.kerby:kerby-pkix:1.0.1 -- org.apache.kerby:kerby-util:1.0.1 +- org.apache.kerby:kerb-core:2.0.3 +- org.apache.kerby:kerb-crypto:2.0.3 +- org.apache.kerby:kerb-util:2.0.3 +- org.apache.kerby:kerby-asn1:2.0.3 +- org.apache.kerby:kerby-config:2.0.3 +- org.apache.kerby:kerby-pkix:2.0.3 +- org.apache.kerby:kerby-util:2.0.3 - org.conscrypt:conscrypt-openjdk-uber:2.5.2 - org.xerial.snappy:snappy-java:1.1.10.4 @@ -101,7 +105,7 @@ See bundled license files for details. This project bundles the following dependencies under BSD-2 License (https://opensource.org/licenses/BSD-2-Clause). See bundled license files for details. -- dnsjava:dnsjava:2.1.7 +- dnsjava:dnsjava:3.6.1 This project bundles the following dependencies under BSD-3 License (https://opensource.org/licenses/BSD-3-Clause). See bundled license files for details. @@ -123,7 +127,7 @@ See bundled license files for details. This project bundles the following dependencies under the MIT License. See bundled license files for details. -- org.checkerframework:checker-qual:2.5.2 +- org.checkerframework:checker-qual:3.33.0 - org.codehaus.mojo:animal-sniffer-annotations:1.23 This project bundles the following dependencies under the CDDL 1.1 license. diff --git a/fluss-filesystems/fluss-fs-hadoop-shaded/pom.xml b/fluss-filesystems/fluss-fs-hadoop-shaded/pom.xml index add10b745d..6d35f32b24 100644 --- a/fluss-filesystems/fluss-fs-hadoop-shaded/pom.xml +++ b/fluss-filesystems/fluss-fs-hadoop-shaded/pom.xml @@ -78,6 +78,10 @@ com.github.pjfanning jersey-json + + com.sun.xml.bind + jaxb-impl + org.apache.avro avro @@ -178,6 +182,26 @@ org.slf4j slf4j-reload4j + + org.bouncycastle + bcprov-jdk18on + + + io.netty + netty-handler + + + io.netty + netty-transport-native-epoll + + + io.dropwizard.metrics + metrics-core + + + org.codehaus.jettison + jettison + @@ -276,4 +300,4 @@ - \ No newline at end of file + diff --git a/fluss-filesystems/fluss-fs-hadoop-shaded/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-hadoop-shaded/src/main/resources/META-INF/NOTICE index 2d582c7fbc..b2c8897b97 100644 --- a/fluss-filesystems/fluss-fs-hadoop-shaded/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-hadoop-shaded/src/main/resources/META-INF/NOTICE @@ -9,40 +9,41 @@ This project bundles the following dependencies under the Apache Software Licens - com.fasterxml.jackson.core:jackson-annotations:2.15.3 - com.fasterxml.jackson.core:jackson-core:2.15.3 - com.fasterxml.jackson.core:jackson-databind:2.15.3 -- com.fasterxml.woodstox:woodstox-core:5.3.0 -- com.google.guava:failureaccess:1.0 -- com.google.guava:guava:27.0-jre +- com.fasterxml.woodstox:woodstox-core:5.4.0 +- com.google.guava:failureaccess:1.0.1 +- com.google.guava:guava:32.0.1-jre - com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -- com.google.j2objc:j2objc-annotations:1.1 -- commons-beanutils:commons-beanutils:1.9.4 -- commons-collections:commons-collections:3.2.2 -- commons-io:commons-io:2.8.0 -- commons-logging:commons-logging:1.1.3 -- org.apache.commons:commons-compress:1.21 -- org.apache.commons:commons-configuration2:2.1.1 +- com.google.j2objc:j2objc-annotations:2.8 +- commons-io:commons-io:2.16.1 +- commons-logging:commons-logging:1.3.0 +- org.apache.commons:commons-collections4:4.4 +- org.apache.commons:commons-compress:1.26.1 +- org.apache.commons:commons-configuration2:2.10.1 - org.apache.commons:commons-lang3:3.18.0 -- org.apache.commons:commons-text:1.4 -- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.1.1 -- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_7:1.1.1 -- org.apache.hadoop:hadoop-annotations:3.3.4 -- org.apache.hadoop:hadoop-auth:3.3.4 -- org.apache.hadoop:hadoop-common:3.3.4 -- org.apache.kerby:kerb-core:1.0.1 -- org.apache.kerby:kerby-asn1:1.0.1 -- org.apache.kerby:kerby-pkix:1.0.1 -- org.apache.kerby:kerby-util:1.0.1 +- org.apache.commons:commons-text:1.14.0 +- org.apache.hadoop:hadoop-annotations:3.4.3 +- org.apache.hadoop:hadoop-auth:3.4.3 +- org.apache.hadoop:hadoop-common:3.4.3 +- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.5.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_25:1.5.0 +- org.apache.kerby:kerb-core:2.0.3 +- org.apache.kerby:kerb-crypto:2.0.3 +- org.apache.kerby:kerb-util:2.0.3 +- org.apache.kerby:kerby-asn1:2.0.3 +- org.apache.kerby:kerby-config:2.0.3 +- org.apache.kerby:kerby-pkix:2.0.3 +- org.apache.kerby:kerby-util:2.0.3 - org.xerial.snappy:snappy-java:1.1.10.4 This project bundles the following dependencies under the MIT (https://opensource.org/licenses/MIT) See bundled license files for details. -- org.checkerframework:checker-qual:2.5.2 -- org.codehaus.mojo:animal-sniffer-annotations:1.17 +- org.checkerframework:checker-qual:3.33.0 This project bundles the following dependencies under BSD-2 License (https://opensource.org/licenses/BSD-2-Clause). See bundled license files for details. -- dnsjava:dnsjava:2.1.7 +- dnsjava:dnsjava:3.6.1 This project bundles the following dependencies under the Go License (https://golang.org/LICENSE). See bundled license files for details. diff --git a/fluss-filesystems/fluss-fs-hdfs/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-hdfs/src/main/resources/META-INF/NOTICE index a111ff772d..2f6a312b48 100644 --- a/fluss-filesystems/fluss-fs-hdfs/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-hdfs/src/main/resources/META-INF/NOTICE @@ -9,11 +9,11 @@ This project bundles the following dependencies under the Apache Software Licens - com.fasterxml.jackson.core:jackson-annotations:2.15.3 - com.fasterxml.jackson.core:jackson-core:2.15.3 - com.fasterxml.jackson.core:jackson-databind:2.15.3 -- com.squareup.okhttp3:okhttp:4.9.3 -- com.squareup.okio:okio:2.8.0 -- org.apache.hadoop:hadoop-hdfs-client:3.3.4 -- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.10 -- org.jetbrains.kotlin:kotlin-stdlib:1.4.10 +- commons-codec:commons-codec:1.15 +- commons-logging:commons-logging:1.2 +- org.apache.hadoop:hadoop-hdfs-client:3.4.3 +- org.apache.httpcomponents:httpclient:4.5.13 +- org.apache.httpcomponents:httpcore:4.4.13 This project bundles the following dependencies under BSD-3 License (https://opensource.org/licenses/BSD-3-Clause). See bundled license files for details. diff --git a/fluss-filesystems/fluss-fs-obs/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-obs/src/main/resources/META-INF/NOTICE index d175e914c3..5e2b964fd1 100644 --- a/fluss-filesystems/fluss-fs-obs/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-obs/src/main/resources/META-INF/NOTICE @@ -6,48 +6,41 @@ The Apache Software Foundation (http://www.apache.org/). This project bundles the following dependencies under the Apache Software License 2.0 (http://www.apache.org/licenses/LICENSE-2.0.txt) -- com.google.guava:guava:27.0-jre -- com.google.guava:failureaccess:1.0 +- com.google.guava:guava:32.0.1-jre +- com.google.guava:failureaccess:1.0.1 - com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -- com.google.j2objc:j2objc-annotations:1.1 +- com.google.j2objc:j2objc-annotations:2.8 - com.google.re2j:re2j:1.1 - com.huaweicloud:esdk-obs-java:3.24.12 - com.huaweicloud.sdk:huaweicloud-sdk-iam:3.1.87 - com.fasterxml.woodstox:woodstox-core:5.4.0 - commons-beanutils:commons-beanutils:1.9.4 - commons-collections:commons-collections:3.2.2 -- commons-io:commons-io:2.14.0 -- commons-logging:commons-logging:1.2 -- dnsjava:dnsjava:3.4.0 -- io.dropwizard.metrics:metrics-core:3.2.4 -- io.netty:netty-buffer:4.1.100.Final -- io.netty:netty-codec:4.1.100.Final -- io.netty:netty-common:4.1.100.Final -- io.netty:netty-handler:4.1.100.Final -- io.netty:netty-resolver:4.1.100.Final -- io.netty:netty-transport-classes-epoll:4.1.100.Final -- io.netty:netty-transport-native-epoll:4.1.100.Final -- io.netty:netty-transport-native-unix-common:4.1.100.Final -- io.netty:netty-transport:4.1.100.Final +- commons-io:commons-io:2.16.1 +- commons-logging:commons-logging:1.3.0 +- dnsjava:dnsjava:3.6.1 - jakarta.activation:jakarta.activation-api:1.2.1 -- org.apache.commons:commons-compress:1.24.0 -- org.apache.commons:commons-configuration2:2.8.0 +- org.apache.commons:commons-collections4:4.4 +- org.apache.commons:commons-compress:1.26.1 +- org.apache.commons:commons-configuration2:2.10.1 - org.apache.commons:commons-lang3:3.18.0 -- org.apache.commons:commons-text:1.10.0 -- org.apache.hadoop:hadoop-annotations:3.4.0 -- org.apache.hadoop:hadoop-auth:3.4.0 -- org.apache.hadoop:hadoop-common:3.4.0 +- org.apache.commons:commons-text:1.14.0 +- org.apache.hadoop:hadoop-annotations:3.4.3 +- org.apache.hadoop:hadoop-auth:3.4.3 +- org.apache.hadoop:hadoop-common:3.4.3 - org.apache.hadoop:hadoop-huaweicloud:3.4.0 -- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.2.0 -- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_21:1.2.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.5.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_25:1.5.0 - org.apache.kerby:kerb-core:2.0.3 +- org.apache.kerby:kerb-crypto:2.0.3 +- org.apache.kerby:kerb-util:2.0.3 - org.apache.kerby:kerby-asn1:2.0.3 +- org.apache.kerby:kerby-config:2.0.3 - org.apache.kerby:kerby-pkix:2.0.3 - org.apache.kerby:kerby-util:2.0.3 - org.bouncycastle:bcprov-jdk15on:1.70 -- org.checkerframework:checker-qual:2.5.2 +- org.checkerframework:checker-qual:3.33.0 - org.codehaus.woodstox:stax2-api:4.2.1 -- org.codehaus.jettison:jettison:1.5.4 - org.codehaus.mojo:animal-sniffer-annotations:1.17 - com.fasterxml.jackson.core:jackson-annotations:2.15.3 - com.fasterxml.jackson.core:jackson-core:2.15.3 diff --git a/fluss-filesystems/fluss-fs-oss/src/main/resources/META-INF/NOTICE b/fluss-filesystems/fluss-fs-oss/src/main/resources/META-INF/NOTICE index 2140e2c3ba..f2fa32754f 100644 --- a/fluss-filesystems/fluss-fs-oss/src/main/resources/META-INF/NOTICE +++ b/fluss-filesystems/fluss-fs-oss/src/main/resources/META-INF/NOTICE @@ -15,51 +15,45 @@ This project bundles the following dependencies under the Apache Software Licens - com.fasterxml.jackson.core:jackson-databind:2.15.3 - com.fasterxml.woodstox:woodstox-core:5.4.0 - com.google.code.gson:gson:2.8.6 -- com.google.guava:failureaccess:1.0 -- com.google.guava:guava:27.0-jre +- com.google.guava:failureaccess:1.0.1 +- com.google.guava:guava:32.0.1-jre - com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -- com.google.j2objc:j2objc-annotations:1.1 +- com.google.j2objc:j2objc-annotations:2.8 - com.google.re2j:re2j:1.1 - commons-beanutils:commons-beanutils:1.9.4 - commons-collections:commons-collections:3.2.2 -- commons-io:commons-io:2.14.0 +- commons-io:commons-io:2.16.1 - commons-codec:commons-codec:1.11 - commons-logging:commons-logging:1.2 -- dnsjava:dnsjava:3.4.0 -- io.dropwizard.metrics:metrics-core:3.2.4 -- io.netty:netty-buffer:4.1.100.Final -- io.netty:netty-codec:4.1.100.Final -- io.netty:netty-common:4.1.100.Final -- io.netty:netty-handler:4.1.100.Final -- io.netty:netty-resolver:4.1.100.Final -- io.netty:netty-transport-classes-epoll:4.1.100.Final -- io.netty:netty-transport-native-epoll:4.1.100.Final -- io.netty:netty-transport-native-unix-common:4.1.100.Final -- io.netty:netty-transport:4.1.100.Final +- dnsjava:dnsjava:3.6.1 - io.opentracing:opentracing-api:0.33.0 - io.opentracing:opentracing-noop:0.33.0 - io.opentracing:opentracing-util:0.33.0 - jakarta.activation:jakarta.activation-api:1.2.1 -- org.apache.hadoop:hadoop-aliyun:3.3.4 -- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.2.0 -- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_21:1.2.0 +- org.apache.hadoop:hadoop-aliyun:3.4.3 +- org.apache.hadoop.thirdparty:hadoop-shaded-guava:1.5.0 +- org.apache.hadoop.thirdparty:hadoop-shaded-protobuf_3_25:1.5.0 - org.apache.httpcomponents:httpclient:4.5.13 - org.apache.httpcomponents:httpcore:4.4.13 - org.apache.kerby:kerb-core:2.0.3 +- org.apache.kerby:kerb-crypto:2.0.3 +- org.apache.kerby:kerb-util:2.0.3 - org.apache.kerby:kerby-asn1:2.0.3 +- org.apache.kerby:kerby-config:2.0.3 - org.apache.kerby:kerby-pkix:2.0.3 - org.apache.kerby:kerby-util:2.0.3 - org.bouncycastle:bcprov-jdk15on:1.70 - org.codehaus.jettison:jettison:1.5.4 - org.ini4j:ini4j:0.5.4 -- org.apache.commons:commons-compress:1.24.0 -- org.apache.commons:commons-configuration2:2.8.0 -- org.apache.commons:commons-text:1.10.0 +- org.apache.commons:commons-collections4:4.4 +- org.apache.commons:commons-compress:1.26.1 +- org.apache.commons:commons-configuration2:2.10.1 +- org.apache.commons:commons-text:1.14.0 - org.apache.commons:commons-lang3:3.18.0 -- org.apache.hadoop:hadoop-annotations:3.4.0 -- org.apache.hadoop:hadoop-auth:3.4.0 -- org.apache.hadoop:hadoop-common:3.4.0 -- org.checkerframework:checker-qual:2.5.2 +- org.apache.hadoop:hadoop-annotations:3.4.3 +- org.apache.hadoop:hadoop-auth:3.4.3 +- org.apache.hadoop:hadoop-common:3.4.3 +- org.checkerframework:checker-qual:3.33.0 - org.codehaus.mojo:animal-sniffer-annotations:1.17 - org.codehaus.woodstox:stax2-api:4.2.1 - org.xerial.snappy:snappy-java:1.1.10.4 diff --git a/fluss-filesystems/fluss-fs-s3/pom.xml b/fluss-filesystems/fluss-fs-s3/pom.xml index c25ddbbd8a..93664cf378 100644 --- a/fluss-filesystems/fluss-fs-s3/pom.xml +++ b/fluss-filesystems/fluss-fs-s3/pom.xml @@ -33,7 +33,10 @@ jar - 1.12.319 + + 2.44.4 @@ -74,6 +77,14 @@ com.sun.jersey jersey-server + + com.github.pjfanning + jersey-json + + + com.sun.xml.bind + jaxb-impl + org.apache.avro avro @@ -174,6 +185,26 @@ org.slf4j slf4j-reload4j + + org.bouncycastle + bcprov-jdk18on + + + io.netty + netty-handler + + + io.netty + netty-transport-native-epoll + + + io.dropwizard.metrics + metrics-core + + + org.codehaus.jettison + jettison + @@ -184,31 +215,37 @@ ${project.version} - + + + software.amazon.awssdk + aws-core + ${fs.s3.aws.sdk2.version} + - com.amazonaws - aws-java-sdk-core - ${fs.s3.aws.version} + software.amazon.awssdk + auth + ${fs.s3.aws.sdk2.version} - com.amazonaws - aws-java-sdk-s3 - ${fs.s3.aws.version} + software.amazon.awssdk + s3 + ${fs.s3.aws.sdk2.version} - com.amazonaws - aws-java-sdk-kms - ${fs.s3.aws.version} + software.amazon.awssdk + kms + ${fs.s3.aws.sdk2.version} - com.amazonaws - aws-java-sdk-dynamodb - ${fs.s3.aws.version} + software.amazon.awssdk + sts + ${fs.s3.aws.sdk2.version} - com.amazonaws - aws-java-sdk-sts - ${fs.s3.aws.version} + software.amazon.awssdk + s3-transfer-manager + ${fs.s3.aws.sdk2.version} @@ -218,8 +255,8 @@ ${fs.hadoopshaded.version} - com.amazonaws - aws-java-sdk-bundle + software.amazon.awssdk + bundle ch.qos.reload4j @@ -365,12 +402,13 @@ - com.amazonaws:aws-java-sdk-s3 - + software.amazon.s3.analyticsaccelerator:analyticsaccelerator-s3 - com/amazonaws/services/s3/model/transform/XmlResponsesSaxParser** + LICENSE + NOTICE + THIRD-PARTY-NOTICES + META-INF/LICENSE + META-INF/NOTICE @@ -387,4 +425,4 @@ - \ No newline at end of file + diff --git a/fluss-filesystems/fluss-fs-s3/src/main/java/com/amazonaws/services/s3/model/transform/XmlResponsesSaxParser.java b/fluss-filesystems/fluss-fs-s3/src/main/java/com/amazonaws/services/s3/model/transform/XmlResponsesSaxParser.java deleted file mode 100644 index 6decac572d..0000000000 --- a/fluss-filesystems/fluss-fs-s3/src/main/java/com/amazonaws/services/s3/model/transform/XmlResponsesSaxParser.java +++ /dev/null @@ -1,3525 +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 com.amazonaws.services.s3.model.transform; - -import com.amazonaws.SdkClientException; -import com.amazonaws.services.s3.internal.Constants; -import com.amazonaws.services.s3.internal.DeleteObjectsResponse; -import com.amazonaws.services.s3.internal.ObjectExpirationResult; -import com.amazonaws.services.s3.internal.S3RequesterChargedResult; -import com.amazonaws.services.s3.internal.S3VersionResult; -import com.amazonaws.services.s3.internal.ServerSideEncryptionResult; -import com.amazonaws.services.s3.internal.ServiceUtils; -import com.amazonaws.services.s3.model.AbortIncompleteMultipartUpload; -import com.amazonaws.services.s3.model.AccessControlList; -import com.amazonaws.services.s3.model.AccessControlTranslation; -import com.amazonaws.services.s3.model.AmazonS3Exception; -import com.amazonaws.services.s3.model.Bucket; -import com.amazonaws.services.s3.model.BucketAccelerateConfiguration; -import com.amazonaws.services.s3.model.BucketCrossOriginConfiguration; -import com.amazonaws.services.s3.model.BucketLifecycleConfiguration; -import com.amazonaws.services.s3.model.BucketLifecycleConfiguration.NoncurrentVersionTransition; -import com.amazonaws.services.s3.model.BucketLifecycleConfiguration.Rule; -import com.amazonaws.services.s3.model.BucketLifecycleConfiguration.Transition; -import com.amazonaws.services.s3.model.BucketLoggingConfiguration; -import com.amazonaws.services.s3.model.BucketReplicationConfiguration; -import com.amazonaws.services.s3.model.BucketTaggingConfiguration; -import com.amazonaws.services.s3.model.BucketVersioningConfiguration; -import com.amazonaws.services.s3.model.BucketWebsiteConfiguration; -import com.amazonaws.services.s3.model.CORSRule; -import com.amazonaws.services.s3.model.CORSRule.AllowedMethods; -import com.amazonaws.services.s3.model.CanonicalGrantee; -import com.amazonaws.services.s3.model.CompleteMultipartUploadResult; -import com.amazonaws.services.s3.model.CopyObjectResult; -import com.amazonaws.services.s3.model.DeleteObjectsResult.DeletedObject; -import com.amazonaws.services.s3.model.EmailAddressGrantee; -import com.amazonaws.services.s3.model.EncryptionConfiguration; -import com.amazonaws.services.s3.model.GetBucketAnalyticsConfigurationResult; -import com.amazonaws.services.s3.model.GetBucketInventoryConfigurationResult; -import com.amazonaws.services.s3.model.GetBucketMetricsConfigurationResult; -import com.amazonaws.services.s3.model.GetObjectTaggingResult; -import com.amazonaws.services.s3.model.Grantee; -import com.amazonaws.services.s3.model.GroupGrantee; -import com.amazonaws.services.s3.model.InitiateMultipartUploadResult; -import com.amazonaws.services.s3.model.ListBucketAnalyticsConfigurationsResult; -import com.amazonaws.services.s3.model.ListBucketInventoryConfigurationsResult; -import com.amazonaws.services.s3.model.ListBucketMetricsConfigurationsResult; -import com.amazonaws.services.s3.model.ListObjectsV2Result; -import com.amazonaws.services.s3.model.MultiObjectDeleteException.DeleteError; -import com.amazonaws.services.s3.model.MultipartUpload; -import com.amazonaws.services.s3.model.MultipartUploadListing; -import com.amazonaws.services.s3.model.ObjectListing; -import com.amazonaws.services.s3.model.Owner; -import com.amazonaws.services.s3.model.PartListing; -import com.amazonaws.services.s3.model.PartSummary; -import com.amazonaws.services.s3.model.Permission; -import com.amazonaws.services.s3.model.RedirectRule; -import com.amazonaws.services.s3.model.ReplicationDestinationConfig; -import com.amazonaws.services.s3.model.ReplicationRule; -import com.amazonaws.services.s3.model.RequestPaymentConfiguration; -import com.amazonaws.services.s3.model.RequestPaymentConfiguration.Payer; -import com.amazonaws.services.s3.model.RoutingRule; -import com.amazonaws.services.s3.model.RoutingRuleCondition; -import com.amazonaws.services.s3.model.S3ObjectSummary; -import com.amazonaws.services.s3.model.S3VersionSummary; -import com.amazonaws.services.s3.model.SourceSelectionCriteria; -import com.amazonaws.services.s3.model.SseKmsEncryptedObjects; -import com.amazonaws.services.s3.model.Tag; -import com.amazonaws.services.s3.model.TagSet; -import com.amazonaws.services.s3.model.VersionListing; -import com.amazonaws.services.s3.model.analytics.AnalyticsAndOperator; -import com.amazonaws.services.s3.model.analytics.AnalyticsConfiguration; -import com.amazonaws.services.s3.model.analytics.AnalyticsExportDestination; -import com.amazonaws.services.s3.model.analytics.AnalyticsFilter; -import com.amazonaws.services.s3.model.analytics.AnalyticsFilterPredicate; -import com.amazonaws.services.s3.model.analytics.AnalyticsPrefixPredicate; -import com.amazonaws.services.s3.model.analytics.AnalyticsS3BucketDestination; -import com.amazonaws.services.s3.model.analytics.AnalyticsTagPredicate; -import com.amazonaws.services.s3.model.analytics.StorageClassAnalysis; -import com.amazonaws.services.s3.model.analytics.StorageClassAnalysisDataExport; -import com.amazonaws.services.s3.model.inventory.InventoryConfiguration; -import com.amazonaws.services.s3.model.inventory.InventoryDestination; -import com.amazonaws.services.s3.model.inventory.InventoryFilter; -import com.amazonaws.services.s3.model.inventory.InventoryPrefixPredicate; -import com.amazonaws.services.s3.model.inventory.InventoryS3BucketDestination; -import com.amazonaws.services.s3.model.inventory.InventorySchedule; -import com.amazonaws.services.s3.model.inventory.ServerSideEncryptionKMS; -import com.amazonaws.services.s3.model.inventory.ServerSideEncryptionS3; -import com.amazonaws.services.s3.model.lifecycle.LifecycleAndOperator; -import com.amazonaws.services.s3.model.lifecycle.LifecycleFilter; -import com.amazonaws.services.s3.model.lifecycle.LifecycleFilterPredicate; -import com.amazonaws.services.s3.model.lifecycle.LifecyclePrefixPredicate; -import com.amazonaws.services.s3.model.lifecycle.LifecycleTagPredicate; -import com.amazonaws.services.s3.model.metrics.MetricsAndOperator; -import com.amazonaws.services.s3.model.metrics.MetricsConfiguration; -import com.amazonaws.services.s3.model.metrics.MetricsFilter; -import com.amazonaws.services.s3.model.metrics.MetricsFilterPredicate; -import com.amazonaws.services.s3.model.metrics.MetricsPrefixPredicate; -import com.amazonaws.services.s3.model.metrics.MetricsTagPredicate; -import com.amazonaws.util.DateUtils; -import com.amazonaws.util.SdkHttpUtils; -import com.amazonaws.util.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.xml.sax.Attributes; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; -import org.xml.sax.SAXNotRecognizedException; -import org.xml.sax.SAXNotSupportedException; -import org.xml.sax.XMLReader; -import org.xml.sax.helpers.DefaultHandler; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParserFactory; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import static com.amazonaws.util.StringUtils.UTF8; - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// -// This class is copied from aws-java-sdk-s3 (Apache License 2.0) -// in order to replaced {@code XMLReaderFactory.createXMLReader} by -// {@code SAX_PARSER_FACTORY.newSAXParser().getXMLReader()} to -// avoid JDK-8015099. -// -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- - -/** - * XML Sax parser to read XML documents returned by S3 via the REST interface, converting these - * documents into objects. - */ -public class XmlResponsesSaxParser { - private static final Log log = LogFactory.getLog(XmlResponsesSaxParser.class); - - private static final SAXParserFactory SAX_PARSER_FACTORY = SAXParserFactory.newInstance(); - - private XMLReader xr = null; - - private boolean sanitizeXmlDocument = true; - - /** - * Constructs the XML SAX parser. - * - * @throws SdkClientException - */ - public XmlResponsesSaxParser() throws SdkClientException { - // Ensure we can load the XML Reader. - try { - // Need to explicitly enable Sax' NAMESPACES_FEATURE (default true) in JAXP (default - // false)! - SAX_PARSER_FACTORY.setNamespaceAware(true); - xr = SAX_PARSER_FACTORY.newSAXParser().getXMLReader(); - disableExternalResourceFetching(xr); - } catch (SAXException | ParserConfigurationException e) { - throw new SdkClientException( - "Couldn't initialize a SAX driver to create an XMLReader", e); - } - } - - /** - * Parses an XML document from an input stream using a document handler. - * - * @param handler the handler for the XML document - * @param inputStream an input stream containing the XML document to parse - * @throws IOException on error reading from the input stream (ie connection reset) - * @throws SdkClientException on error with malformed XML, etc - */ - protected void parseXmlInputStream(DefaultHandler handler, InputStream inputStream) - throws IOException { - try { - - if (log.isDebugEnabled()) { - log.debug("Parsing XML response document with handler: " + handler.getClass()); - } - - BufferedReader breader = - new BufferedReader( - new InputStreamReader(inputStream, Constants.DEFAULT_ENCODING)); - xr.setContentHandler(handler); - xr.setErrorHandler(handler); - xr.parse(new InputSource(breader)); - - } catch (IOException e) { - throw e; - - } catch (Throwable t) { - try { - inputStream.close(); - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error("Unable to close response InputStream up after XML parse failure", e); - } - } - throw new SdkClientException( - "Failed to parse XML document with handler " + handler.getClass(), t); - } - } - - protected InputStream sanitizeXmlDocument(DefaultHandler handler, InputStream inputStream) - throws IOException { - - if (!sanitizeXmlDocument) { - // No sanitizing will be performed, return the original input stream unchanged. - return inputStream; - } else { - if (log.isDebugEnabled()) { - log.debug("Sanitizing XML document destined for handler " + handler.getClass()); - } - - InputStream sanitizedInputStream = null; - - try { - - /* - * Read object listing XML document from input stream provided into a - * string buffer, so we can replace troublesome characters before - * sending the document to the XML parser. - */ - StringBuilder listingDocBuffer = new StringBuilder(); - BufferedReader br = - new BufferedReader( - new InputStreamReader(inputStream, Constants.DEFAULT_ENCODING)); - - char[] buf = new char[8192]; - int read = -1; - while ((read = br.read(buf)) != -1) { - listingDocBuffer.append(buf, 0, read); - } - br.close(); - - /* - * Replace any carriage return (\r) characters with explicit XML - * character entities, to prevent the SAX parser from - * misinterpreting 0x0D characters as 0x0A and being unable to - * parse the XML. - */ - String listingDoc = listingDocBuffer.toString().replaceAll("\r", " "); - - sanitizedInputStream = new ByteArrayInputStream(listingDoc.getBytes(UTF8)); - - } catch (IOException e) { - throw e; - - } catch (Throwable t) { - try { - inputStream.close(); - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error( - "Unable to close response InputStream after failure sanitizing XML document", - e); - } - } - throw new SdkClientException( - "Failed to sanitize XML document destined for handler " - + handler.getClass(), - t); - } - return sanitizedInputStream; - } - } - - /** - * Disables certain dangerous features that attempt to automatically fetch DTDs - * - *

See OWASP - * XXE Cheat Sheet - * - * @param reader the reader to disable the features on - * @throws SAXNotRecognizedException - * @throws SAXNotSupportedException - */ - private void disableExternalResourceFetching(XMLReader reader) - throws SAXNotRecognizedException, SAXNotSupportedException { - reader.setFeature("http://xml.org/sax/features/external-general-entities", false); - reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false); - reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); - } - - /** - * Checks if the specified string is empty or null and if so, returns null. Otherwise simply - * returns the string. - * - * @param s The string to check. - * @return Null if the specified string was null, or empty, otherwise returns the string the - * caller passed in. - */ - private static String checkForEmptyString(String s) { - if (s == null) return null; - if (s.length() == 0) return null; - - return s; - } - - /** - * Safely parses the specified string as an integer and returns the value. If a - * NumberFormatException occurs while parsing the integer, an error is logged and -1 is - * returned. - * - * @param s The string to parse and return as an integer. - * @return The integer value of the specified string, otherwise -1 if there were any problems - * parsing the string as an integer. - */ - private static int parseInt(String s) { - try { - return Integer.parseInt(s); - } catch (NumberFormatException nfe) { - log.error("Unable to parse integer value '" + s + "'", nfe); - } - - return -1; - } - - /** - * Safely parses the specified string as a long and returns the value. If a - * NumberFormatException occurs while parsing the long, an error is logged and -1 is returned. - * - * @param s The string to parse and return as a long. - * @return The long value of the specified string, otherwise -1 if there were any problems - * parsing the string as a long. - */ - private static long parseLong(String s) { - try { - return Long.parseLong(s); - } catch (NumberFormatException nfe) { - log.error("Unable to parse long value '" + s + "'", nfe); - } - - return -1; - } - - /** Perform a url decode on the given value if specified. Return value by default; */ - private static String decodeIfSpecified(String value, boolean decode) { - return decode ? SdkHttpUtils.urlDecode(value) : value; - } - - /** - * Parses a ListBucket response XML document from an input stream. - * - * @param inputStream XML data input stream. - * @return the XML handler object populated with data parsed from the XML stream. - * @throws SdkClientException - */ - public ListBucketHandler parseListBucketObjectsResponse( - InputStream inputStream, final boolean shouldSDKDecodeResponse) throws IOException { - ListBucketHandler handler = new ListBucketHandler(shouldSDKDecodeResponse); - parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream)); - - return handler; - } - - /** - * Parses a ListBucketV2 response XML document from an input stream. - * - * @param inputStream XML data input stream. - * @return the XML handler object populated with data parsed from the XML stream. - * @throws SdkClientException - */ - public ListObjectsV2Handler parseListObjectsV2Response( - InputStream inputStream, final boolean shouldSDKDecodeResponse) throws IOException { - ListObjectsV2Handler handler = new ListObjectsV2Handler(shouldSDKDecodeResponse); - parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream)); - - return handler; - } - - /** - * Parses a ListVersions response XML document from an input stream. - * - * @param inputStream XML data input stream. - * @return the XML handler object populated with data parsed from the XML stream. - * @throws SdkClientException - */ - public ListVersionsHandler parseListVersionsResponse( - InputStream inputStream, final boolean shouldSDKDecodeResponse) throws IOException { - ListVersionsHandler handler = new ListVersionsHandler(shouldSDKDecodeResponse); - parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream)); - return handler; - } - - /** - * Parses a ListAllMyBuckets response XML document from an input stream. - * - * @param inputStream XML data input stream. - * @return the XML handler object populated with data parsed from the XML stream. - * @throws SdkClientException - */ - public ListAllMyBucketsHandler parseListMyBucketsResponse(InputStream inputStream) - throws IOException { - ListAllMyBucketsHandler handler = new ListAllMyBucketsHandler(); - parseXmlInputStream(handler, sanitizeXmlDocument(handler, inputStream)); - return handler; - } - - /** - * Parses an AccessControlListHandler response XML document from an input stream. - * - * @param inputStream XML data input stream. - * @return the XML handler object populated with data parsed from the XML stream. - * @throws SdkClientException - */ - public AccessControlListHandler parseAccessControlListResponse(InputStream inputStream) - throws IOException { - AccessControlListHandler handler = new AccessControlListHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - /** - * Parses a LoggingStatus response XML document for a bucket from an input stream. - * - * @param inputStream XML data input stream. - * @return the XML handler object populated with data parsed from the XML stream. - * @throws SdkClientException - */ - public BucketLoggingConfigurationHandler parseLoggingStatusResponse(InputStream inputStream) - throws IOException { - BucketLoggingConfigurationHandler handler = new BucketLoggingConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public BucketLifecycleConfigurationHandler parseBucketLifecycleConfigurationResponse( - InputStream inputStream) throws IOException { - BucketLifecycleConfigurationHandler handler = new BucketLifecycleConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public BucketCrossOriginConfigurationHandler parseBucketCrossOriginConfigurationResponse( - InputStream inputStream) throws IOException { - BucketCrossOriginConfigurationHandler handler = new BucketCrossOriginConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public String parseBucketLocationResponse(InputStream inputStream) throws IOException { - BucketLocationHandler handler = new BucketLocationHandler(); - parseXmlInputStream(handler, inputStream); - return handler.getLocation(); - } - - public BucketVersioningConfigurationHandler parseVersioningConfigurationResponse( - InputStream inputStream) throws IOException { - BucketVersioningConfigurationHandler handler = new BucketVersioningConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public BucketWebsiteConfigurationHandler parseWebsiteConfigurationResponse( - InputStream inputStream) throws IOException { - BucketWebsiteConfigurationHandler handler = new BucketWebsiteConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public BucketReplicationConfigurationHandler parseReplicationConfigurationResponse( - InputStream inputStream) throws IOException { - BucketReplicationConfigurationHandler handler = new BucketReplicationConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public BucketTaggingConfigurationHandler parseTaggingConfigurationResponse( - InputStream inputStream) throws IOException { - BucketTaggingConfigurationHandler handler = new BucketTaggingConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public BucketAccelerateConfigurationHandler parseAccelerateConfigurationResponse( - InputStream inputStream) throws IOException { - BucketAccelerateConfigurationHandler handler = new BucketAccelerateConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public DeleteObjectsHandler parseDeletedObjectsResult(InputStream inputStream) - throws IOException { - DeleteObjectsHandler handler = new DeleteObjectsHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public CopyObjectResultHandler parseCopyObjectResponse(InputStream inputStream) - throws IOException { - CopyObjectResultHandler handler = new CopyObjectResultHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public CompleteMultipartUploadHandler parseCompleteMultipartUploadResponse( - InputStream inputStream) throws IOException { - CompleteMultipartUploadHandler handler = new CompleteMultipartUploadHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public InitiateMultipartUploadHandler parseInitiateMultipartUploadResponse( - InputStream inputStream) throws IOException { - InitiateMultipartUploadHandler handler = new InitiateMultipartUploadHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public ListMultipartUploadsHandler parseListMultipartUploadsResponse(InputStream inputStream) - throws IOException { - ListMultipartUploadsHandler handler = new ListMultipartUploadsHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public ListPartsHandler parseListPartsResponse(InputStream inputStream) throws IOException { - ListPartsHandler handler = new ListPartsHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public GetObjectTaggingHandler parseObjectTaggingResponse(InputStream inputStream) - throws IOException { - GetObjectTaggingHandler handler = new GetObjectTaggingHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public GetBucketMetricsConfigurationHandler parseGetBucketMetricsConfigurationResponse( - InputStream inputStream) throws IOException { - GetBucketMetricsConfigurationHandler handler = new GetBucketMetricsConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public ListBucketMetricsConfigurationsHandler parseListBucketMetricsConfigurationsResponse( - InputStream inputStream) throws IOException { - ListBucketMetricsConfigurationsHandler handler = - new ListBucketMetricsConfigurationsHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public GetBucketAnalyticsConfigurationHandler parseGetBucketAnalyticsConfigurationResponse( - InputStream inputStream) throws IOException { - GetBucketAnalyticsConfigurationHandler handler = - new GetBucketAnalyticsConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public ListBucketAnalyticsConfigurationHandler parseListBucketAnalyticsConfigurationResponse( - InputStream inputStream) throws IOException { - ListBucketAnalyticsConfigurationHandler handler = - new ListBucketAnalyticsConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public GetBucketInventoryConfigurationHandler parseGetBucketInventoryConfigurationResponse( - InputStream inputStream) throws IOException { - GetBucketInventoryConfigurationHandler handler = - new GetBucketInventoryConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - public ListBucketInventoryConfigurationsHandler parseBucketListInventoryConfigurationsResponse( - InputStream inputStream) throws IOException { - ListBucketInventoryConfigurationsHandler handler = - new ListBucketInventoryConfigurationsHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - /** - * @param inputStream - * @return true if the bucket's is configured as Requester Pays, false if it is configured as - * Owner pays. - * @throws SdkClientException - */ - public RequestPaymentConfigurationHandler parseRequestPaymentConfigurationResponse( - InputStream inputStream) throws IOException { - RequestPaymentConfigurationHandler handler = new RequestPaymentConfigurationHandler(); - parseXmlInputStream(handler, inputStream); - return handler; - } - - // //////////// - // Handlers // - // //////////// - - /** Handler for ListBucket response XML documents. */ - public static class ListBucketHandler extends AbstractHandler { - private final ObjectListing objectListing = new ObjectListing(); - private final boolean shouldSDKDecodeResponse; - - private S3ObjectSummary currentObject = null; - private Owner currentOwner = null; - private String lastKey = null; - - public ListBucketHandler(final boolean shouldSDKDecodeResponse) { - this.shouldSDKDecodeResponse = shouldSDKDecodeResponse; - } - - public ObjectListing getObjectListing() { - return objectListing; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("ListBucketResult")) { - if (name.equals("Contents")) { - currentObject = new S3ObjectSummary(); - currentObject.setBucketName(objectListing.getBucketName()); - } - } else if (in("ListBucketResult", "Contents")) { - if (name.equals("Owner")) { - currentOwner = new Owner(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (atTopLevel()) { - if (name.equals("ListBucketResult")) { - /* - * S3 only includes the NextMarker XML element if the - * request specified a delimiter, but for consistency we'd - * like to always give easy access to the next marker if - * we're returning a list of results that's truncated. - */ - if (objectListing.isTruncated() && objectListing.getNextMarker() == null) { - - String nextMarker = null; - if (!objectListing.getObjectSummaries().isEmpty()) { - nextMarker = - objectListing - .getObjectSummaries() - .get(objectListing.getObjectSummaries().size() - 1) - .getKey(); - - } else if (!objectListing.getCommonPrefixes().isEmpty()) { - nextMarker = - objectListing - .getCommonPrefixes() - .get(objectListing.getCommonPrefixes().size() - 1); - } else { - log.error( - "S3 response indicates truncated results, " - + "but contains no object summaries or " - + "common prefixes."); - } - - objectListing.setNextMarker(nextMarker); - } - } - } else if (in("ListBucketResult")) { - if (name.equals("Name")) { - objectListing.setBucketName(getText()); - if (log.isDebugEnabled()) { - log.debug("Examining listing for bucket: " + objectListing.getBucketName()); - } - - } else if (name.equals("Prefix")) { - objectListing.setPrefix( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("Marker")) { - objectListing.setMarker( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("NextMarker")) { - objectListing.setNextMarker( - decodeIfSpecified(getText(), shouldSDKDecodeResponse)); - - } else if (name.equals("MaxKeys")) { - objectListing.setMaxKeys(parseInt(getText())); - - } else if (name.equals("Delimiter")) { - objectListing.setDelimiter( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("EncodingType")) { - objectListing.setEncodingType( - shouldSDKDecodeResponse ? null : checkForEmptyString(getText())); - } else if (name.equals("IsTruncated")) { - String isTruncatedStr = StringUtils.lowerCase(getText()); - - if (isTruncatedStr.startsWith("false")) { - objectListing.setTruncated(false); - } else if (isTruncatedStr.startsWith("true")) { - objectListing.setTruncated(true); - } else { - throw new IllegalStateException( - "Invalid value for IsTruncated field: " + isTruncatedStr); - } - - } else if (name.equals("Contents")) { - objectListing.getObjectSummaries().add(currentObject); - currentObject = null; - } - } else if (in("ListBucketResult", "Contents")) { - if (name.equals("Key")) { - lastKey = getText(); - currentObject.setKey(decodeIfSpecified(lastKey, shouldSDKDecodeResponse)); - } else if (name.equals("LastModified")) { - currentObject.setLastModified(ServiceUtils.parseIso8601Date(getText())); - - } else if (name.equals("ETag")) { - currentObject.setETag(ServiceUtils.removeQuotes(getText())); - - } else if (name.equals("Size")) { - currentObject.setSize(parseLong(getText())); - - } else if (name.equals("StorageClass")) { - currentObject.setStorageClass(getText()); - - } else if (name.equals("Owner")) { - currentObject.setOwner(currentOwner); - currentOwner = null; - } - } else if (in("ListBucketResult", "Contents", "Owner")) { - if (name.equals("ID")) { - currentOwner.setId(getText()); - - } else if (name.equals("DisplayName")) { - currentOwner.setDisplayName(getText()); - } - } else if (in("ListBucketResult", "CommonPrefixes")) { - if (name.equals("Prefix")) { - objectListing - .getCommonPrefixes() - .add(decodeIfSpecified(getText(), shouldSDKDecodeResponse)); - } - } - } - } - - /** Handler for ListObjectsV2 response XML documents. */ - public static class ListObjectsV2Handler extends AbstractHandler { - private final ListObjectsV2Result result = new ListObjectsV2Result(); - private final boolean shouldSDKDecodeResponse; - - private S3ObjectSummary currentObject = null; - private Owner currentOwner = null; - private String lastKey = null; - - public ListObjectsV2Handler(final boolean shouldSDKDecodeResponse) { - this.shouldSDKDecodeResponse = shouldSDKDecodeResponse; - } - - public ListObjectsV2Result getResult() { - return result; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("ListBucketResult")) { - if (name.equals("Contents")) { - currentObject = new S3ObjectSummary(); - currentObject.setBucketName(result.getBucketName()); - } - } else if (in("ListBucketResult", "Contents")) { - if (name.equals("Owner")) { - currentOwner = new Owner(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (atTopLevel()) { - if (name.equals("ListBucketResult")) { - /* - * S3 only includes the NextContinuationToken XML element if the - * request specified a delimiter, but for consistency we'd - * like to always give easy access to the next token if - * we're returning a list of results that's truncated. - */ - if (result.isTruncated() && result.getNextContinuationToken() == null) { - - String nextContinuationToken = null; - if (!result.getObjectSummaries().isEmpty()) { - nextContinuationToken = - result.getObjectSummaries() - .get(result.getObjectSummaries().size() - 1) - .getKey(); - - } else { - log.error( - "S3 response indicates truncated results, " - + "but contains no object summaries."); - } - - result.setNextContinuationToken(nextContinuationToken); - } - } - } else if (in("ListBucketResult")) { - if (name.equals("Name")) { - result.setBucketName(getText()); - if (log.isDebugEnabled()) { - log.debug("Examining listing for bucket: " + result.getBucketName()); - } - - } else if (name.equals("Prefix")) { - result.setPrefix( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("MaxKeys")) { - result.setMaxKeys(parseInt(getText())); - - } else if (name.equals("NextContinuationToken")) { - result.setNextContinuationToken(getText()); - - } else if (name.equals("ContinuationToken")) { - result.setContinuationToken(getText()); - - } else if (name.equals("StartAfter")) { - result.setStartAfter(decodeIfSpecified(getText(), shouldSDKDecodeResponse)); - - } else if (name.equals("KeyCount")) { - result.setKeyCount(parseInt(getText())); - - } else if (name.equals("Delimiter")) { - result.setDelimiter( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("EncodingType")) { - result.setEncodingType(checkForEmptyString(getText())); - } else if (name.equals("IsTruncated")) { - String isTruncatedStr = StringUtils.lowerCase(getText()); - - if (isTruncatedStr.startsWith("false")) { - result.setTruncated(false); - } else if (isTruncatedStr.startsWith("true")) { - result.setTruncated(true); - } else { - throw new IllegalStateException( - "Invalid value for IsTruncated field: " + isTruncatedStr); - } - - } else if (name.equals("Contents")) { - result.getObjectSummaries().add(currentObject); - currentObject = null; - } - } else if (in("ListBucketResult", "Contents")) { - if (name.equals("Key")) { - lastKey = getText(); - currentObject.setKey(decodeIfSpecified(lastKey, shouldSDKDecodeResponse)); - } else if (name.equals("LastModified")) { - currentObject.setLastModified(ServiceUtils.parseIso8601Date(getText())); - - } else if (name.equals("ETag")) { - currentObject.setETag(ServiceUtils.removeQuotes(getText())); - - } else if (name.equals("Size")) { - currentObject.setSize(parseLong(getText())); - - } else if (name.equals("StorageClass")) { - currentObject.setStorageClass(getText()); - - } else if (name.equals("Owner")) { - currentObject.setOwner(currentOwner); - currentOwner = null; - } - } else if (in("ListBucketResult", "Contents", "Owner")) { - if (name.equals("ID")) { - currentOwner.setId(getText()); - - } else if (name.equals("DisplayName")) { - currentOwner.setDisplayName(getText()); - } - } else if (in("ListBucketResult", "CommonPrefixes")) { - if (name.equals("Prefix")) { - result.getCommonPrefixes() - .add(decodeIfSpecified(getText(), shouldSDKDecodeResponse)); - } - } - } - } - - /** - * Handler for ListAllMyBuckets response XML documents. The document is parsed into {@link - * Bucket}s available via the {@link #getBuckets()} method. - */ - public static class ListAllMyBucketsHandler extends AbstractHandler { - - private final List buckets = new ArrayList(); - private Owner bucketsOwner = null; - - private Bucket currentBucket = null; - - /** - * @return the buckets listed in the document. - */ - public List getBuckets() { - return buckets; - } - - /** - * @return the owner of the buckets. - */ - public Owner getOwner() { - return bucketsOwner; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("ListAllMyBucketsResult")) { - if (name.equals("Owner")) { - bucketsOwner = new Owner(); - } - } else if (in("ListAllMyBucketsResult", "Buckets")) { - if (name.equals("Bucket")) { - currentBucket = new Bucket(); - currentBucket.setOwner(bucketsOwner); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("ListAllMyBucketsResult", "Owner")) { - if (name.equals("ID")) { - bucketsOwner.setId(getText()); - - } else if (name.equals("DisplayName")) { - bucketsOwner.setDisplayName(getText()); - } - } else if (in("ListAllMyBucketsResult", "Buckets")) { - if (name.equals("Bucket")) { - buckets.add(currentBucket); - currentBucket = null; - } - } else if (in("ListAllMyBucketsResult", "Buckets", "Bucket")) { - if (name.equals("Name")) { - currentBucket.setName(getText()); - - } else if (name.equals("CreationDate")) { - Date creationDate = DateUtils.parseISO8601Date(getText()); - currentBucket.setCreationDate(creationDate); - } - } - } - } - - /** - * Handler for AccessControlList response XML documents. The document is parsed into an {@link - * AccessControlList} object available via the {@link #getAccessControlList()} method. - */ - public static class AccessControlListHandler extends AbstractHandler { - - private final AccessControlList accessControlList = new AccessControlList(); - - private Grantee currentGrantee = null; - private Permission currentPermission = null; - - /** - * @return an object representing the ACL document. - */ - public AccessControlList getAccessControlList() { - return accessControlList; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("AccessControlPolicy")) { - if (name.equals("Owner")) { - accessControlList.setOwner(new Owner()); - } - } else if (in("AccessControlPolicy", "AccessControlList", "Grant")) { - if (name.equals("Grantee")) { - String type = XmlResponsesSaxParser.findAttributeValue("xsi:type", attrs); - - if ("AmazonCustomerByEmail".equals(type)) { - currentGrantee = new EmailAddressGrantee(null); - } else if ("CanonicalUser".equals(type)) { - currentGrantee = new CanonicalGrantee(null); - } else if ("Group".equals(type)) { - /* - * Nothing to do for GroupGrantees here since we - * can't construct an empty enum value early. - */ - } - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("AccessControlPolicy", "Owner")) { - if (name.equals("ID")) { - accessControlList.getOwner().setId(getText()); - } else if (name.equals("DisplayName")) { - accessControlList.getOwner().setDisplayName(getText()); - } - } else if (in("AccessControlPolicy", "AccessControlList")) { - if (name.equals("Grant")) { - accessControlList.grantPermission(currentGrantee, currentPermission); - - currentGrantee = null; - currentPermission = null; - } - } else if (in("AccessControlPolicy", "AccessControlList", "Grant")) { - if (name.equals("Permission")) { - currentPermission = Permission.parsePermission(getText()); - } - } else if (in("AccessControlPolicy", "AccessControlList", "Grant", "Grantee")) { - if (name.equals("ID")) { - currentGrantee.setIdentifier(getText()); - - } else if (name.equals("EmailAddress")) { - currentGrantee.setIdentifier(getText()); - - } else if (name.equals("URI")) { - /* - * Only GroupGrantees contain an URI element in them, and we - * can't construct currentGrantee during startElement for a - * GroupGrantee since it's an enum. - */ - currentGrantee = GroupGrantee.parseGroupGrantee(getText()); - - } else if (name.equals("DisplayName")) { - ((CanonicalGrantee) currentGrantee).setDisplayName(getText()); - } - } - } - } - - /** - * Handler for LoggingStatus response XML documents for a bucket. The document is parsed into an - * {@link BucketLoggingConfiguration} object available via the {@link - * #getBucketLoggingConfiguration()} method. - */ - public static class BucketLoggingConfigurationHandler extends AbstractHandler { - - private final BucketLoggingConfiguration bucketLoggingConfiguration = - new BucketLoggingConfiguration(); - - /** - * @return an object representing the bucket's LoggingStatus document. - */ - public BucketLoggingConfiguration getBucketLoggingConfiguration() { - return bucketLoggingConfiguration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) {} - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("BucketLoggingStatus", "LoggingEnabled")) { - if (name.equals("TargetBucket")) { - bucketLoggingConfiguration.setDestinationBucketName(getText()); - - } else if (name.equals("TargetPrefix")) { - bucketLoggingConfiguration.setLogFilePrefix(getText()); - } - } - } - } - - /** - * Handler for CreateBucketConfiguration response XML documents for a bucket. The document is - * parsed into a String representing the bucket's location, available via the {@link - * #getLocation()} method. - */ - public static class BucketLocationHandler extends AbstractHandler { - - private String location = null; - - /** - * @return the bucket's location. - */ - public String getLocation() { - return location; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) {} - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (atTopLevel()) { - if (name.equals("LocationConstraint")) { - String elementText = getText(); - if (elementText.length() == 0) { - location = null; - } else { - location = elementText; - } - } - } - } - } - - public static class CopyObjectResultHandler extends AbstractSSEHandler - implements ObjectExpirationResult, S3RequesterChargedResult, S3VersionResult { - - // Data items for successful copy - private final CopyObjectResult result = new CopyObjectResult(); - - // Data items for failed copy - private String errorCode = null; - private String errorMessage = null; - private String errorRequestId = null; - private String errorHostId = null; - private boolean receivedErrorResponse = false; - - @Override - protected ServerSideEncryptionResult sseResult() { - return result; - } - - public Date getLastModified() { - return result.getLastModifiedDate(); - } - - @Override - public String getVersionId() { - return result.getVersionId(); - } - - @Override - public void setVersionId(String versionId) { - result.setVersionId(versionId); - } - - @Override - public Date getExpirationTime() { - return result.getExpirationTime(); - } - - @Override - public void setExpirationTime(Date expirationTime) { - result.setExpirationTime(expirationTime); - } - - @Override - public String getExpirationTimeRuleId() { - return result.getExpirationTimeRuleId(); - } - - @Override - public void setExpirationTimeRuleId(String expirationTimeRuleId) { - result.setExpirationTimeRuleId(expirationTimeRuleId); - } - - public String getETag() { - return result.getETag(); - } - - public String getErrorCode() { - return errorCode; - } - - public String getErrorHostId() { - return errorHostId; - } - - public String getErrorMessage() { - return errorMessage; - } - - public String getErrorRequestId() { - return errorRequestId; - } - - public boolean isErrorResponse() { - return receivedErrorResponse; - } - - public boolean isRequesterCharged() { - return result.isRequesterCharged(); - } - - public void setRequesterCharged(boolean isRequesterCharged) { - result.setRequesterCharged(isRequesterCharged); - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (atTopLevel()) { - if (name.equals("CopyObjectResult") || name.equals("CopyPartResult")) { - receivedErrorResponse = false; - } else if (name.equals("Error")) { - receivedErrorResponse = true; - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("CopyObjectResult") || in("CopyPartResult")) { - if (name.equals("LastModified")) { - result.setLastModifiedDate(ServiceUtils.parseIso8601Date(getText())); - } else if (name.equals("ETag")) { - result.setETag(ServiceUtils.removeQuotes(getText())); - } - } else if (in("Error")) { - if (name.equals("Code")) { - errorCode = getText(); - } else if (name.equals("Message")) { - errorMessage = getText(); - } else if (name.equals("RequestId")) { - errorRequestId = getText(); - } else if (name.equals("HostId")) { - errorHostId = getText(); - } - } - } - } - - /** - * Handler for parsing RequestPaymentConfiguration XML response associated with an Amazon S3 - * bucket. The XML response is parsed into a RequestPaymentConfiguration object. - */ - public static class RequestPaymentConfigurationHandler extends AbstractHandler { - - private String payer = null; - - public RequestPaymentConfiguration getConfiguration() { - return new RequestPaymentConfiguration(Payer.valueOf(payer)); - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) {} - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("RequestPaymentConfiguration")) { - if (name.equals("Payer")) { - payer = getText(); - } - } - } - } - - /** Handler for ListVersionsResult XML document. */ - public static class ListVersionsHandler extends AbstractHandler { - - private final VersionListing versionListing = new VersionListing(); - private final boolean shouldSDKDecodeResponse; - - private S3VersionSummary currentVersionSummary; - private Owner currentOwner; - - public ListVersionsHandler(final boolean shouldSDKDecodeResponse) { - this.shouldSDKDecodeResponse = shouldSDKDecodeResponse; - } - - public VersionListing getListing() { - return versionListing; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("ListVersionsResult")) { - if (name.equals("Version")) { - currentVersionSummary = new S3VersionSummary(); - currentVersionSummary.setBucketName(versionListing.getBucketName()); - - } else if (name.equals("DeleteMarker")) { - currentVersionSummary = new S3VersionSummary(); - currentVersionSummary.setBucketName(versionListing.getBucketName()); - currentVersionSummary.setIsDeleteMarker(true); - } - } else if (in("ListVersionsResult", "Version") - || in("ListVersionsResult", "DeleteMarker")) { - if (name.equals("Owner")) { - currentOwner = new Owner(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - - if (in("ListVersionsResult")) { - if (name.equals("Name")) { - versionListing.setBucketName(getText()); - - } else if (name.equals("Prefix")) { - versionListing.setPrefix( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - } else if (name.equals("KeyMarker")) { - versionListing.setKeyMarker( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - } else if (name.equals("VersionIdMarker")) { - versionListing.setVersionIdMarker(checkForEmptyString(getText())); - - } else if (name.equals("MaxKeys")) { - versionListing.setMaxKeys(Integer.parseInt(getText())); - - } else if (name.equals("Delimiter")) { - versionListing.setDelimiter( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("EncodingType")) { - versionListing.setEncodingType( - shouldSDKDecodeResponse ? null : checkForEmptyString(getText())); - } else if (name.equals("NextKeyMarker")) { - versionListing.setNextKeyMarker( - decodeIfSpecified( - checkForEmptyString(getText()), shouldSDKDecodeResponse)); - - } else if (name.equals("NextVersionIdMarker")) { - versionListing.setNextVersionIdMarker(getText()); - - } else if (name.equals("IsTruncated")) { - versionListing.setTruncated("true".equals(getText())); - - } else if (name.equals("Version") || name.equals("DeleteMarker")) { - - versionListing.getVersionSummaries().add(currentVersionSummary); - - currentVersionSummary = null; - } - } else if (in("ListVersionsResult", "CommonPrefixes")) { - if (name.equals("Prefix")) { - final String commonPrefix = checkForEmptyString(getText()); - versionListing - .getCommonPrefixes() - .add( - shouldSDKDecodeResponse - ? SdkHttpUtils.urlDecode(commonPrefix) - : commonPrefix); - } - } else if (in("ListVersionsResult", "Version") - || in("ListVersionsResult", "DeleteMarker")) { - - if (name.equals("Key")) { - currentVersionSummary.setKey( - decodeIfSpecified(getText(), shouldSDKDecodeResponse)); - - } else if (name.equals("VersionId")) { - currentVersionSummary.setVersionId(getText()); - - } else if (name.equals("IsLatest")) { - currentVersionSummary.setIsLatest("true".equals(getText())); - - } else if (name.equals("LastModified")) { - currentVersionSummary.setLastModified(ServiceUtils.parseIso8601Date(getText())); - - } else if (name.equals("ETag")) { - currentVersionSummary.setETag(ServiceUtils.removeQuotes(getText())); - - } else if (name.equals("Size")) { - currentVersionSummary.setSize(Long.parseLong(getText())); - - } else if (name.equals("Owner")) { - currentVersionSummary.setOwner(currentOwner); - currentOwner = null; - - } else if (name.equals("StorageClass")) { - currentVersionSummary.setStorageClass(getText()); - } - } else if (in("ListVersionsResult", "Version", "Owner") - || in("ListVersionsResult", "DeleteMarker", "Owner")) { - - if (name.equals("ID")) { - currentOwner.setId(getText()); - } else if (name.equals("DisplayName")) { - currentOwner.setDisplayName(getText()); - } - } - } - } - - public static class BucketWebsiteConfigurationHandler extends AbstractHandler { - - private final BucketWebsiteConfiguration configuration = - new BucketWebsiteConfiguration(null); - - private RoutingRuleCondition currentCondition = null; - private RedirectRule currentRedirectRule = null; - private RoutingRule currentRoutingRule = null; - - public BucketWebsiteConfiguration getConfiguration() { - return configuration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("WebsiteConfiguration")) { - if (name.equals("RedirectAllRequestsTo")) { - currentRedirectRule = new RedirectRule(); - } - } else if (in("WebsiteConfiguration", "RoutingRules")) { - if (name.equals("RoutingRule")) { - currentRoutingRule = new RoutingRule(); - } - } else if (in("WebsiteConfiguration", "RoutingRules", "RoutingRule")) { - if (name.equals("Condition")) { - currentCondition = new RoutingRuleCondition(); - } else if (name.equals("Redirect")) { - currentRedirectRule = new RedirectRule(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("WebsiteConfiguration")) { - if (name.equals("RedirectAllRequestsTo")) { - configuration.setRedirectAllRequestsTo(currentRedirectRule); - currentRedirectRule = null; - } - } else if (in("WebsiteConfiguration", "IndexDocument")) { - if (name.equals("Suffix")) { - configuration.setIndexDocumentSuffix(getText()); - } - } else if (in("WebsiteConfiguration", "ErrorDocument")) { - if (name.equals("Key")) { - configuration.setErrorDocument(getText()); - } - } else if (in("WebsiteConfiguration", "RoutingRules")) { - if (name.equals("RoutingRule")) { - configuration.getRoutingRules().add(currentRoutingRule); - currentRoutingRule = null; - } - } else if (in("WebsiteConfiguration", "RoutingRules", "RoutingRule")) { - if (name.equals("Condition")) { - currentRoutingRule.setCondition(currentCondition); - currentCondition = null; - } else if (name.equals("Redirect")) { - currentRoutingRule.setRedirect(currentRedirectRule); - currentRedirectRule = null; - } - } else if (in("WebsiteConfiguration", "RoutingRules", "RoutingRule", "Condition")) { - if (name.equals("KeyPrefixEquals")) { - currentCondition.setKeyPrefixEquals(getText()); - } else if (name.equals("HttpErrorCodeReturnedEquals")) { - currentCondition.setHttpErrorCodeReturnedEquals(getText()); - } - } else if (in("WebsiteConfiguration", "RedirectAllRequestsTo") - || in("WebsiteConfiguration", "RoutingRules", "RoutingRule", "Redirect")) { - - if (name.equals("Protocol")) { - currentRedirectRule.setProtocol(getText()); - - } else if (name.equals("HostName")) { - currentRedirectRule.setHostName(getText()); - - } else if (name.equals("ReplaceKeyPrefixWith")) { - currentRedirectRule.setReplaceKeyPrefixWith(getText()); - - } else if (name.equals("ReplaceKeyWith")) { - currentRedirectRule.setReplaceKeyWith(getText()); - - } else if (name.equals("HttpRedirectCode")) { - currentRedirectRule.setHttpRedirectCode(getText()); - } - } - } - } - - public static class BucketVersioningConfigurationHandler extends AbstractHandler { - - private final BucketVersioningConfiguration configuration = - new BucketVersioningConfiguration(); - - public BucketVersioningConfiguration getConfiguration() { - return configuration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) {} - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("VersioningConfiguration")) { - if (name.equals("Status")) { - configuration.setStatus(getText()); - - } else if (name.equals("MfaDelete")) { - String mfaDeleteStatus = getText(); - - if (mfaDeleteStatus.equals("Disabled")) { - configuration.setMfaDeleteEnabled(false); - } else if (mfaDeleteStatus.equals("Enabled")) { - configuration.setMfaDeleteEnabled(true); - } else { - configuration.setMfaDeleteEnabled(null); - } - } - } - } - } - - public static class BucketAccelerateConfigurationHandler extends AbstractHandler { - - private final BucketAccelerateConfiguration configuration = - new BucketAccelerateConfiguration((String) null); - - public BucketAccelerateConfiguration getConfiguration() { - return configuration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) {} - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("AccelerateConfiguration")) { - if (name.equals("Status")) { - configuration.setStatus(getText()); - } - } - } - } - - /* - * - * - * http://Example-Bucket.s3.amazonaws.com/Example-Object - * Example-Bucket - * Example-Object - * "3858f62230ac3c915f300c664312c11f-9" - * - * - * Or if an error occurred while completing: - * - * - * - * InternalError - * We encountered an internal error. Please try again. - * 656c76696e6727732072657175657374 - * Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== - * - */ - public static class CompleteMultipartUploadHandler extends AbstractSSEHandler - implements ObjectExpirationResult, S3VersionResult, S3RequesterChargedResult { - // Successful completion - private CompleteMultipartUploadResult result; - - // Error during completion - private AmazonS3Exception ase; - private String hostId; - private String requestId; - private String errorCode; - - @Override - protected ServerSideEncryptionResult sseResult() { - return result; - } - /** - * @see com.amazonaws.services.s3.model.CompleteMultipartUploadResult#getExpirationTime() - */ - @Override - public Date getExpirationTime() { - return result == null ? null : result.getExpirationTime(); - } - - /** - * @see - * com.amazonaws.services.s3.model.CompleteMultipartUploadResult#setExpirationTime(java.util.Date) - */ - @Override - public void setExpirationTime(Date expirationTime) { - if (result != null) { - result.setExpirationTime(expirationTime); - } - } - - /** - * @see - * com.amazonaws.services.s3.model.CompleteMultipartUploadResult#getExpirationTimeRuleId() - */ - @Override - public String getExpirationTimeRuleId() { - return result == null ? null : result.getExpirationTimeRuleId(); - } - - /** - * @see - * com.amazonaws.services.s3.model.CompleteMultipartUploadResult#setExpirationTimeRuleId(java.lang.String) - */ - @Override - public void setExpirationTimeRuleId(String expirationTimeRuleId) { - if (result != null) { - result.setExpirationTimeRuleId(expirationTimeRuleId); - } - } - - @Override - public void setVersionId(String versionId) { - if (result != null) { - result.setVersionId(versionId); - } - } - - @Override - public String getVersionId() { - return result == null ? null : result.getVersionId(); - } - - /** - * @see com.amazonaws.services.s3.model.CompleteMultipartUploadResult#isRequesterCharged() - */ - public boolean isRequesterCharged() { - return result == null ? false : result.isRequesterCharged(); - } - - /** - * @see - * com.amazonaws.services.s3.model.CompleteMultipartUploadResult#setRequesterCharged(boolean) - */ - public void setRequesterCharged(boolean isRequesterCharged) { - if (result != null) { - result.setRequesterCharged(isRequesterCharged); - } - } - - public CompleteMultipartUploadResult getCompleteMultipartUploadResult() { - return result; - } - - public AmazonS3Exception getAmazonS3Exception() { - return ase; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (atTopLevel()) { - if (name.equals("CompleteMultipartUploadResult")) { - result = new CompleteMultipartUploadResult(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (atTopLevel()) { - if (name.equals("Error")) { - if (ase != null) { - ase.setErrorCode(errorCode); - ase.setRequestId(requestId); - ase.setExtendedRequestId(hostId); - } - } - } else if (in("CompleteMultipartUploadResult")) { - if (name.equals("Location")) { - result.setLocation(getText()); - } else if (name.equals("Bucket")) { - result.setBucketName(getText()); - } else if (name.equals("Key")) { - result.setKey(getText()); - } else if (name.equals("ETag")) { - result.setETag(ServiceUtils.removeQuotes(getText())); - } - } else if (in("Error")) { - if (name.equals("Code")) { - errorCode = getText(); - } else if (name.equals("Message")) { - ase = new AmazonS3Exception(getText()); - } else if (name.equals("RequestId")) { - requestId = getText(); - } else if (name.equals("HostId")) { - hostId = getText(); - } - } - } - } - - /* - * - * - * example-bucket - * example-object - * VXBsb2FkIElEIGZvciA2aWWpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZA - * - */ - public static class InitiateMultipartUploadHandler extends AbstractHandler { - - private final InitiateMultipartUploadResult result = new InitiateMultipartUploadResult(); - - public InitiateMultipartUploadResult getInitiateMultipartUploadResult() { - return result; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) {} - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("InitiateMultipartUploadResult")) { - if (name.equals("Bucket")) { - result.setBucketName(getText()); - - } else if (name.equals("Key")) { - result.setKey(getText()); - - } else if (name.equals("UploadId")) { - result.setUploadId(getText()); - } - } - } - } - - /* - * HTTP/1.1 200 OK - * x-amz-id-2: Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== - * x-amz-request-id: 656c76696e6727732072657175657374 - * Date: Tue, 16 Feb 2010 20:34:56 GMT - * Content-Length: 1330 - * Connection: keep-alive - * Server: AmazonS3 - * - * - * - * bucket - * - * / - * - * - * my-movie.m2ts - * YW55IGlkZWEgd2h5IGVsdmluZydzIHVwbG9hZCBmYWlsZWQ - * 3 - * true - * - * my-divisor - * XMgbGlrZSBlbHZpbmcncyBub3QgaGF2aW5nIG11Y2ggbHVjaw - * - * b1d16700c70b0b05597d7acd6a3f92be - * delving - * - * STANDARD - * Tue, 26 Jan 2010 19:42:19 GMT - * - * - * my-movie.m2ts - * VXBsb2FkIElEIGZvciBlbHZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZA - * - * b1d16700c70b0b05597d7acd6a3f92be - * delving - * - * STANDARD - * Tue, 16 Feb 2010 20:34:56 GMT - * - * - * my-movie.m2ts - * YW55IGlkZWEgd2h5IGVsdmluZydzIHVwbG9hZCBmYWlsZWQ - * - * b1d16700c70b0b05597d7acd6a3f92be - * delving - * - * STANDARD - * Wed, 27 Jan 2010 03:02:01 GMT - * - * - * photos/ - * - * - * videos/ - * - * - */ - public static class ListMultipartUploadsHandler extends AbstractHandler { - - private final MultipartUploadListing result = new MultipartUploadListing(); - - private MultipartUpload currentMultipartUpload; - private Owner currentOwner; - - public MultipartUploadListing getListMultipartUploadsResult() { - return result; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("ListMultipartUploadsResult")) { - if (name.equals("Upload")) { - currentMultipartUpload = new MultipartUpload(); - } - } else if (in("ListMultipartUploadsResult", "Upload")) { - if (name.equals("Owner") || name.equals("Initiator")) { - currentOwner = new Owner(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("ListMultipartUploadsResult")) { - if (name.equals("Bucket")) { - result.setBucketName(getText()); - } else if (name.equals("KeyMarker")) { - result.setKeyMarker(checkForEmptyString(getText())); - } else if (name.equals("Delimiter")) { - result.setDelimiter(checkForEmptyString(getText())); - } else if (name.equals("Prefix")) { - result.setPrefix(checkForEmptyString(getText())); - } else if (name.equals("UploadIdMarker")) { - result.setUploadIdMarker(checkForEmptyString(getText())); - } else if (name.equals("NextKeyMarker")) { - result.setNextKeyMarker(checkForEmptyString(getText())); - } else if (name.equals("NextUploadIdMarker")) { - result.setNextUploadIdMarker(checkForEmptyString(getText())); - } else if (name.equals("MaxUploads")) { - result.setMaxUploads(Integer.parseInt(getText())); - } else if (name.equals("EncodingType")) { - result.setEncodingType(checkForEmptyString(getText())); - } else if (name.equals("IsTruncated")) { - result.setTruncated(Boolean.parseBoolean(getText())); - } else if (name.equals("Upload")) { - result.getMultipartUploads().add(currentMultipartUpload); - currentMultipartUpload = null; - } - } else if (in("ListMultipartUploadsResult", "CommonPrefixes")) { - if (name.equals("Prefix")) { - result.getCommonPrefixes().add(getText()); - } - } else if (in("ListMultipartUploadsResult", "Upload")) { - if (name.equals("Key")) { - currentMultipartUpload.setKey(getText()); - } else if (name.equals("UploadId")) { - currentMultipartUpload.setUploadId(getText()); - } else if (name.equals("Owner")) { - currentMultipartUpload.setOwner(currentOwner); - currentOwner = null; - } else if (name.equals("Initiator")) { - currentMultipartUpload.setInitiator(currentOwner); - currentOwner = null; - } else if (name.equals("StorageClass")) { - currentMultipartUpload.setStorageClass(getText()); - } else if (name.equals("Initiated")) { - currentMultipartUpload.setInitiated(ServiceUtils.parseIso8601Date(getText())); - } - } else if (in("ListMultipartUploadsResult", "Upload", "Owner") - || in("ListMultipartUploadsResult", "Upload", "Initiator")) { - - if (name.equals("ID")) { - currentOwner.setId(checkForEmptyString(getText())); - } else if (name.equals("DisplayName")) { - currentOwner.setDisplayName(checkForEmptyString(getText())); - } - } - } - } - - /* - * HTTP/1.1 200 OK - * x-amz-id-2: Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== - * x-amz-request-id: 656c76696e6727732072657175657374 - * Date: Tue, 16 Feb 2010 20:34:56 GMT - * Content-Length: 985 - * Connection: keep-alive - * Server: AmazonS3 - * - * - * - * example-bucket - * example-object - * XXBsb2FkIElEIGZvciBlbHZpbmcncyVcdS1tb3ZpZS5tMnRzEEEwbG9hZA - * - * x1x16700c70b0b05597d7ecd6a3f92be - * username - * - * - * x1x16700c70b0b05597d7ecd6a3f92be - * username - * - * STANDARD - * 1 - * 3 - * 2 - * true - * - * 2 - * Wed, 27 Jan 2010 03:02:03 GMT - * "7778aef83f66abc1fa1e8477f296d394" - * 10485760 - * - * - * 3 - * Wed, 27 Jan 2010 03:02:02 GMT - * "aaaa18db4cc2f85cedef654fccc4a4x8" - * 10485760 - * - * - */ - public static class ListPartsHandler extends AbstractHandler { - - private final PartListing result = new PartListing(); - - private PartSummary currentPart; - private Owner currentOwner; - - public PartListing getListPartsResult() { - return result; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("ListPartsResult")) { - if (name.equals("Part")) { - currentPart = new PartSummary(); - } else if (name.equals("Owner") || name.equals("Initiator")) { - currentOwner = new Owner(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("ListPartsResult")) { - if (name.equals("Bucket")) { - result.setBucketName(getText()); - } else if (name.equals("Key")) { - result.setKey(getText()); - } else if (name.equals("UploadId")) { - result.setUploadId(getText()); - } else if (name.equals("Owner")) { - result.setOwner(currentOwner); - currentOwner = null; - } else if (name.equals("Initiator")) { - result.setInitiator(currentOwner); - currentOwner = null; - } else if (name.equals("StorageClass")) { - result.setStorageClass(getText()); - } else if (name.equals("PartNumberMarker")) { - result.setPartNumberMarker(parseInteger(getText())); - } else if (name.equals("NextPartNumberMarker")) { - result.setNextPartNumberMarker(parseInteger(getText())); - } else if (name.equals("MaxParts")) { - result.setMaxParts(parseInteger(getText())); - } else if (name.equals("EncodingType")) { - result.setEncodingType(checkForEmptyString(getText())); - } else if (name.equals("IsTruncated")) { - result.setTruncated(Boolean.parseBoolean(getText())); - } else if (name.equals("Part")) { - result.getParts().add(currentPart); - currentPart = null; - } - } else if (in("ListPartsResult", "Part")) { - if (name.equals("PartNumber")) { - currentPart.setPartNumber(Integer.parseInt(getText())); - } else if (name.equals("LastModified")) { - currentPart.setLastModified(ServiceUtils.parseIso8601Date(getText())); - } else if (name.equals("ETag")) { - currentPart.setETag(ServiceUtils.removeQuotes(getText())); - } else if (name.equals("Size")) { - currentPart.setSize(Long.parseLong(getText())); - } - } else if (in("ListPartsResult", "Owner") || in("ListPartsResult", "Initiator")) { - - if (name.equals("ID")) { - currentOwner.setId(checkForEmptyString(getText())); - } else if (name.equals("DisplayName")) { - currentOwner.setDisplayName(checkForEmptyString(getText())); - } - } - } - - private Integer parseInteger(String text) { - text = checkForEmptyString(getText()); - if (text == null) return null; - return Integer.parseInt(text); - } - } - - /** - * Handler for parsing the get replication configuration response from Amazon S3. Sample HTTP - * response is given below. - * - *

-     * 
-     *  
-     *      replication-rule-1-1421862858808
-     *      testPrefix1
-     *      Enabled
-     *      
-     *          bucketARN
-     *      
-     * 
-     * 
-     *      replication-rule-2-1421862858808
-     *      testPrefix2
-     *      Disabled
-     *      
-     *          arn:aws:s3:::bucket-dest-replication-integ-test-1421862858808
-     *      
-     * 
-     * 
-     * 
- */ - public static class BucketReplicationConfigurationHandler extends AbstractHandler { - - private final BucketReplicationConfiguration bucketReplicationConfiguration = - new BucketReplicationConfiguration(); - private String currentRuleId; - private ReplicationRule currentRule; - private ReplicationDestinationConfig destinationConfig; - private AccessControlTranslation accessControlTranslation; - private EncryptionConfiguration encryptionConfiguration; - private SourceSelectionCriteria sourceSelectionCriteria; - private SseKmsEncryptedObjects sseKmsEncryptedObjects; - private static final String REPLICATION_CONFIG = "ReplicationConfiguration"; - private static final String ROLE = "Role"; - private static final String RULE = "Rule"; - private static final String DESTINATION = "Destination"; - private static final String ID = "ID"; - private static final String PREFIX = "Prefix"; - private static final String STATUS = "Status"; - private static final String BUCKET = "Bucket"; - private static final String STORAGECLASS = "StorageClass"; - private static final String ACCOUNT = "Account"; - private static final String ACCESS_CONTROL_TRANSLATION = "AccessControlTranslation"; - private static final String OWNER = "Owner"; - private static final String ENCRYPTION_CONFIGURATION = "EncryptionConfiguration"; - private static final String REPLICA_KMS_KEY_ID = "ReplicaKmsKeyID"; - private static final String SOURCE_SELECTION_CRITERIA = "SourceSelectionCriteria"; - private static final String SSE_KMS_ENCRYPTED_OBJECTS = "SseKmsEncryptedObjects"; - - public BucketReplicationConfiguration getConfiguration() { - return bucketReplicationConfiguration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in(REPLICATION_CONFIG)) { - if (name.equals(RULE)) { - currentRule = new ReplicationRule(); - } - } else if (in(REPLICATION_CONFIG, RULE)) { - if (name.equals(DESTINATION)) { - destinationConfig = new ReplicationDestinationConfig(); - } else if (name.equals(SOURCE_SELECTION_CRITERIA)) { - sourceSelectionCriteria = new SourceSelectionCriteria(); - } - } else if (in(REPLICATION_CONFIG, RULE, DESTINATION)) { - if (name.equals(ACCESS_CONTROL_TRANSLATION)) { - accessControlTranslation = new AccessControlTranslation(); - } else if (name.equals(ENCRYPTION_CONFIGURATION)) { - encryptionConfiguration = new EncryptionConfiguration(); - } - } else if (in(REPLICATION_CONFIG, RULE, SOURCE_SELECTION_CRITERIA)) { - if (name.equals(SSE_KMS_ENCRYPTED_OBJECTS)) { - sseKmsEncryptedObjects = new SseKmsEncryptedObjects(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in(REPLICATION_CONFIG)) { - if (name.equals(RULE)) { - bucketReplicationConfiguration.addRule(currentRuleId, currentRule); - currentRule = null; - currentRuleId = null; - destinationConfig = null; - sseKmsEncryptedObjects = null; - accessControlTranslation = null; - encryptionConfiguration = null; - } else if (name.equals(ROLE)) { - bucketReplicationConfiguration.setRoleARN(getText()); - } - } else if (in(REPLICATION_CONFIG, RULE)) { - if (name.equals(ID)) { - currentRuleId = getText(); - } else if (name.equals(PREFIX)) { - currentRule.setPrefix(getText()); - } else if (name.equals(SOURCE_SELECTION_CRITERIA)) { - currentRule.setSourceSelectionCriteria(sourceSelectionCriteria); - } else { - if (name.equals(STATUS)) { - currentRule.setStatus(getText()); - - } else if (name.equals(DESTINATION)) { - currentRule.setDestinationConfig(destinationConfig); - } - } - } else if (in(REPLICATION_CONFIG, RULE, SOURCE_SELECTION_CRITERIA)) { - if (name.equals(SSE_KMS_ENCRYPTED_OBJECTS)) { - sourceSelectionCriteria.setSseKmsEncryptedObjects(sseKmsEncryptedObjects); - } - } else if (in( - REPLICATION_CONFIG, - RULE, - SOURCE_SELECTION_CRITERIA, - SSE_KMS_ENCRYPTED_OBJECTS)) { - if (name.equals(STATUS)) { - sseKmsEncryptedObjects.setStatus(getText()); - } - } else if (in(REPLICATION_CONFIG, RULE, DESTINATION)) { - if (name.equals(BUCKET)) { - destinationConfig.setBucketARN(getText()); - } else if (name.equals(STORAGECLASS)) { - destinationConfig.setStorageClass(getText()); - } else if (name.equals(ACCOUNT)) { - destinationConfig.setAccount(getText()); - } else if (name.equals(ACCESS_CONTROL_TRANSLATION)) { - destinationConfig.setAccessControlTranslation(accessControlTranslation); - } else if (name.equals(ENCRYPTION_CONFIGURATION)) { - destinationConfig.setEncryptionConfiguration(encryptionConfiguration); - } - } else if (in(REPLICATION_CONFIG, RULE, DESTINATION, ACCESS_CONTROL_TRANSLATION)) { - if (name.equals(OWNER)) { - accessControlTranslation.setOwner(getText()); - } - } else if (in(REPLICATION_CONFIG, RULE, DESTINATION, ENCRYPTION_CONFIGURATION)) { - if (name.equals(REPLICA_KMS_KEY_ID)) { - encryptionConfiguration.setReplicaKmsKeyID(getText()); - } - } - } - } - - public static class BucketTaggingConfigurationHandler extends AbstractHandler { - - private final BucketTaggingConfiguration configuration = new BucketTaggingConfiguration(); - - private Map currentTagSet; - private String currentTagKey; - private String currentTagValue; - - public BucketTaggingConfiguration getConfiguration() { - return configuration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("Tagging")) { - if (name.equals("TagSet")) { - currentTagSet = new HashMap(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("Tagging")) { - if (name.equals("TagSet")) { - configuration.getAllTagSets().add(new TagSet(currentTagSet)); - currentTagSet = null; - } - } else if (in("Tagging", "TagSet")) { - if (name.equals("Tag")) { - if (currentTagKey != null && currentTagValue != null) { - currentTagSet.put(currentTagKey, currentTagValue); - } - currentTagKey = null; - currentTagValue = null; - } - } else if (in("Tagging", "TagSet", "Tag")) { - if (name.equals("Key")) { - currentTagKey = getText(); - } else if (name.equals("Value")) { - currentTagValue = getText(); - } - } - } - } - - /** - * Handler for unmarshalling the response from GET Object Tagging. - * - *

Foo 1 Bar - * 2 Baz 3 - */ - public static class GetObjectTaggingHandler extends AbstractHandler { - private GetObjectTaggingResult getObjectTaggingResult; - private List tagSet; - private String currentTagValue; - private String currentTagKey; - - public GetObjectTaggingResult getResult() { - return getObjectTaggingResult; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - if (in("Tagging")) { - if (name.equals("TagSet")) { - tagSet = new ArrayList(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("Tagging")) { - if (name.equals("TagSet")) { - getObjectTaggingResult = new GetObjectTaggingResult(tagSet); - tagSet = null; - } - } - if (in("Tagging", "TagSet")) { - if (name.equals("Tag")) { - tagSet.add(new Tag(currentTagKey, currentTagValue)); - currentTagKey = null; - currentTagValue = null; - } - } else if (in("Tagging", "TagSet", "Tag")) { - if (name.equals("Key")) { - currentTagKey = getText(); - } else if (name.equals("Value")) { - currentTagValue = getText(); - } - } - } - } - - /* - HTTP/1.1 200 OK - x-amz-id-2: Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== - x-amz-request-id: 656c76696e6727732072657175657374 - Date: Tue, 20 Sep 2012 20:34:56 GMT - Content-Type: application/xml - Transfer-Encoding: chunked - Connection: keep-alive - Server: AmazonS3 - - - - - Key - Version - - - Key - Version - Code - Message - - - Key - true - Version - - - */ - public static class DeleteObjectsHandler extends AbstractHandler { - - private final DeleteObjectsResponse response = new DeleteObjectsResponse(); - - private DeletedObject currentDeletedObject = null; - private DeleteError currentError = null; - - public DeleteObjectsResponse getDeleteObjectResult() { - return response; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("DeleteResult")) { - if (name.equals("Deleted")) { - currentDeletedObject = new DeletedObject(); - } else if (name.equals("Error")) { - currentError = new DeleteError(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("DeleteResult")) { - if (name.equals("Deleted")) { - response.getDeletedObjects().add(currentDeletedObject); - currentDeletedObject = null; - } else if (name.equals("Error")) { - response.getErrors().add(currentError); - currentError = null; - } - } else if (in("DeleteResult", "Deleted")) { - if (name.equals("Key")) { - currentDeletedObject.setKey(getText()); - - } else if (name.equals("VersionId")) { - currentDeletedObject.setVersionId(getText()); - - } else if (name.equals("DeleteMarker")) { - currentDeletedObject.setDeleteMarker(getText().equals("true")); - - } else if (name.equals("DeleteMarkerVersionId")) { - currentDeletedObject.setDeleteMarkerVersionId(getText()); - } - } else if (in("DeleteResult", "Error")) { - if (name.equals("Key")) { - currentError.setKey(getText()); - - } else if (name.equals("VersionId")) { - currentError.setVersionId(getText()); - - } else if (name.equals("Code")) { - currentError.setCode(getText()); - - } else if (name.equals("Message")) { - currentError.setMessage(getText()); - } - } - } - } - - /** - * HTTP/1.1 200 OK x-amz-id-2: Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== - * x-amz-request-id: 656c76696e6727732072657175657374 Date: Tue, 20 Sep 2012 20:34:56 GMT - * Content-Length: xxx Connection: keep-alive Server: AmazonS3 - * - *

logs-rule logs/ - * Enabled logs/ key1 - * value1 logs/ key1 - * value1 key1 value1 - * 30 STANDARD_IA - * 90 GLACIER - * 365 - * 7 STANDARD_IA - * - * 14 GLACIER - * - * 365 - * image-rule image/ Enabled - * 2012-12-31T00:00:00.000Z GLACIER - * 2020-12-31T00:00:00.000Z - * 10 - * - */ - public static class BucketLifecycleConfigurationHandler extends AbstractHandler { - - private final BucketLifecycleConfiguration configuration = - new BucketLifecycleConfiguration(new ArrayList()); - - private Rule currentRule; - private Transition currentTransition; - private NoncurrentVersionTransition currentNcvTransition; - private AbortIncompleteMultipartUpload abortIncompleteMultipartUpload; - private LifecycleFilter currentFilter; - private List andOperandsList; - private String currentTagKey; - private String currentTagValue; - - public BucketLifecycleConfiguration getConfiguration() { - return configuration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("LifecycleConfiguration")) { - if (name.equals("Rule")) { - currentRule = new Rule(); - } - } else if (in("LifecycleConfiguration", "Rule")) { - if (name.equals("Transition")) { - currentTransition = new Transition(); - } else if (name.equals("NoncurrentVersionTransition")) { - currentNcvTransition = new NoncurrentVersionTransition(); - } else if (name.equals("AbortIncompleteMultipartUpload")) { - abortIncompleteMultipartUpload = new AbortIncompleteMultipartUpload(); - } else if (name.equals("Filter")) { - currentFilter = new LifecycleFilter(); - } - } else if (in("LifecycleConfiguration", "Rule", "Filter")) { - if (name.equals("And")) { - andOperandsList = new ArrayList(); - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("LifecycleConfiguration")) { - if (name.equals("Rule")) { - configuration.getRules().add(currentRule); - currentRule = null; - } - } else if (in("LifecycleConfiguration", "Rule")) { - if (name.equals("ID")) { - currentRule.setId(getText()); - - } else if (name.equals("Prefix")) { - currentRule.setPrefix(getText()); - - } else if (name.equals("Status")) { - currentRule.setStatus(getText()); - - } else if (name.equals("Transition")) { - currentRule.addTransition(currentTransition); - currentTransition = null; - - } else if (name.equals("NoncurrentVersionTransition")) { - currentRule.addNoncurrentVersionTransition(currentNcvTransition); - currentNcvTransition = null; - } else if (name.equals("AbortIncompleteMultipartUpload")) { - currentRule.setAbortIncompleteMultipartUpload(abortIncompleteMultipartUpload); - abortIncompleteMultipartUpload = null; - } else if (name.equals("Filter")) { - currentRule.setFilter(currentFilter); - currentFilter = null; - } - } else if (in("LifecycleConfiguration", "Rule", "Expiration")) { - if (name.equals("Date")) { - currentRule.setExpirationDate(ServiceUtils.parseIso8601Date(getText())); - } else if (name.equals("Days")) { - currentRule.setExpirationInDays(Integer.parseInt(getText())); - } else if (name.equals("ExpiredObjectDeleteMarker")) { - if ("true".equals(getText())) { - currentRule.setExpiredObjectDeleteMarker(true); - } - } - } else if (in("LifecycleConfiguration", "Rule", "Transition")) { - if (name.equals("StorageClass")) { - currentTransition.setStorageClass(getText()); - } else if (name.equals("Date")) { - currentTransition.setDate(ServiceUtils.parseIso8601Date(getText())); - - } else if (name.equals("Days")) { - currentTransition.setDays(Integer.parseInt(getText())); - } - } else if (in("LifecycleConfiguration", "Rule", "NoncurrentVersionExpiration")) { - if (name.equals("NoncurrentDays")) { - currentRule.setNoncurrentVersionExpirationInDays(Integer.parseInt(getText())); - } - } else if (in("LifecycleConfiguration", "Rule", "NoncurrentVersionTransition")) { - if (name.equals("StorageClass")) { - currentNcvTransition.setStorageClass(getText()); - } else if (name.equals("NoncurrentDays")) { - currentNcvTransition.setDays(Integer.parseInt(getText())); - } - } else if (in("LifecycleConfiguration", "Rule", "AbortIncompleteMultipartUpload")) { - if (name.equals("DaysAfterInitiation")) { - abortIncompleteMultipartUpload.setDaysAfterInitiation( - Integer.parseInt(getText())); - } - } else if (in("LifecycleConfiguration", "Rule", "Filter")) { - if (name.equals("Prefix")) { - currentFilter.setPredicate(new LifecyclePrefixPredicate(getText())); - } else if (name.equals("Tag")) { - currentFilter.setPredicate( - new LifecycleTagPredicate(new Tag(currentTagKey, currentTagValue))); - currentTagKey = null; - currentTagValue = null; - } else if (name.equals("And")) { - currentFilter.setPredicate(new LifecycleAndOperator(andOperandsList)); - andOperandsList = null; - } - } else if (in("LifecycleConfiguration", "Rule", "Filter", "Tag")) { - if (name.equals("Key")) { - currentTagKey = getText(); - } else if (name.equals("Value")) { - currentTagValue = getText(); - } - } else if (in("LifecycleConfiguration", "Rule", "Filter", "And")) { - if (name.equals("Prefix")) { - andOperandsList.add(new LifecyclePrefixPredicate(getText())); - } else if (name.equals("Tag")) { - andOperandsList.add( - new LifecycleTagPredicate(new Tag(currentTagKey, currentTagValue))); - currentTagKey = null; - currentTagValue = null; - } - } else if (in("LifecycleConfiguration", "Rule", "Filter", "And", "Tag")) { - if (name.equals("Key")) { - currentTagKey = getText(); - } else if (name.equals("Value")) { - currentTagValue = getText(); - } - } - } - } - - /* - HTTP/1.1 200 OK - x-amz-id-2: Uuag1LuByRx9e6j5Onimru9pO4ZVKnJ2Qz7/C1NPcfTWAtRPfTaOFg== - x-amz-request-id: 656c76696e6727732072657175657374 - Date: Tue, 20 Sep 2011 20:34:56 GMT - Content-Length: Some Length - Connection: keep-alive - Server: AmazonS3 - - - http://www.foobar.com - GET - 3000 - x-amz-server-side-encryption - - - */ - public static class BucketCrossOriginConfigurationHandler extends AbstractHandler { - - private final BucketCrossOriginConfiguration configuration = - new BucketCrossOriginConfiguration(new ArrayList()); - - private CORSRule currentRule; - private List allowedMethods = null; - private List allowedOrigins = null; - private List exposedHeaders = null; - private List allowedHeaders = null; - - public BucketCrossOriginConfiguration getConfiguration() { - return configuration; - } - - @Override - protected void doStartElement(String uri, String name, String qName, Attributes attrs) { - - if (in("CORSConfiguration")) { - if (name.equals("CORSRule")) { - currentRule = new CORSRule(); - } - } else if (in("CORSConfiguration", "CORSRule")) { - if (name.equals("AllowedOrigin")) { - if (allowedOrigins == null) { - allowedOrigins = new ArrayList(); - } - } else if (name.equals("AllowedMethod")) { - if (allowedMethods == null) { - allowedMethods = new ArrayList(); - } - } else if (name.equals("ExposeHeader")) { - if (exposedHeaders == null) { - exposedHeaders = new ArrayList(); - } - } else if (name.equals("AllowedHeader")) { - if (allowedHeaders == null) { - allowedHeaders = new LinkedList(); - } - } - } - } - - @Override - protected void doEndElement(String uri, String name, String qName) { - if (in("CORSConfiguration")) { - if (name.equals("CORSRule")) { - currentRule.setAllowedHeaders(allowedHeaders); - currentRule.setAllowedMethods(allowedMethods); - currentRule.setAllowedOrigins(allowedOrigins); - currentRule.setExposedHeaders(exposedHeaders); - allowedHeaders = null; - allowedMethods = null; - allowedOrigins = null; - exposedHeaders = null; - - configuration.getRules().add(currentRule); - currentRule = null; - } - } else if (in("CORSConfiguration", "CORSRule")) { - if (name.equals("ID")) { - currentRule.setId(getText()); - - } else if (name.equals("AllowedOrigin")) { - allowedOrigins.add(getText()); - - } else if (name.equals("AllowedMethod")) { - allowedMethods.add(AllowedMethods.fromValue(getText())); - - } else if (name.equals("MaxAgeSeconds")) { - currentRule.setMaxAgeSeconds(Integer.parseInt(getText())); - - } else if (name.equals("ExposeHeader")) { - exposedHeaders.add(getText()); - - } else if (name.equals("AllowedHeader")) { - allowedHeaders.add(getText()); - } - } - } - } - - /* - HTTP/1.1 200 OK - x-amz-id-2: ITnGT1y4RyTmXa3rPi4hklTXouTf0hccUjo0iCPjz6FnfIutBj3M7fPGlWO2SEWp - x-amz-request-id: 51991C342C575321 - Date: Wed, 14 May 2014 02:11:22 GMT - Server: AmazonS3 - Content-Length: ... - - - - metrics-id - - - diff --git a/website/docs/maintenance/tiered-storage/filesystems/hdfs.md b/website/docs/maintenance/tiered-storage/filesystems/hdfs.md index 3dac3c7cda..b74ec68aca 100644 --- a/website/docs/maintenance/tiered-storage/filesystems/hdfs.md +++ b/website/docs/maintenance/tiered-storage/filesystems/hdfs.md @@ -76,7 +76,7 @@ fluss.hadoop.hadoop.security.kerberos.ticket.cache.path: /tmp/krb5cc_1000 #### Use Machine Hadoop Environment Configuration -Fluss includes bundled Hadoop libraries with version 3.3.4 for deploying Fluss in machine without Hadoop installed. +Fluss includes bundled Hadoop libraries with version 3.4.3 for deploying Fluss on machines without Hadoop installed. For most use cases, these work perfectly. However, you should configure your machine's native Hadoop environment if: 1. Your HDFS uses kerberos security 2. You need to avoid version conflicts between Fluss's bundled hadoop libraries and your HDFS cluster diff --git a/website/docs/maintenance/tiered-storage/filesystems/s3.md b/website/docs/maintenance/tiered-storage/filesystems/s3.md index 311573a591..cfa30482e0 100644 --- a/website/docs/maintenance/tiered-storage/filesystems/s3.md +++ b/website/docs/maintenance/tiered-storage/filesystems/s3.md @@ -25,6 +25,8 @@ Maven coordinates: ``` +The plugin is self-contained and bundles Hadoop S3A 3.4.3 together with the required modular AWS SDK for Java 2.x dependencies. You do not need to add the complete AWS SDK bundle separately. + Verify downloaded JARs against the [KEYS file](https://downloads.apache.org/incubator/fluss/KEYS) using the [verification instructions](/downloads#verifying-downloads). ## Configurations setup @@ -107,17 +109,17 @@ The server authenticates using its own credentials (static keys, IRSA, instance ### Custom AWS Credentials Provider -For deployments that manage long-term credentials through a standard AWS SDK or Hadoop S3A credentials provider (for example, a rotating profile), set `s3.aws.credentials.provider` to the provider class. Fluss then treats it as the authoritative server-side credential source, so rotated credentials are picked up without restarting the servers. +For deployments that manage long-term credentials through an AWS SDK for Java 2.x or Hadoop S3A credentials provider (for example, a rotating profile), set `s3.aws.credentials.provider` to the provider class. The provider must implement the AWS SDK V2 `software.amazon.awssdk.auth.credentials.AwsCredentialsProvider` interface. Fluss then treats it as the authoritative server-side credential source, so rotated credentials are picked up without restarting the servers. ```yaml remote.data.dir: s3:///path/to/remote/storage s3.region: -s3.aws.credentials.provider: com.amazonaws.auth.profile.ProfileCredentialsProvider +s3.aws.credentials.provider: software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider ``` | Configuration | Description | |---|---| -| `s3.aws.credentials.provider` | Fully qualified class name of an AWS SDK / Hadoop S3A credentials provider. It is used both for the server's own S3 access and for resolving the credentials used to mint temporary client credentials via `GetSessionToken`. Takes precedence over `s3.access-key`/`s3.secret-key` when both are configured. | +| `s3.aws.credentials.provider` | Fully qualified class name of an AWS SDK V2 / Hadoop S3A credentials provider implementing `AwsCredentialsProvider`. It is used both for the server's own S3 access and for resolving the credentials used to mint temporary client credentials via `GetSessionToken`. Takes precedence over `s3.access-key`/`s3.secret-key` when both are configured. | :::note This mode only supports providers that return **long-term** access-key credentials, and it cannot be combined with `s3.assumed.role.arn`. Providers that return session credentials — including IRSA and EC2 instance profiles — must use the [default AWS credential chain](#default-aws-credential-chain-irsa-instance-profiles) instead.