From b5180f819f422d3d6d3d6ff277f7fb8eee2ccbcc Mon Sep 17 00:00:00 2001 From: Florian Schmaus Date: Sat, 16 Dec 2023 16:53:34 +0100 Subject: [PATCH] Follow-up commit after merging support for XEP-0446: File Metadata Element This is a follow-up commit after 441d6776447f ("Initial support for XEP-0446: File Metadata Element"). It includes the following changes 1. Use idiomatic provider design for FileMetadataElementProvider 2. Add XEP-0264 and XEP-0446 to the list of supported XEPs (both where added with441d6776447f) --- .../provider/FileMetadataElementProvider.java | 112 +++++++++--------- .../provider/ThumbnailElementProvider.java | 9 +- .../FileMetadataElementTest.java | 65 ++++++---- .../org/jivesoftware/smackx/package-info.java | 12 ++ 4 files changed, 120 insertions(+), 78 deletions(-) diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/file_metadata/provider/FileMetadataElementProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/file_metadata/provider/FileMetadataElementProvider.java index cd87dcdb4..e4212b0ce 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/file_metadata/provider/FileMetadataElementProvider.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/file_metadata/provider/FileMetadataElementProvider.java @@ -33,64 +33,70 @@ import org.jivesoftware.smackx.thumbnails.provider.ThumbnailElementProvider; public class FileMetadataElementProvider extends ExtensionElementProvider { - public static FileMetadataElementProvider TEST_INSTANCE = new FileMetadataElementProvider(); - @Override public FileMetadataElement parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException, IOException, SmackParsingException, ParseException { FileMetadataElement.Builder builder = FileMetadataElement.builder(); - do { - XmlPullParser.TagEvent tagEvent = parser.nextTag(); - String name = parser.getName(); - if (tagEvent != XmlPullParser.TagEvent.START_ELEMENT) { - continue; + + outerloop: while (true) { + XmlPullParser.Event event = parser.next(); + switch (event) { + case START_ELEMENT: + String name = parser.getName(); + switch (name) { + case FileMetadataElement.ELEMENT: + parser.next(); + break; + case FileMetadataElement.ELEM_DATE: + builder.setModificationDate(ParserUtils.getDateFromNextText(parser)); + break; + case FileMetadataElement.ELEM_DESC: + String lang = ParserUtils.getXmlLang(parser); + builder.addDescription(ParserUtils.getRequiredNextText(parser), lang); + break; + case "dimensions": // was replaced with width and height + String dimensions = ParserUtils.getRequiredNextText(parser); + String[] split = dimensions.split("x"); + if (split.length != 2) { + throw new IllegalArgumentException("Invalid dimensions."); + } + builder.setWidth(Integer.parseInt(split[0])); + builder.setHeight(Integer.parseInt(split[1])); + break; + case FileMetadataElement.ELEM_WIDTH: + builder.setWidth(Integer.parseInt(ParserUtils.getRequiredNextText(parser))); + break; + case FileMetadataElement.ELEM_HEIGHT: + builder.setHeight(Integer.parseInt(ParserUtils.getRequiredNextText(parser))); + break; + case FileMetadataElement.ELEM_LENGTH: + builder.setLength(Long.parseLong(ParserUtils.getRequiredNextText(parser))); + break; + case FileMetadataElement.ELEM_MEDIA_TYPE: + builder.setMediaType(ParserUtils.getRequiredNextText(parser)); + break; + case FileMetadataElement.ELEM_NAME: + builder.setName(ParserUtils.getRequiredNextText(parser)); + break; + case FileMetadataElement.ELEM_SIZE: + builder.setSize(Long.parseLong(ParserUtils.getRequiredNextText(parser))); + break; + case HashElement.ELEMENT: + builder.addHash(HashElementProvider.INSTANCE.parse(parser, parser.getDepth(), xmlEnvironment)); + break; + case ThumbnailElement.ELEMENT: + ThumbnailElementProvider provider = new ThumbnailElementProvider(); + builder.addThumbnail(provider.parse(parser, parser.getDepth(), xmlEnvironment)); + } + break; + case END_ELEMENT: + if (parser.getDepth() == initialDepth) break outerloop; + break; + default: + // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement. + break; } - switch (name) { - case FileMetadataElement.ELEMENT: - parser.next(); - break; - case FileMetadataElement.ELEM_DATE: - builder.setModificationDate(ParserUtils.getDateFromNextText(parser)); - break; - case FileMetadataElement.ELEM_DESC: - String lang = ParserUtils.getXmlLang(parser); - builder.addDescription(ParserUtils.getRequiredNextText(parser), lang); - break; - case "dimensions": // was replaced with width and height - String dimensions = ParserUtils.getRequiredNextText(parser); - String[] split = dimensions.split("x"); - if (split.length != 2) { - throw new IllegalArgumentException("Invalid dimensions."); - } - builder.setWidth(Integer.parseInt(split[0])); - builder.setHeight(Integer.parseInt(split[1])); - break; - case FileMetadataElement.ELEM_WIDTH: - builder.setWidth(Integer.parseInt(ParserUtils.getRequiredNextText(parser))); - break; - case FileMetadataElement.ELEM_HEIGHT: - builder.setHeight(Integer.parseInt(ParserUtils.getRequiredNextText(parser))); - break; - case FileMetadataElement.ELEM_LENGTH: - builder.setLength(Long.parseLong(ParserUtils.getRequiredNextText(parser))); - break; - case FileMetadataElement.ELEM_MEDIA_TYPE: - builder.setMediaType(ParserUtils.getRequiredNextText(parser)); - break; - case FileMetadataElement.ELEM_NAME: - builder.setName(ParserUtils.getRequiredNextText(parser)); - break; - case FileMetadataElement.ELEM_SIZE: - builder.setSize(Long.parseLong(ParserUtils.getRequiredNextText(parser))); - break; - case HashElement.ELEMENT: - builder.addHash(HashElementProvider.INSTANCE.parse(parser, parser.getDepth(), xmlEnvironment)); - break; - case ThumbnailElement.ELEMENT: - ThumbnailElementProvider provider = new ThumbnailElementProvider(); - builder.addThumbnail(provider.parse(parser, parser.getDepth(), xmlEnvironment)); - } - } while (parser.getDepth() != initialDepth); + } return builder.build(); } } diff --git a/smack-experimental/src/main/java/org/jivesoftware/smackx/thumbnails/provider/ThumbnailElementProvider.java b/smack-experimental/src/main/java/org/jivesoftware/smackx/thumbnails/provider/ThumbnailElementProvider.java index b21f7e8ea..6fc174002 100644 --- a/smack-experimental/src/main/java/org/jivesoftware/smackx/thumbnails/provider/ThumbnailElementProvider.java +++ b/smack-experimental/src/main/java/org/jivesoftware/smackx/thumbnails/provider/ThumbnailElementProvider.java @@ -22,6 +22,7 @@ import java.text.ParseException; import org.jivesoftware.smack.packet.XmlEnvironment; import org.jivesoftware.smack.parsing.SmackParsingException; import org.jivesoftware.smack.provider.ExtensionElementProvider; +import org.jivesoftware.smack.util.ParserUtils; import org.jivesoftware.smack.xml.XmlPullParser; import org.jivesoftware.smack.xml.XmlPullParserException; import org.jivesoftware.smackx.thumbnails.element.ThumbnailElement; @@ -32,14 +33,14 @@ public class ThumbnailElementProvider extends ExtensionElementProvider2015-07-26T20:46:00.000+00:00" + "1920" + @@ -66,24 +85,6 @@ public class FileMetadataElementTest extends SmackTestSuite { "6144" + ""; - @BeforeAll - public static void setup() throws ParseException { - date = XmppDateTime.parseDate("2015-07-26T21:46:00+01:00"); - metadataElement = FileMetadataElement.builder() - .setModificationDate(date) - .setWidth(1920) - .setHeight(1080) - .addDescription("Picture of 24th XSF Summit") - .addDescription("Foto vom 24. XSF Summit", "de") - .addHash(new HashElement(HashManager.ALGORITHM.SHA_256, "2XarmwTlNxDAMkvymloX3S5+VbylNrJt/l5QyPa+YoU=")) - .setLength(63000) - .setMediaType("text/plain") - .setName("text.txt") - .setSize(6144) - .build(); - } - - @Test public void testSerialization() { assertXmlSimilar(expectedXml, metadataElement.toXML().toString()); @@ -105,6 +106,28 @@ public class FileMetadataElementTest extends SmackTestSuite { assertEquals(metadataElement, parsed); } + @ParameterizedTest + @EnumSource(SmackTestUtil.XmlPullParserKind.class) + public void testParseUnknownExtension(SmackTestUtil.XmlPullParserKind parserKind) throws Exception { + final String xml = "" + + "2015-07-26T20:46:00.000+00:00" + + "1920" + + "1080" + + "foo" + + "Picture of 24th XSF Summit" + + "Foto vom 24. XSF Summit" + + "2XarmwTlNxDAMkvymloX3S5+VbylNrJt/l5QyPa+YoU=" + + "63000" + + "text/plain" + + "text.txt" + + "6144" + + ""; + + FileMetadataElement parsed = SmackTestUtil.parse(xml, FileMetadataElementProvider.class, parserKind); + + assertEquals(metadataElement, parsed); + } + @Test public void nameIsEscaped() { FileMetadataElement e = FileMetadataElement.builder().setName("/etc/passwd").build(); diff --git a/smack-java8-full/src/main/java/org/jivesoftware/smackx/package-info.java b/smack-java8-full/src/main/java/org/jivesoftware/smackx/package-info.java index 171472358..d9f01636e 100644 --- a/smack-java8-full/src/main/java/org/jivesoftware/smackx/package-info.java +++ b/smack-java8-full/src/main/java/org/jivesoftware/smackx/package-info.java @@ -370,6 +370,12 @@ * Allows sending a MUC invitation directly from the user to the contact with mediation by the room. * * + * Jingle Content Thumbnails + * XEP-0264 + * {@link org.jivesoftware.smackx.thumbnails.element} + * Defines a way for a client to supply a preview image for Jingle content. + * + * * Message Carbons * XEP-0280 * {@link org.jivesoftware.smackx.carbons} @@ -583,6 +589,12 @@ * Declare body elements of a message as ignorable fallback for naive legacy clients. * * + * File metadata element + * XEP-0446 + * {@link org.jivesoftware.smackx.file_metadata.element} + * Defines a generic file metadata element to be used in other specifications. + * + * * Google GCM JSON payload * *