This is an automated email from the ASF dual-hosted git repository.

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 6b40003bb2 HDDS-11739. Extract generic unmarshaller for S3 requests 
(#7449)
6b40003bb2 is described below

commit 6b40003bb251a4ad699f38e6cc3adc6a354adaed
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Wed Nov 20 07:51:28 2024 +0100

    HDDS-11739. Extract generic unmarshaller for S3 requests (#7449)
---
 .../hadoop/ozone/s3/endpoint/BucketEndpoint.java   |  3 +-
 ...CompleteMultipartUploadRequestUnmarshaller.java | 45 ++---------------
 ...tUnmarshaller.java => MessageUnmarshaller.java} | 42 ++++++++-------
 .../endpoint/MultiDeleteRequestUnmarshaller.java   | 54 +-------------------
 .../endpoint/PutBucketAclRequestUnmarshaller.java  | 59 +---------------------
 .../ozone/s3/endpoint/PutTaggingUnmarshaller.java  | 45 +----------------
 6 files changed, 37 insertions(+), 211 deletions(-)

diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
index a705420ca3..e68a59e7f7 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/BucketEndpoint.java
@@ -568,8 +568,7 @@ public class BucketEndpoint extends EndpointBase {
       if (grantReads == null && grantWrites == null && grantReadACP == null
           && grantWriteACP == null && grantFull == null) {
         S3BucketAcl putBucketAclRequest =
-            new PutBucketAclRequestUnmarshaller().readFrom(
-                null, null, null, null, null, body);
+            new PutBucketAclRequestUnmarshaller().readFrom(body);
         // Handle grants in body
         ozoneAclListOnBucket.addAll(
             S3Acl.s3AclToOzoneNativeAclOnBucket(putBucketAclRequest));
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/CompleteMultipartUploadRequestUnmarshaller.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/CompleteMultipartUploadRequestUnmarshaller.java
index 5881baa174..3ab9a123cc 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/CompleteMultipartUploadRequestUnmarshaller.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/CompleteMultipartUploadRequestUnmarshaller.java
@@ -17,17 +17,9 @@
  */
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.parsers.SAXParserFactory;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
@@ -35,7 +27,6 @@ import java.lang.reflect.Type;
 import javax.ws.rs.ext.Provider;
 
 import static 
org.apache.hadoop.ozone.s3.exception.S3ErrorTable.INVALID_REQUEST;
-import static org.apache.hadoop.ozone.s3.util.S3Consts.S3_XML_NAMESPACE;
 import static org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
 
 /**
@@ -43,25 +34,10 @@ import static 
org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
  */
 @Provider
 public class CompleteMultipartUploadRequestUnmarshaller
-    implements MessageBodyReader<CompleteMultipartUploadRequest> {
-
-  private final JAXBContext context;
-  private final SAXParserFactory saxParserFactory;
+    extends MessageUnmarshaller<CompleteMultipartUploadRequest> {
 
   public CompleteMultipartUploadRequestUnmarshaller() {
-    try {
-      context = JAXBContext.newInstance(CompleteMultipartUploadRequest.class);
-      saxParserFactory = SAXParserFactory.newInstance();
-      saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
true);
-    } catch (Exception ex) {
-      throw new AssertionError("Can not instantiate " +
-          "CompleteMultipartUploadRequest parser", ex);
-    }
-  }
-  @Override
-  public boolean isReadable(Class<?> aClass, Type type,
-      Annotation[] annotations, MediaType mediaType) {
-    return type.equals(CompleteMultipartUploadRequest.class);
+    super(CompleteMultipartUploadRequest.class);
   }
 
   @Override
@@ -69,24 +45,13 @@ public class CompleteMultipartUploadRequestUnmarshaller
       Class<CompleteMultipartUploadRequest> aClass, Type type,
       Annotation[] annotations, MediaType mediaType,
       MultivaluedMap<String, String> multivaluedMap,
-      InputStream inputStream) throws IOException, WebApplicationException {
+      InputStream inputStream) throws WebApplicationException {
     try {
       if (inputStream.available() == 0) {
         throw wrapOS3Exception(INVALID_REQUEST.withMessage("You must specify 
at least one part"));
       }
-
-      XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
-      UnmarshallerHandler unmarshallerHandler =
-          context.createUnmarshaller().getUnmarshallerHandler();
-      XmlNamespaceFilter filter =
-          new XmlNamespaceFilter(S3_XML_NAMESPACE);
-      filter.setContentHandler(unmarshallerHandler);
-      filter.setParent(xmlReader);
-      filter.parse(new InputSource(inputStream));
-      return (CompleteMultipartUploadRequest) unmarshallerHandler.getResult();
-    } catch (WebApplicationException e) {
-      throw e;
-    } catch (Exception e) {
+      return super.readFrom(aClass, type, annotations, mediaType, 
multivaluedMap, inputStream);
+    } catch (IOException e) {
       throw wrapOS3Exception(INVALID_REQUEST.withMessage(e.getMessage()));
     }
   }
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MessageUnmarshaller.java
similarity index 74%
copy from 
hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
copy to 
hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MessageUnmarshaller.java
index c832915176..dd50598c7c 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MessageUnmarshaller.java
@@ -6,9 +6,9 @@
  * 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
- * <p>
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * <p>
+ *
  * 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.
@@ -24,12 +24,10 @@ import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.MessageBodyReader;
-import javax.ws.rs.ext.Provider;
 import javax.xml.XMLConstants;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.UnmarshallerHandler;
 import javax.xml.parsers.SAXParserFactory;
-import java.io.IOException;
 import java.io.InputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
@@ -39,37 +37,41 @@ import static 
org.apache.hadoop.ozone.s3.util.S3Consts.S3_XML_NAMESPACE;
 import static org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
 
 /**
- * Custom unmarshaller to read PutBucketAclRequest wo namespace.
+ * Unmarshaller to create instances of type {@code T} from XML,
+ * which may or may not have namespace.
+ * @param <T> the object type to read from XML
  */
-@Provider
-public class PutBucketAclRequestUnmarshaller
-    implements MessageBodyReader<S3BucketAcl> {
+public class MessageUnmarshaller<T> implements MessageBodyReader<T> {
 
   private final JAXBContext context;
   private final SAXParserFactory saxParserFactory;
+  private final Class<T> cls;
+
+  public MessageUnmarshaller(Class<T> cls) {
+    this.cls = cls;
 
-  public PutBucketAclRequestUnmarshaller() {
     try {
-      context = JAXBContext.newInstance(S3BucketAcl.class);
+      context = JAXBContext.newInstance(cls);
       saxParserFactory = SAXParserFactory.newInstance();
       saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
true);
     } catch (Exception ex) {
-      throw new AssertionError("Can not instantiate " +
-          "PutBucketAclRequest parser", ex);
+      throw new AssertionError("Can not instantiate XML parser for " + 
cls.getSimpleName(), ex);
     }
   }
+
   @Override
   public boolean isReadable(Class<?> aClass, Type type,
       Annotation[] annotations, MediaType mediaType) {
-    return type.equals(S3BucketAcl.class);
+    return type.equals(cls);
   }
 
   @Override
-  public S3BucketAcl readFrom(
-      Class<S3BucketAcl> aClass, Type type,
+  public T readFrom(
+      Class<T> aClass, Type type,
       Annotation[] annotations, MediaType mediaType,
       MultivaluedMap<String, String> multivaluedMap,
-      InputStream inputStream) throws IOException, WebApplicationException {
+      InputStream inputStream
+  ) throws WebApplicationException {
     try {
       XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
       UnmarshallerHandler unmarshallerHandler =
@@ -79,9 +81,15 @@ public class PutBucketAclRequestUnmarshaller
       filter.setContentHandler(unmarshallerHandler);
       filter.setParent(xmlReader);
       filter.parse(new InputSource(inputStream));
-      return (S3BucketAcl)(unmarshallerHandler.getResult());
+      return cls.cast(unmarshallerHandler.getResult());
     } catch (Exception e) {
       throw wrapOS3Exception(INVALID_REQUEST.withMessage(e.getMessage()));
     }
   }
+
+  /** Convenience method for programmatic invocation. */
+  public T readFrom(InputStream inputStream) throws WebApplicationException {
+    return readFrom(cls, cls, new Annotation[0], 
MediaType.APPLICATION_XML_TYPE, null, inputStream);
+  }
+
 }
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MultiDeleteRequestUnmarshaller.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MultiDeleteRequestUnmarshaller.java
index 775ec789f3..3102fb94f0 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MultiDeleteRequestUnmarshaller.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/MultiDeleteRequestUnmarshaller.java
@@ -19,22 +19,7 @@ package org.apache.hadoop.ozone.s3.endpoint;
 
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.Provider;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.parsers.SAXParserFactory;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-
-import static 
org.apache.hadoop.ozone.s3.exception.S3ErrorTable.INVALID_REQUEST;
-import static org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
 
 /**
  * Custom unmarshaller to read MultiDeleteRequest w/wo namespace.
@@ -42,45 +27,10 @@ import static 
org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
 @Provider
 @Produces(MediaType.APPLICATION_XML)
 public class MultiDeleteRequestUnmarshaller
-    implements MessageBodyReader<MultiDeleteRequest> {
-
-  private final JAXBContext context;
-  private final SAXParserFactory saxParserFactory;
+    extends MessageUnmarshaller<MultiDeleteRequest> {
 
   public MultiDeleteRequestUnmarshaller() {
-    try {
-      context = JAXBContext.newInstance(MultiDeleteRequest.class);
-      saxParserFactory = SAXParserFactory.newInstance();
-      saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
true);
-    } catch (Exception ex) {
-      throw new AssertionError("Can't instantiate MultiDeleteRequest parser",
-          ex);
-    }
+    super(MultiDeleteRequest.class);
   }
 
-  @Override
-  public boolean isReadable(Class<?> type, Type genericType,
-      Annotation[] annotations, MediaType mediaType) {
-    return type.equals(MultiDeleteRequest.class);
-  }
-
-  @Override
-  public MultiDeleteRequest readFrom(Class<MultiDeleteRequest> type,
-      Type genericType, Annotation[] annotations, MediaType mediaType,
-      MultivaluedMap<String, String> httpHeaders, InputStream entityStream) {
-    try {
-      XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
-      UnmarshallerHandler unmarshallerHandler =
-          context.createUnmarshaller().getUnmarshallerHandler();
-
-      XmlNamespaceFilter filter =
-          new XmlNamespaceFilter("http://s3.amazonaws.com/doc/2006-03-01/";);
-      filter.setContentHandler(unmarshallerHandler);
-      filter.setParent(xmlReader);
-      filter.parse(new InputSource(entityStream));
-      return (MultiDeleteRequest) unmarshallerHandler.getResult();
-    } catch (Exception e) {
-      throw wrapOS3Exception(INVALID_REQUEST.withMessage(e.getMessage()));
-    }
-  }
 }
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
index c832915176..df15a87428 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutBucketAclRequestUnmarshaller.java
@@ -17,71 +17,16 @@
  */
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.Provider;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.parsers.SAXParserFactory;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
-import static 
org.apache.hadoop.ozone.s3.exception.S3ErrorTable.INVALID_REQUEST;
-import static org.apache.hadoop.ozone.s3.util.S3Consts.S3_XML_NAMESPACE;
-import static org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
 
 /**
  * Custom unmarshaller to read PutBucketAclRequest wo namespace.
  */
 @Provider
-public class PutBucketAclRequestUnmarshaller
-    implements MessageBodyReader<S3BucketAcl> {
-
-  private final JAXBContext context;
-  private final SAXParserFactory saxParserFactory;
+public class PutBucketAclRequestUnmarshaller extends 
MessageUnmarshaller<S3BucketAcl> {
 
   public PutBucketAclRequestUnmarshaller() {
-    try {
-      context = JAXBContext.newInstance(S3BucketAcl.class);
-      saxParserFactory = SAXParserFactory.newInstance();
-      saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
true);
-    } catch (Exception ex) {
-      throw new AssertionError("Can not instantiate " +
-          "PutBucketAclRequest parser", ex);
-    }
-  }
-  @Override
-  public boolean isReadable(Class<?> aClass, Type type,
-      Annotation[] annotations, MediaType mediaType) {
-    return type.equals(S3BucketAcl.class);
+    super(S3BucketAcl.class);
   }
 
-  @Override
-  public S3BucketAcl readFrom(
-      Class<S3BucketAcl> aClass, Type type,
-      Annotation[] annotations, MediaType mediaType,
-      MultivaluedMap<String, String> multivaluedMap,
-      InputStream inputStream) throws IOException, WebApplicationException {
-    try {
-      XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
-      UnmarshallerHandler unmarshallerHandler =
-          context.createUnmarshaller().getUnmarshallerHandler();
-      XmlNamespaceFilter filter =
-          new XmlNamespaceFilter(S3_XML_NAMESPACE);
-      filter.setContentHandler(unmarshallerHandler);
-      filter.setParent(xmlReader);
-      filter.parse(new InputSource(inputStream));
-      return (S3BucketAcl)(unmarshallerHandler.getResult());
-    } catch (Exception e) {
-      throw wrapOS3Exception(INVALID_REQUEST.withMessage(e.getMessage()));
-    }
-  }
 }
diff --git 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutTaggingUnmarshaller.java
 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutTaggingUnmarshaller.java
index eb5c8a1487..f0db9fda9e 100644
--- 
a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutTaggingUnmarshaller.java
+++ 
b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/PutTaggingUnmarshaller.java
@@ -17,54 +17,13 @@
 
 package org.apache.hadoop.ozone.s3.endpoint;
 
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-
-import javax.ws.rs.WebApplicationException;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.UnmarshallerHandler;
-import javax.xml.parsers.SAXParserFactory;
-import java.io.InputStream;
-
-import static 
org.apache.hadoop.ozone.s3.exception.S3ErrorTable.INVALID_REQUEST;
-import static org.apache.hadoop.ozone.s3.util.S3Consts.S3_XML_NAMESPACE;
-import static org.apache.hadoop.ozone.s3.util.S3Utils.wrapOS3Exception;
-
 /**
  * Custom unmarshaller to read Tagging request body.
  */
-public class PutTaggingUnmarshaller {
-
-  private JAXBContext context;
-  private SAXParserFactory saxParserFactory;
+public class PutTaggingUnmarshaller extends MessageUnmarshaller<S3Tagging> {
 
   public PutTaggingUnmarshaller() {
-    try {
-      context = JAXBContext.newInstance(S3Tagging.class);
-      saxParserFactory = SAXParserFactory.newInstance();
-      saxParserFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, 
true);
-    } catch (Exception ex) {
-      throw new AssertionError("Can not instantiate " +
-          "PutTaggingUnmarshaller parser", ex);
-    }
-  }
-
-  public S3Tagging readFrom(InputStream inputStream)
-        throws WebApplicationException {
-    try {
-      XMLReader xmlReader = saxParserFactory.newSAXParser().getXMLReader();
-      UnmarshallerHandler unmarshallerHandler =
-          context.createUnmarshaller().getUnmarshallerHandler();
-      XmlNamespaceFilter filter =
-          new XmlNamespaceFilter(S3_XML_NAMESPACE);
-      filter.setContentHandler(unmarshallerHandler);
-      filter.setParent(xmlReader);
-      filter.parse(new InputSource(inputStream));
-      return (S3Tagging) unmarshallerHandler.getResult();
-    } catch (Exception e) {
-      throw wrapOS3Exception(INVALID_REQUEST.withMessage(e.getMessage()));
-    }
+    super(S3Tagging.class);
   }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to