From 4133eb175cf1d95b52aee7c539eb792d0e962b75 Mon Sep 17 00:00:00 2001
From: Florian Schmaus
Date: Mon, 6 May 2019 22:06:13 +0200
Subject: [PATCH] Replace XPP3 by XmlPullParser interface wrapping StAX and
XPP3
Introducing Smack's own XmlPullParser interface which tries to stay as
compatible as possible to XPP3. The interface is used to either wrap
StAX's XMLStreamReader if Smack is used on Java SE, and XPP3's
XmlPullParser if Smack is used on on Android.
Fixes SMACK-591.
Also introduce JUnit 5 and non-strict javadoc projects.
---
build.gradle | 57 ++-
documentation/developer/provider.md | 9 +-
documentation/providers.md | 27 +-
resources/releasedocs/README.html | 12 +-
settings.gradle | 5 +-
smack-android/build.gradle | 1 +
.../smack/bosh/XMPPBOSHConnection.java | 19 +-
smack-core/build.gradle | 12 +-
.../smack/packet/PrivacyProviderTest.java | 6 +-
.../smack/test/SmackTestCase.java | 10 +-
.../smack/util/XMPPErrorTest.java | 6 +-
.../smack/AbstractXMPPConnection.java | 10 +-
.../smack/SmackConfiguration.java | 2 +
.../smack/SmackInitialization.java | 22 +-
.../compress/provider/CompressedProvider.java | 2 +-
.../compress/provider/FailureProvider.java | 11 +-
.../AbstractXmppStateMachineConnection.java | 11 +-
.../smack/packet/XmlEnvironment.java | 2 +-
.../StandardExtensionElementProvider.java | 19 +-
.../smack/provider/BindIQProvider.java | 13 +-
.../smack/provider/BodyElementProvider.java | 4 +-
.../provider/EmbeddedExtensionProvider.java | 10 +-
.../smack/provider/IntrospectionProvider.java | 13 +-
.../jivesoftware/smack/provider/Provider.java | 4 +-
.../smack/provider/ProviderFileLoader.java | 15 +-
.../smack/provider/TlsFailureProvider.java | 2 +-
.../smack/provider/TlsProceedProvider.java | 2 +-
.../smack/util/PacketParserUtils.java | 399 ++++++++----------
.../jivesoftware/smack/util/ParserUtils.java | 12 +-
.../provider/FailureProviderTest.java | 4 +-
.../smack/packet/StreamErrorTest.java | 78 ++--
.../smack/parsing/ParsingExceptionTest.java | 6 +-
.../smack/provider/ProviderConfigTest.java | 2 +-
.../smack/provider/ProviderManagerTest.java | 2 +-
.../smack/sasl/DigestMd5SaslTest.java | 6 +-
.../smack/test/util/SmackTestUtil.java | 165 ++++++++
.../smack/test/util/TestUtils.java | 32 +-
.../smack/util/PacketParserUtilsTest.java | 58 ++-
.../smack/xml/XmlPullParserTest.java | 231 ++++++++++
.../provider/CarbonManagerProvider.java | 11 +-
.../chat_markers/ChatMarkersManager.java | 1 +
.../element/ChatMarkersElements.java | 1 +
.../filter/ChatMarkersFilter.java | 1 +
.../filter/EligibleForChatMarkerFilter.java | 1 +
.../provider/AcknowledgedProvider.java | 3 +-
.../provider/DisplayedProvider.java | 3 +-
.../provider/MarkableProvider.java | 3 +-
.../provider/ReceivedProvider.java | 3 +-
.../ClientStateIndicationFeatureProvider.java | 5 +-
.../smackx/dox/DnsOverXmppManager.java | 1 +
.../smackx/dox/provider/DnsIqProvider.java | 6 +-
.../ExplicitMessageEncryptionProvider.java | 3 +-
.../hashes/provider/HashElementProvider.java | 9 +-
.../MessageProcessingHintProvider.java | 3 +-
.../AbstractHttpOverXmppProvider.java | 45 +-
.../provider/Base64BinaryChunkProvider.java | 11 +-
.../provider/HttpOverXmppReqProvider.java | 5 +-
.../provider/HttpOverXmppRespProvider.java | 6 +-
.../provider/FileTooLargeErrorProvider.java | 14 +-
.../httpfileupload/provider/SlotProvider.java | 23 +-
.../provider/IoTSetRequestProvider.java | 14 +-
.../provider/IoTSetResponseProvider.java | 3 +-
.../IoTDataReadOutAcceptedProvider.java | 3 +-
.../data/provider/IoTDataRequestProvider.java | 3 +-
.../provider/IoTFieldsExtensionProvider.java | 31 +-
.../provider/IoTClaimedProvider.java | 2 +-
.../discovery/provider/IoTDisownProvider.java | 2 +-
.../provider/IoTDisownedProvider.java | 3 +-
.../provider/IoTRegisterProvider.java | 9 +-
.../discovery/provider/IoTRemoveProvider.java | 2 +-
.../provider/IoTRemovedProvider.java | 3 +-
.../provider/IoTUnregisterProvider.java | 3 +-
.../smackx/iot/parser/NodeInfoParser.java | 4 +-
.../provider/ClearCacheProvider.java | 3 +-
.../provider/ClearCacheResponseProvider.java | 3 +-
.../provisioning/provider/FriendProvider.java | 2 +-
.../provider/IoTIsFriendProvider.java | 2 +-
.../provider/IoTIsFriendResponseProvider.java | 2 +-
.../provider/UnfriendProvider.java | 2 +-
.../jingle_filetransfer/element/Checksum.java | 1 +
.../element/JingleFileTransferChild.java | 1 +
.../jingle_filetransfer/element/Range.java | 16 +-
.../provider/ChecksumProvider.java | 18 +-
.../provider/JingleFileTransferProvider.java | 92 ++--
.../AbstractJsonExtensionProvider.java | 5 +-
.../smackx/mam/provider/MamFinIQProvider.java | 14 +-
.../mam/provider/MamPrefsIQProvider.java | 22 +-
.../mam/provider/MamQueryIQProvider.java | 14 +-
.../mam/provider/MamResultProvider.java | 14 +-
.../provider/MarkupElementProvider.java | 19 +-
.../MUCLightAffiliationsChangeProvider.java | 10 +-
.../MUCLightAffiliationsIQProvider.java | 10 +-
.../provider/MUCLightBlockingIQProvider.java | 10 +-
.../MUCLightConfigurationIQProvider.java | 11 +-
.../MUCLightConfigurationsChangeProvider.java | 11 +-
.../provider/MUCLightInfoIQProvider.java | 20 +-
.../provider/RemoteDisablingProvider.java | 10 +-
.../smackx/reference/ReferenceManager.java | 1 +
.../reference/element/ReferenceElement.java | 1 +
.../reference/provider/ReferenceProvider.java | 12 +-
.../sid/StableUniqueStanzaIdManager.java | 1 +
.../smackx/sid/element/OriginIdElement.java | 1 +
.../smackx/sid/element/StanzaIdElement.java | 1 +
.../smackx/sid/provider/OriginIdProvider.java | 4 +-
.../smackx/sid/provider/StanzaIdProvider.java | 4 +-
.../smackx/spoiler/SpoilerManager.java | 1 +
.../spoiler/element/SpoilerElement.java | 1 +
.../spoiler/provider/SpoilerProvider.java | 18 +-
.../smackx/ExperimentalInitializerTest.java | 4 +-
.../smackx/carbons/CarbonTest.java | 28 +-
.../AcknowledgedExtensionTest.java | 13 +-
.../chat_markers/DisplayedExtensionTest.java | 13 +-
.../chat_markers/MarkableExtensionTest.java | 13 +-
.../chat_markers/ReceivedExtensionTest.java | 13 +-
.../smackx/colors/ConsistentColorsTest.java | 2 +-
.../ExplicitMessageEncryptionElementTest.java | 3 +-
...ExplicitMessageEncryptionProviderTest.java | 29 +-
.../smackx/hashes/HashElementTest.java | 4 +-
.../jivesoftware/smackx/hashes/HashTest.java | 2 +-
.../AbstractHttpOverXmppProviderTest.java | 60 ++-
.../Base64BinaryChunkProviderTest.java | 10 +-
.../provider/HttpOverXmppReqProviderTest.java | 8 +-
.../HttpOverXmppRespProviderTest.java | 10 +-
.../FileTooLargeErrorCreateTest.java | 9 +-
.../smackx/httpfileupload/SlotCreateTest.java | 8 +-
.../httpfileupload/SlotRequestCreateTest.java | 27 +-
.../FileTooLargeErrorProviderTest.java | 9 +-
.../provider/SlotProviderTest.java | 4 +-
.../jivesoftware/smackx/mam/FiltersTest.java | 4 +-
.../smackx/mam/MamFinProviderTest.java | 32 +-
.../smackx/mam/MamPrefIQProviderTest.java | 32 +-
.../smackx/mam/MamQueryIQProviderTest.java | 39 +-
.../smackx/mam/MamResultProviderTest.java | 31 +-
.../org/jivesoftware/smackx/mam/MamTest.java | 12 +-
.../jivesoftware/smackx/mam/PagingTest.java | 11 +-
.../smackx/mam/PreferencesTest.java | 9 +-
.../smackx/mam/QueryArchiveTest.java | 21 +-
.../smackx/mam/ResultsLimitTest.java | 10 +-
.../smackx/mam/RetrieveFormFieldsTest.java | 4 +-
.../message_markup/MessageMarkupTest.java | 21 +-
...CLightAffiliationsChangeExtensionTest.java | 31 +-
.../smackx/muclight/MUCLightBlockingTest.java | 23 +-
.../MUCLightChangeAffiliationsIQTest.java | 15 +-
...ightConfigurationsChangeExtensionTest.java | 42 +-
.../smackx/muclight/MUCLightCreateIQTest.java | 11 +-
.../smackx/muclight/MUCLightDestroyTest.java | 7 +-
.../muclight/MUCLightGetAffiliationsTest.java | 17 +-
.../muclight/MUCLightGetConfigsTest.java | 26 +-
.../smackx/muclight/MUCLightInfoTest.java | 21 +-
.../muclight/MUCLightSetConfigsIQTest.java | 11 +-
.../DisablePushNotificationsIQTest.java | 9 +-
.../EnablePushNotificationsIQTest.java | 9 +-
.../RemoteDisablingPushNotificationsTest.java | 16 +-
.../smackx/reference/ReferenceTest.java | 24 +-
.../smackx/sid/StableUniqueStanzaIdTest.java | 3 +-
.../smackx/spoiler/SpoilerTest.java | 18 +-
.../smackx/pubsub/CarExtensionProvider.java | 6 +-
.../provider/MultipleAddressesProvider.java | 13 +-
.../amp/provider/AMPExtensionProvider.java | 11 +-
.../attention/packet/AttentionExtension.java | 3 +-
.../provider/BlockContactsIQProvider.java | 15 +-
.../provider/BlockListIQProvider.java | 15 +-
.../BlockedErrorExtensionProvider.java | 3 +-
.../provider/UnblockContactsIQProvider.java | 15 +-
.../smackx/bob/provider/BoBIQProvider.java | 7 +-
.../smackx/bookmarks/Bookmarks.java | 28 +-
.../ibb/provider/CloseIQProvider.java | 3 +-
.../ibb/provider/DataPacketProvider.java | 6 +-
.../ibb/provider/OpenIQProvider.java | 5 +-
.../bytestreams/socks5/Socks5Client.java | 1 +
.../socks5/provider/BytestreamsProvider.java | 10 +-
.../caps/provider/CapsExtensionProvider.java | 9 +-
.../smackx/chatstates/ChatStateManager.java | 1 +
.../provider/ChatStateExtensionProvider.java | 3 +-
.../provider/AdHocCommandDataProvider.java | 11 +-
.../AbstractDelayInformationProvider.java | 33 +-
.../disco/provider/DiscoverInfoProvider.java | 11 +-
.../disco/provider/DiscoverItemsProvider.java | 12 +-
.../Socks5TransferNegotiator.java | 1 +
.../forward/provider/ForwardedProvider.java | 14 +-
.../geoloc/provider/GeoLocationProvider.java | 15 +-
.../smackx/iqlast/packet/LastActivity.java | 4 +-
.../smackx/iqprivate/PrivateDataManager.java | 33 +-
.../provider/PrivateDataProvider.java | 6 +-
.../provider/RegistrationProvider.java | 13 +-
.../RegistrationStreamFeatureProvider.java | 3 +-
.../iqversion/provider/VersionProvider.java | 15 +-
.../smackx/jingle/JingleHandler.java | 1 +
.../smackx/jingle/JingleManager.java | 1 +
.../smackx/jingle/JingleSession.java | 1 +
.../smackx/jingle/JingleSessionHandler.java | 1 +
.../jingle/JingleTransportMethodManager.java | 1 +
.../smackx/jingle/JingleUtil.java | 1 +
.../JingleContentDescriptionProvider.java | 5 +-
.../JingleContentTransportProvider.java | 5 +-
.../jingle/provider/JingleErrorProvider.java | 3 +-
.../jingle/provider/JingleProvider.java | 24 +-
.../transports/JingleTransportManager.java | 1 +
.../transports/JingleTransportSession.java | 1 +
.../jingle_ibb/JingleIBBTransportManager.java | 1 +
.../jingle_ibb/JingleIBBTransportSession.java | 1 +
.../provider/JingleIBBTransportProvider.java | 4 +-
.../jingle_s5b/JingleS5BTransportManager.java | 1 +
.../jingle_s5b/JingleS5BTransportSession.java | 1 +
.../elements/JingleS5BTransport.java | 1 +
.../elements/JingleS5BTransportCandidate.java | 1 +
.../elements/JingleS5BTransportInfo.java | 1 +
.../provider/JingleS5BTransportProvider.java | 15 +-
.../JivePropertiesExtensionProvider.java | 15 +-
.../provider/IdleProvider.java | 3 +-
.../provider/MessageCorrectProvider.java | 3 +-
.../smackx/mood/MoodListener.java | 1 +
.../jivesoftware/smackx/mood/MoodManager.java | 1 +
.../smackx/mood/element/MoodElement.java | 1 +
.../provider/MoodConcretisationProvider.java | 6 +-
.../smackx/mood/provider/MoodProvider.java | 20 +-
.../SimpleMoodConcretisationProvider.java | 6 +-
.../muc/packet/GroupChatInvitation.java | 5 +-
.../smackx/muc/provider/MUCAdminProvider.java | 11 +-
.../smackx/muc/provider/MUCOwnerProvider.java | 11 +-
.../smackx/muc/provider/MUCParserUtils.java | 22 +-
.../smackx/muc/provider/MUCUserProvider.java | 23 +-
.../smackx/nick/provider/NickProvider.java | 5 +-
.../offline/packet/OfflineMessageInfo.java | 11 +-
.../offline/packet/OfflineMessageRequest.java | 15 +-
.../smackx/ping/provider/PingProvider.java | 5 +-
.../privacy/provider/PrivacyProvider.java | 27 +-
.../pubsub/EmbeddedPacketExtension.java | 2 +-
.../smackx/pubsub/SimplePayload.java | 5 +-
.../pubsub/provider/AffiliationProvider.java | 2 +-
.../smackx/pubsub/provider/ItemProvider.java | 9 +-
.../pubsub/provider/PubSubProvider.java | 14 +-
.../pubsub/provider/SubscriptionProvider.java | 14 +-
.../receipts/DeliveryReceiptRequest.java | 5 +-
.../smackx/rsm/provider/RSMSetProvider.java | 17 +-
.../smackx/search/SimpleUserSearch.java | 15 +-
.../smackx/search/UserSearch.java | 22 +-
.../sharedgroups/packet/SharedGroupsInfo.java | 11 +-
.../smackx/shim/provider/HeaderProvider.java | 9 +-
.../si/provider/StreamInitiationProvider.java | 11 +-
.../vcardtemp/provider/VCardProvider.java | 52 +--
.../xdata/provider/DataFormProvider.java | 50 ++-
.../provider/DataLayoutProvider.java | 19 +-
.../provider/DataValidationProvider.java | 14 +-
.../provider/XHTMLExtensionProvider.java | 13 +-
.../smackx/amp/AMPExtensionTest.java | 16 +-
.../smackx/blocking/BlockContactsIQTest.java | 9 +-
.../blocking/BlockedErrorExtensionTest.java | 10 +-
.../smackx/blocking/GetBlockingListTest.java | 13 +-
.../blocking/UnblockContactsIQTest.java | 14 +-
.../jivesoftware/smackx/bob/BoBIQTest.java | 17 +-
.../ibb/provider/OpenIQProviderTest.java | 2 +-
.../provider/CapsExtensionProviderTest.java | 14 +-
.../delay/provider/DelayInformationTest.java | 8 +-
.../smackx/forward/ForwardedTest.java | 6 +-
.../smackx/jingle/JingleContentTest.java | 1 +
.../smackx/jingle/JingleErrorTest.java | 1 +
.../smackx/jingle/JingleUtilTest.java | 1 +
.../JingleContentProviderManagerTest.java | 1 +
.../jingle/provider/JingleProviderTest.java | 4 +-
.../jingle_s5b/JingleS5BTransportTest.java | 2 +-
.../smackx/last_interaction/IdleTest.java | 3 +-
.../MessageCorrectExtensionTest.java | 7 +-
.../smackx/mood/MoodConcretisationTest.java | 3 +-
.../smackx/mood/MoodElementTest.java | 5 +-
.../smackx/mood/MoodManagerTest.java | 1 +
.../smackx/pubsub/ConfigureFormTest.java | 3 +-
.../smackx/pubsub/ItemValidationTest.java | 2 +-
.../smackx/pubsub/PubSubNodeTest.java | 2 +-
.../pubsub/provider/PubSubProviderTest.java | 2 +-
.../smackx/receipts/DeliveryReceiptTest.java | 2 +-
.../shim/provider/HeadersProviderTest.java | 2 +-
.../smackx/xdata/packet/DataFormTest.java | 2 +-
.../xdatalayout/packet/DataLayoutTest.java | 9 +-
.../provider/DataValidationTest.java | 17 +-
.../provider/XHTMLExtensionProviderTest.java | 10 +-
.../roster/provider/RosterPacketProvider.java | 23 +-
.../RosterVerStreamFeatureProvider.java | 2 +-
...ptionPreApprovalStreamFeatureProvider.java | 2 +-
.../rosterstore/DirectoryRosterStore.java | 4 +-
.../jivesoftware/smack/roster/RosterTest.java | 2 +-
smack-integration-test/build.gradle | 1 +
.../inttest/XmppConnectionDescriptor.java | 7 +-
.../smackx/jingleold/nat/RTPBridge.java | 11 +-
.../smackx/jingleold/nat/STUN.java | 11 +-
.../smackx/jingleold/nat/STUNResolver.java | 16 +-
.../jingleold/nat/TransportCandidate.java | 1 +
.../smackx/jingleold/packet/JingleError.java | 3 +-
.../JingleContentDescriptionProvider.java | 11 +-
.../provider/JingleContentInfoProvider.java | 3 +-
.../provider/JingleContentProvider.java | 3 +-
.../provider/JingleDescriptionProvider.java | 11 +-
.../jingleold/provider/JingleProvider.java | 10 +-
.../provider/JingleTransportProvider.java | 11 +-
.../workgroup/agent/OfferConfirmation.java | 10 +-
.../workgroup/ext/forms/WorkgroupForm.java | 11 +-
.../ext/history/AgentChatHistory.java | 28 +-
.../workgroup/ext/history/ChatMetadata.java | 11 +-
.../smackx/workgroup/ext/macros/Macros.java | 36 +-
.../smackx/workgroup/ext/notes/ChatNotes.java | 11 +-
.../smackx/workgroup/packet/AgentInfo.java | 11 +-
.../smackx/workgroup/packet/AgentStatus.java | 10 +-
.../workgroup/packet/AgentStatusRequest.java | 16 +-
.../workgroup/packet/AgentWorkgroups.java | 10 +-
.../workgroup/packet/MetaDataProvider.java | 5 +-
.../workgroup/packet/MonitorPacket.java | 11 +-
.../workgroup/packet/OccupantsInfo.java | 21 +-
.../packet/OfferRequestProvider.java | 12 +-
.../workgroup/packet/OfferRevokeProvider.java | 14 +-
.../smackx/workgroup/packet/QueueDetails.java | 15 +-
.../workgroup/packet/QueueOverview.java | 13 +-
.../smackx/workgroup/packet/QueueUpdate.java | 11 +-
.../workgroup/packet/RoomInvitation.java | 8 +-
.../smackx/workgroup/packet/RoomTransfer.java | 9 +-
.../smackx/workgroup/packet/SessionID.java | 5 +-
.../workgroup/packet/TranscriptProvider.java | 11 +-
.../workgroup/packet/TranscriptSearch.java | 11 +-
.../workgroup/packet/TranscriptsProvider.java | 22 +-
.../smackx/workgroup/packet/UserID.java | 4 +-
.../packet/WorkgroupInformation.java | 4 +-
.../workgroup/settings/ChatSettings.java | 23 +-
.../workgroup/settings/GenericSettings.java | 11 +-
.../workgroup/settings/OfflineSettings.java | 17 +-
.../workgroup/settings/SearchSettings.java | 13 +-
.../workgroup/settings/SoundSettings.java | 13 +-
.../settings/WorkgroupProperties.java | 15 +-
.../smackx/workgroup/util/MetaDataUtils.java | 16 +-
.../xevent/provider/MessageEventProvider.java | 11 +-
.../provider/RosterExchangeProvider.java | 10 +-
.../smackx/LegacyInitializerTest.java | 4 +-
.../smackx/omemo/FileBasedOmemoStore.java | 1 +
.../smackx/omemo/OmemoManager.java | 1 +
.../smackx/omemo/OmemoMessage.java | 1 +
.../smackx/omemo/OmemoRatchet.java | 2 +
.../smackx/omemo/OmemoService.java | 2 +
.../jivesoftware/smackx/omemo/OmemoStore.java | 1 +
.../omemo/element/OmemoDeviceListElement.java | 1 +
.../omemo/internal/CipherAndAuthTag.java | 1 +
...OmemoCarbonCopyStanzaReceivedListener.java | 1 +
.../OmemoMessageStanzaReceivedListener.java | 1 +
.../omemo/listener/OmemoMessageListener.java | 1 +
.../listener/OmemoMucMessageListener.java | 1 +
.../provider/OmemoBundleVAxolotlProvider.java | 21 +-
.../OmemoDeviceListVAxolotlProvider.java | 16 +-
.../omemo/provider/OmemoVAxolotlProvider.java | 17 +-
.../omemo/util/MessageOrOmemoMessage.java | 1 +
.../omemo/util/OmemoMessageBuilder.java | 2 +
.../omemo/OmemoBundleVAxolotlElementTest.java | 3 +-
.../OmemoDeviceListVAxolotlElementTest.java | 2 +-
.../smackx/omemo/OmemoKeyUtilTest.java | 1 +
.../smackx/omemo/OmemoServiceTest.java | 1 +
.../omemo/OmemoVAxolotlElementTest.java | 1 +
.../smackx/ox/OpenPgpContact.java | 1 +
.../smackx/ox/OpenPgpManager.java | 3 +-
.../smackx/ox/OpenPgpMessage.java | 3 +-
.../ox/crypto/PainlessOpenPgpProvider.java | 1 +
.../smackx/ox/element/OpenPgpElement.java | 1 +
.../CryptElementReceivedListener.java | 1 +
.../listener/SignElementReceivedListener.java | 1 +
.../SigncryptElementReceivedListener.java | 1 +
.../ox/provider/CryptElementProvider.java | 6 +-
.../OpenPgpContentElementProvider.java | 29 +-
.../ox/provider/OpenPgpElementProvider.java | 6 +-
.../ox/provider/PubkeyElementProvider.java | 12 +-
.../PublicKeysListElementProvider.java | 25 +-
.../ox/provider/SecretkeyElementProvider.java | 6 +-
.../ox/provider/SignElementProvider.java | 6 +-
.../ox/provider/SigncryptElementProvider.java | 6 +-
.../ox/store/abstr/AbstractOpenPgpStore.java | 1 +
.../filebased/FileBasedOpenPgpKeyStore.java | 1 +
.../FileBasedOpenPgpMetadataStore.java | 1 +
.../filebased/FileBasedOpenPgpStore.java | 1 +
.../filebased/FileBasedOpenPgpTrustStore.java | 1 +
.../smackx/ox/util/OpenPgpPubSubUtil.java | 1 +
.../smackx/ox/util/SecretKeyBackupHelper.java | 1 +
.../ox_im/OXInstantMessagingManager.java | 3 +-
.../smackx/ox_im/OxMessageListener.java | 1 +
.../smackx/ox/OpenPgpElementTest.java | 13 +-
.../smackx/ox/OpenPgpStoreTest.java | 12 +-
.../ox/PainlessOpenPgpProviderTest.java | 5 +-
.../smackx/ox/PubSubDelegateTest.java | 3 +-
.../smackx/ox/PubkeyElementTest.java | 5 +-
.../smackx/ox/PublicKeysListElementTest.java | 5 +-
.../smackx/ox/SecretKeyBackupHelperTest.java | 3 +-
.../smackx/ox/SecretkeyElementTest.java | 5 +-
.../ox_im/OXInstantMessagingManagerTest.java | 5 +-
.../DnsOverXmppMiniDnsResolverTest.java | 8 +-
.../smack/sasl/javax/SASLDigestMD5Test.java | 2 +-
.../sasl/provided/SASLDigestMD5Test.java | 4 +-
.../sm/provider/ParseStreamManagement.java | 14 +-
...StreamManagementStreamFeatureProvider.java | 3 +-
.../smack/tcp/XMPPTCPConnection.java | 18 +-
.../smack/tcp/XmppNioTcpConnection.java | 4 +-
.../provider/ParseStreamManagementTest.java | 41 +-
.../smack/tcp/PacketWriterTest.java | 30 +-
.../smack/tcp/TcpInitializerTest.java | 4 +-
smack-xmlparser-stax/build.gradle | 7 +
.../smack/xml/stax/StaxXmlPullParser.java | 301 +++++++++++++
.../xml/stax/StaxXmlPullParserFactory.java | 50 +++
.../smack/xml/stax/package-info.java | 23 +
...ivesoftware.smack.xml.XmlPullParserFactory | 1 +
.../smack/xml/stax/StaxParserTest.java | 36 ++
smack-xmlparser-xpp3/build.gradle | 13 +
.../smack/xml/xpp3/Xpp3XmlPullParser.java | 302 +++++++++++++
.../xml/xpp3/Xpp3XmlPullParserFactory.java | 86 ++++
.../smack/xml/xpp3/package-info.java | 23 +
...ivesoftware.smack.xml.XmlPullParserFactory | 1 +
.../smack/xml/xpp3/Xpp3ParserTest.java | 36 ++
smack-xmlparser/build.gradle | 2 +
.../smack/xml/SmackXmlParser.java | 57 +++
.../jivesoftware/smack/xml/XmlPullParser.java | 169 ++++++++
.../smack/xml/XmlPullParserException.java | 30 ++
.../smack/xml/XmlPullParserFactory.java | 25 ++
.../jivesoftware/smack/xml/package-info.java | 21 +
414 files changed, 3855 insertions(+), 2041 deletions(-)
create mode 100644 smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java
create mode 100644 smack-core/src/test/java/org/jivesoftware/smack/xml/XmlPullParserTest.java
create mode 100644 smack-xmlparser-stax/build.gradle
create mode 100644 smack-xmlparser-stax/src/main/java/org/jivesoftware/smack/xml/stax/StaxXmlPullParser.java
create mode 100644 smack-xmlparser-stax/src/main/java/org/jivesoftware/smack/xml/stax/StaxXmlPullParserFactory.java
create mode 100644 smack-xmlparser-stax/src/main/java/org/jivesoftware/smack/xml/stax/package-info.java
create mode 100644 smack-xmlparser-stax/src/main/resources/META-INF/services/org.jivesoftware.smack.xml.XmlPullParserFactory
create mode 100644 smack-xmlparser-stax/src/test/java/org/jivesoftware/smack/xml/stax/StaxParserTest.java
create mode 100644 smack-xmlparser-xpp3/build.gradle
create mode 100644 smack-xmlparser-xpp3/src/main/java/org/jivesoftware/smack/xml/xpp3/Xpp3XmlPullParser.java
create mode 100644 smack-xmlparser-xpp3/src/main/java/org/jivesoftware/smack/xml/xpp3/Xpp3XmlPullParserFactory.java
create mode 100644 smack-xmlparser-xpp3/src/main/java/org/jivesoftware/smack/xml/xpp3/package-info.java
create mode 100644 smack-xmlparser-xpp3/src/main/resources/META-INF/services/org.jivesoftware.smack.xml.XmlPullParserFactory
create mode 100644 smack-xmlparser-xpp3/src/test/java/org/jivesoftware/smack/xml/xpp3/Xpp3ParserTest.java
create mode 100644 smack-xmlparser/build.gradle
create mode 100644 smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/SmackXmlParser.java
create mode 100644 smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParser.java
create mode 100644 smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParserException.java
create mode 100644 smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/XmlPullParserFactory.java
create mode 100644 smack-xmlparser/src/main/java/org/jivesoftware/smack/xml/package-info.java
diff --git a/build.gradle b/build.gradle
index 5c997dcbb..4b01e13e4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -24,6 +24,7 @@ apply from: 'version.gradle'
allprojects {
apply plugin: 'java'
+ apply plugin: 'java-library'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'jacoco'
@@ -80,6 +81,8 @@ allprojects {
':smack-omemo',
':smack-omemo-signal',
':smack-openpgp',
+ ':smack-xmlparser',
+ ':smack-xmlparser-xpp3',
].collect{ project(it) }
androidBootClasspathProjects = [
':smack-android',
@@ -97,13 +100,37 @@ allprojects {
':smack-omemo-signal',
':smack-omemo-signal-integration-test',
].collect{ project(it) }
+ // When this list is empty, then move the according javadoc
+ // tool Werror option into the global configure section.
+ nonStrictJavadocProjects = [
+ ':smack-bosh',
+ ':smack-core',
+ ':smack-experimental',
+ ':smack-extensions',
+ ':smack-im',
+ ':smack-integration-test',
+ ':smack-jingle-old',
+ ':smack-legacy',
+ ':smack-omemo',
+ ':smack-tcp',
+ ].collect{ project(it) }
// Lazily evaluate the Android bootClasspath and offline
// Javadoc using a closure, so that targets which do not
// require it are still able to succeed without an Android
// SDK.
androidBootClasspath = { getAndroidRuntimeJar() }
androidJavadocOffline = { getAndroidJavadocOffline() }
- junitVersion = '5.2.0'
+ junit4Projects = [
+ ':smack-core',
+ ':smack-extensions',
+ ':smack-im',
+ ':smack-integration-test',
+ ':smack-omemo',
+ ':smack-omemo-signal',
+ ':smack-openpgp',
+ ].collect { project(it) }
+ junitVersion = '5.4.2'
+ powerMockVersion = '1.7.3'
}
group = 'org.igniterealtime.smack'
sourceCompatibility = JavaVersion.VERSION_1_8
@@ -114,6 +141,12 @@ allprojects {
}
test {
+ useJUnitPlatform()
+
+ // Enable once the tests are fixed that sometimes break if
+ // they are executed in parallel (.e.g Socks5)
+ // maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
+
// Enable full stacktraces of failed tests. Especially handy
// for environments like Travis.
testLogging {
@@ -232,6 +265,10 @@ allprojects {
}
dependencies {
+ testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
+ testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
+ testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
+
errorprone 'com.google.errorprone:error_prone_core:2.3.2'
errorproneJavac('com.google.errorprone:javac:9+181-r4173-1')
}
@@ -241,6 +278,15 @@ allprojects {
test { dependsOn javadoc }
}
+configure (junit4Projects) {
+ dependencies {
+ testImplementation "org.junit.vintage:junit-vintage-engine:$junitVersion"
+ testImplementation "org.powermock:powermock-module-junit4:$powerMockVersion"
+ testImplementation "org.powermock:powermock-module-junit4-rule:$powerMockVersion"
+ testImplementation "org.powermock:powermock-api-mockito2:$powerMockVersion"
+ }
+}
+
gradle.taskGraph.whenReady { taskGraph ->
if (signingRequired
&& taskGraph.allTasks.any { it instanceof Sign }) {
@@ -532,6 +578,15 @@ subprojects*.jar {
}
}
+configure(subprojects - nonStrictJavadocProjects) {
+ tasks.withType(Javadoc) {
+ // Abort on javadoc warnings.
+ // See JDK-8200363 (https://bugs.openjdk.java.net/browse/JDK-8200363)
+ // for information about the -Xwerror option.
+ options.addStringOption('Xwerror', '-quiet')
+ }
+}
+
configure(subprojects - gplLicensedProjects) {
checkstyle {
configProperties.checkstyleLicenseHeader = "header"
diff --git a/documentation/developer/provider.md b/documentation/developer/provider.md
index cd5255af5..465caeb32 100644
--- a/documentation/developer/provider.md
+++ b/documentation/developer/provider.md
@@ -27,11 +27,11 @@ public MyExtension parse(XmlPullParser parser, int initialDepth) {
outerloop: while(true) {
// Make sure to have already parse all attributes of the outermost element,
// i.e. 'attrFoo' of 'myExtension' in this example. Then advance the parser
- int event = parser.next();
+ XmlPullParser.Event event = parser.next();
// Use switch/case of int instead of a if/else-if cascade
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
// Determine the name of the element which start tag we are seeing
String name = parser.getName();
// We can use switch/case of Strings since Java7, make use of its advantages
@@ -52,12 +52,15 @@ public MyExtension parse(XmlPullParser parser, int initialDepth) {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
// The abort condition with the break labeled loop statement
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
diff --git a/documentation/providers.md b/documentation/providers.md
index 00457d5d9..f5e57e705 100644
--- a/documentation/providers.md
+++ b/documentation/providers.md
@@ -23,7 +23,7 @@ Whenever a packet extension is found in a packet, parsing will be
passed to the correct provider. Each provider must extend the
ExtensionElementProvider abstract class. Each extension provider is
responsible for parsing the raw XML stream, via the
-[XML Pull Parser](http://www.xmlpull.org/), to contruct an object.
+Smack's `XmlPullParser` interface, to construct an object.
You can also create an introspection provider
(`provider.IntrospectionProvider.PacketExtensionIntrospectionProvider`). Here,
@@ -161,9 +161,9 @@ public class MyIQProvider extends IQProvider {
// Start parsing loop
outerloop: while(true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch(eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
switch (elementName) {
case "user":
@@ -175,12 +175,15 @@ public class MyIQProvider extends IQProvider {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
// Abort condition: if the are on a end tag (closing element) of the same depth
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
@@ -225,9 +228,9 @@ _Disco Items IQProvider_
String node = "";
discoverItems.setNode(parser.getAttributeValue("", "node"));
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
switch (elementName) {
case "item":
@@ -239,7 +242,7 @@ _Disco Items IQProvider_
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
String elementName = parser.getName();
switch (elementName) {
case "item":
@@ -295,17 +298,17 @@ _Subscription PacketExtensionProvider Implementation_
String state = parser.getAttributeValue(null, "subscription");
boolean isRequired = false;
- int tag = parser.next();
+ XmlPullParser.Event tag = parser.next();
- if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("subscribe-options")) {
+ if ((tag == XmlPullParser.START_ELEMENT) && parser.getName().equals("subscribe-options")) {
tag = parser.next();
- if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("required"))
+ if ((tag == XmlPullParser.START_ELEMENT) && parser.getName().equals("required"))
isRequired = true;
- while (parser.next() != XmlPullParser.END_TAG && parser.getName() != "subscribe-options");
+ while (parser.next() != XmlPullParser.END_ELEMENT && parser.getName() != "subscribe-options");
}
- while (parser.getEventType() != XmlPullParser.END_TAG) parser.next();
+ while (parser.getEventType() != XmlPullParser.END_ELEMENT) parser.next();
return new Subscription(jid, nodeId, subId, state == null ? null : Subscription.State.valueOf(state), isRequired);
}
}
diff --git a/resources/releasedocs/README.html b/resources/releasedocs/README.html
index 195858a8f..d25eaf624 100644
--- a/resources/releasedocs/README.html
+++ b/resources/releasedocs/README.html
@@ -169,14 +169,10 @@ recommended when using Smack.
-If you dont' use a
-dependency resolution system, like gradle or maven, then you will need
-to download at least
-the Xml
-Pull Parser 3rd Edition (XPP3) library or any other library that
-implements the XmlPullParser interface
-(like kXML) and the set of
-jXMPP libraries.
+ Smack tries to depend on as few as possible libraries. The only
+ requirement is jXMPP. For DNS
+ resolution we recommend to
+ use MiniDNS.
diff --git a/settings.gradle b/settings.gradle
index 6188d60b6..d3b53d80e 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -28,4 +28,7 @@ include 'smack-core',
'smack-omemo-signal',
'smack-omemo-signal-integration-test',
'smack-repl',
- 'smack-openpgp'
+ 'smack-openpgp',
+ 'smack-xmlparser',
+ 'smack-xmlparser-stax',
+ 'smack-xmlparser-xpp3'
diff --git a/smack-android/build.gradle b/smack-android/build.gradle
index 63fa35d2f..46827c09f 100644
--- a/smack-android/build.gradle
+++ b/smack-android/build.gradle
@@ -7,6 +7,7 @@ smack-extensions and smack-experimental."""
// Note that the test dependencies (junit, …) are inferred from the
// sourceSet.test of the core subproject
dependencies {
+ api project(':smack-xmlparser-xpp3')
// Depend on minidns-android21 as optional dependency, even if may
// not need it. Can't hurt to have it in the programm path with
// the correct MiniDNS version as it won't hurt even if the
diff --git a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java
index 7e1d97122..592e0633c 100644
--- a/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java
+++ b/smack-bosh/src/main/java/org/jivesoftware/smack/bosh/XMPPBOSHConnection.java
@@ -20,7 +20,6 @@ package org.jivesoftware.smack.bosh;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
-import java.io.StringReader;
import java.io.Writer;
import java.util.Map;
import java.util.logging.Level;
@@ -44,6 +43,7 @@ import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Success;
import org.jivesoftware.smack.util.CloseableUtil;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.igniterealtime.jbosh.AbstractBody;
import org.igniterealtime.jbosh.BOSHClient;
@@ -56,11 +56,8 @@ import org.igniterealtime.jbosh.BOSHException;
import org.igniterealtime.jbosh.BOSHMessageEvent;
import org.igniterealtime.jbosh.BodyQName;
import org.igniterealtime.jbosh.ComposableBody;
-
import org.jxmpp.jid.DomainBareJid;
import org.jxmpp.jid.parts.Resourcepart;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserFactory;
/**
* Creates a connection to an XMPP server via HTTP binding.
@@ -479,14 +476,13 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
if (streamId == null) {
streamId = body.getAttribute(BodyQName.create(XMPPBOSHConnection.BOSH_URI, "authid"));
}
- final XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(new StringReader(body.toXML()));
- int eventType = parser.getEventType();
+ final XmlPullParser parser = PacketParserUtils.getParserFor(body.toXML());
+
+ XmlPullParser.Event eventType = parser.getEventType();
do {
eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
switch (name) {
case Message.ELEMENT:
@@ -528,9 +524,12 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
}
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != XmlPullParser.Event.END_DOCUMENT);
}
catch (Exception e) {
if (isConnected()) {
diff --git a/smack-core/build.gradle b/smack-core/build.gradle
index 69ee5d468..c2ce38504 100644
--- a/smack-core/build.gradle
+++ b/smack-core/build.gradle
@@ -2,23 +2,19 @@ description = """\
Smack core components."""
ext {
- xmlUnitVersion = "2.6.0"
- powerMockVersion = "1.7.3"
+ xmlUnitVersion = '2.6.2'
}
dependencies {
- compile 'xpp3:xpp3:1.1.4c'
+ compile project(':smack-xmlparser')
compile "org.jxmpp:jxmpp-core:$jxmppVersion"
compile "org.jxmpp:jxmpp-jid:$jxmppVersion"
compile "org.minidns:minidns-core:$miniDnsVersion"
+ testCompile project(':smack-xmlparser-stax')
+ testCompile project(':smack-xmlparser-xpp3')
testCompile "org.jxmpp:jxmpp-jid:$jxmppVersion:tests"
- testCompile "org.junit.jupiter:junit-jupiter-api:$junitVersion"
- testCompile "org.junit.vintage:junit-vintage-engine:$junitVersion"
testCompile "org.xmlunit:xmlunit-core:$xmlUnitVersion"
testCompile "org.xmlunit:xmlunit-legacy:$xmlUnitVersion"
- testCompile "org.powermock:powermock-module-junit4:$powerMockVersion"
- testCompile "org.powermock:powermock-module-junit4-rule:$powerMockVersion"
- testCompile "org.powermock:powermock-api-mockito2:$powerMockVersion"
testCompile 'com.jamesmurty.utils:java-xmlbuilder:1.2'
}
diff --git a/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java b/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java
index e9261f516..ef7d5ee85 100644
--- a/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java
+++ b/smack-core/src/integration-test/java/org/jivesoftware/smack/packet/PrivacyProviderTest.java
@@ -16,9 +16,9 @@ package org.jivesoftware.smack.packet;
import org.jivesoftware.smack.provider.PrivacyProvider;
import org.jivesoftware.smack.test.SmackTestCase;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import java.io.StringReader;
diff --git a/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java b/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java
index e44c6e15a..9bceba3f7 100644
--- a/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java
+++ b/smack-core/src/integration-test/java/org/jivesoftware/smack/test/SmackTestCase.java
@@ -32,8 +32,8 @@ import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.TCPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.util.ConnectionUtils;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
/**
* Base class for all the test cases which provides a pre-configured execution context. This
@@ -414,9 +414,9 @@ public abstract class SmackTestCase extends TestCase {
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
parser.setInput(systemStream, "UTF-8");
- int eventType = parser.getEventType();
+ XmlPullParser.Event eventType = parser.getEventType();
do {
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == START_ELEMENT) {
if (parser.getName().equals("host")) {
host = parser.nextText();
}
@@ -459,7 +459,7 @@ public abstract class SmackTestCase extends TestCase {
}
eventType = parser.next();
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != END_DOCUMENT);
parsedOK = true;
}
catch (Exception e) {
diff --git a/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java b/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java
index a375e0d81..8d2a0df4f 100644
--- a/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java
+++ b/smack-core/src/integration-test/java/org/jivesoftware/smack/util/XMPPErrorTest.java
@@ -20,9 +20,9 @@ import java.io.StringReader;
import org.jivesoftware.smack.packet.XMPPError;
import org.jivesoftware.smack.test.SmackTestCase;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public class XMPPErrorTest extends SmackTestCase {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java
index e82ad15aa..632855ac2 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/AbstractXMPPConnection.java
@@ -121,6 +121,8 @@ import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.dns.HostAddress;
import org.jivesoftware.smack.util.dns.SmackDaneProvider;
import org.jivesoftware.smack.util.dns.SmackDaneVerifier;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.DomainBareJid;
import org.jxmpp.jid.EntityFullJid;
@@ -130,8 +132,6 @@ import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.stringprep.XmppStringprepException;
import org.jxmpp.util.XmppStringUtils;
import org.minidns.dnsname.DnsName;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
/**
@@ -1614,9 +1614,9 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
streamFeatures.clear();
final int initialDepth = parser.getDepth();
while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
- if (eventType == XmlPullParser.START_TAG && parser.getDepth() == initialDepth + 1) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT && parser.getDepth() == initialDepth + 1) {
FullyQualifiedElement streamFeature = null;
String name = parser.getName();
String namespace = parser.getNamespace();
@@ -1647,7 +1647,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
addStreamFeature(streamFeature);
}
}
- else if (eventType == XmlPullParser.END_TAG && parser.getDepth() == initialDepth) {
+ else if (eventType == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == initialDepth) {
break;
}
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java b/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java
index 10695df47..6f06e4d33 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/SmackConfiguration.java
@@ -29,6 +29,7 @@ import javax.net.ssl.HostnameVerifier;
import org.jivesoftware.smack.compression.XMPPInputOutputStream;
import org.jivesoftware.smack.debugger.ReflectionDebuggerFactory;
import org.jivesoftware.smack.debugger.SmackDebuggerFactory;
+import org.jivesoftware.smack.parsing.ExceptionThrowingCallback;
import org.jivesoftware.smack.parsing.ExceptionThrowingCallbackWithHint;
import org.jivesoftware.smack.parsing.ParsingExceptionCallback;
import org.jivesoftware.smack.util.Objects;
@@ -380,4 +381,5 @@ public final class SmackConfiguration {
public static int getDefaultConcurrencyLevelLimit() {
return defaultConcurrencyLevelLimit;
}
+
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java b/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java
index 701004696..56ce677ce 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/SmackInitialization.java
@@ -44,10 +44,10 @@ import org.jivesoftware.smack.sasl.core.SCRAMSHA1Mechanism;
import org.jivesoftware.smack.sasl.core.ScramSha1PlusMechanism;
import org.jivesoftware.smack.util.CloseableUtil;
import org.jivesoftware.smack.util.FileUtils;
+import org.jivesoftware.smack.util.PacketParserUtils;
import org.jivesoftware.smack.util.StringUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class SmackInitialization {
@@ -141,12 +141,10 @@ public final class SmackInitialization {
public static void processConfigFile(InputStream cfgFileStream,
Collection exceptions, ClassLoader classLoader) throws Exception {
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(cfgFileStream, "UTF-8");
- int eventType = parser.getEventType();
+ XmlPullParser parser = PacketParserUtils.getParserFor(cfgFileStream);
+ XmlPullParser.Event eventType = parser.getEventType();
do {
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT) {
if (parser.getName().equals("startupClasses")) {
parseClassesToLoad(parser, false, exceptions, classLoader);
}
@@ -156,7 +154,7 @@ public final class SmackInitialization {
}
eventType = parser.next();
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != XmlPullParser.Event.END_DOCUMENT);
CloseableUtil.maybeClose(cfgFileStream, LOGGER);
}
@@ -164,12 +162,10 @@ public final class SmackInitialization {
Collection exceptions, ClassLoader classLoader)
throws Exception {
final String startName = parser.getName();
- int eventType;
- String name;
+ XmlPullParser.Event eventType;
outerloop: do {
eventType = parser.next();
- name = parser.getName();
- if (eventType == XmlPullParser.START_TAG && "className".equals(name)) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT && "className".equals(parser.getName())) {
String classToLoad = parser.nextText();
if (SmackConfiguration.isDisabledSmackClass(classToLoad)) {
continue outerloop;
@@ -188,7 +184,7 @@ public final class SmackInitialization {
}
}
}
- while (!(eventType == XmlPullParser.END_TAG && startName.equals(name)));
+ while (!(eventType == XmlPullParser.Event.END_ELEMENT && startName.equals(parser.getName())));
}
private static void loadSmackClass(String className, boolean optional, ClassLoader classLoader) throws Exception {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java
index 8b02ef95b..fbed9abd3 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/CompressedProvider.java
@@ -20,7 +20,7 @@ import org.jivesoftware.smack.compress.packet.Compressed;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.provider.NonzaProvider;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class CompressedProvider extends NonzaProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java
index eaa9a980d..cf90f594b 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/compress/provider/FailureProvider.java
@@ -27,8 +27,8 @@ import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.provider.NonzaProvider;
import org.jivesoftware.smack.util.PacketParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public final class FailureProvider extends NonzaProvider {
@@ -46,9 +46,9 @@ public final class FailureProvider extends NonzaProvider {
XmlEnvironment failureXmlEnvironment = XmlEnvironment.from(parser, xmlEnvironment);
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String namespace = parser.getNamespace();
switch (namespace) {
@@ -72,11 +72,12 @@ public final class FailureProvider extends NonzaProvider {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default: // fall out
}
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java b/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java
index 99c8ac6b6..3330202d3 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/fsm/AbstractXmppStateMachineConnection.java
@@ -57,10 +57,10 @@ import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Challenge;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.Success;
import org.jivesoftware.smack.util.Objects;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.parts.Resourcepart;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPConnection {
@@ -310,10 +310,10 @@ public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPCon
// Skip the enclosing stream open what is guaranteed to be there.
parser.next();
- int event = parser.getEventType();
+ XmlPullParser.Event event = parser.getEventType();
outerloop: while (true) {
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
final String name = parser.getName();
// Note that we don't handle "stream" here as it's done in the splitter.
switch (name) {
@@ -353,8 +353,9 @@ public abstract class AbstractXmppStateMachineConnection extends AbstractXMPPCon
break;
}
break;
- case XmlPullParser.END_DOCUMENT:
+ case END_DOCUMENT:
break outerloop;
+ default: // fall out
}
event = parser.next();
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java
index da69cb240..0e713a04c 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/packet/XmlEnvironment.java
@@ -19,7 +19,7 @@ package org.jivesoftware.smack.packet;
import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smack.util.StringUtils;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public class XmlEnvironment {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java
index 4b9f77acf..cceaf4216 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/parsing/StandardExtensionElementProvider.java
@@ -1,6 +1,6 @@
/**
*
- * Copyright 2015 Florian Schmaus.
+ * Copyright 2015-2019 Florian Schmaus.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,8 +26,8 @@ import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.util.ParserUtils;
import org.jivesoftware.smack.util.StringUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
/**
* The parser for {@link StandardExtensionElement}s.
@@ -47,7 +47,7 @@ public class StandardExtensionElementProvider extends ExtensionElementProvider attributes = new LinkedHashMap<>(namespaceCount + attributeCount);
for (int i = 0; i < namespaceCount; i++) {
@@ -77,19 +77,22 @@ public class StandardExtensionElementProvider extends ExtensionElementProvider {
@@ -34,9 +34,9 @@ public class BindIQProvider extends IQProvider {
String name;
Bind bind = null;
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
name = parser.getName();
switch (name) {
case "resource":
@@ -49,11 +49,14 @@ public class BindIQProvider extends IQProvider {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return bind;
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java
index ad6cefdaf..df85d067c 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/BodyElementProvider.java
@@ -24,8 +24,8 @@ import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.util.ParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public class BodyElementProvider extends ExtensionElementProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java
index 6226d5d3d..f572d876d 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/EmbeddedExtensionProvider.java
@@ -27,8 +27,8 @@ import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.util.PacketParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
/**
*
@@ -97,14 +97,14 @@ public abstract class EmbeddedExtensionProvider ext
}
List extensions = new ArrayList<>();
- int event;
+ XmlPullParser.Event event;
do {
event = parser.next();
- if (event == XmlPullParser.START_TAG)
+ if (event == XmlPullParser.Event.START_ELEMENT)
PacketParserUtils.addExtensionElement(extensions, parser, xmlEnvironment);
}
- while (!(event == XmlPullParser.END_TAG && parser.getDepth() == initialDepth));
+ while (!(event == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == initialDepth));
return createReturnExtension(name, namespace, attMap, extensions);
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java
index 3c952bbf6..a4c58f406 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/IntrospectionProvider.java
@@ -24,8 +24,8 @@ import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.util.ParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
public class IntrospectionProvider{
@@ -81,9 +81,9 @@ public class IntrospectionProvider{
ParserUtils.assertAtStartTag(parser);
Object object = objectClass.getConstructor().newInstance();
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String stringValue = parser.nextText();
Class> propertyType = object.getClass().getMethod(
@@ -97,11 +97,14 @@ public class IntrospectionProvider{
propertyType).invoke(object, value);
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
ParserUtils.assertAtEndTag(parser);
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
index 46205fd6a..ef1a225d9 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/Provider.java
@@ -26,8 +26,8 @@ import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.util.ParserUtils;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
/**
* Smack provider are the parsers used to deserialize raw XMPP into the according Java {@link Element}s.
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java
index c8b879306..e39f81d26 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/ProviderFileLoader.java
@@ -26,9 +26,8 @@ import java.util.logging.Logger;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.packet.IQ;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserFactory;
+import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
/**
* Loads the {@link IQProvider} and {@link ExtensionElementProvider} information from a standard provider file in preparation
@@ -54,12 +53,10 @@ public class ProviderFileLoader implements ProviderLoader {
public ProviderFileLoader(InputStream providerStream, ClassLoader classLoader) {
// Load processing providers.
try (InputStream is = providerStream) {
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- parser.setInput(is, "UTF-8");
- int eventType = parser.getEventType();
+ XmlPullParser parser = PacketParserUtils.getParserFor(is);
+ XmlPullParser.Event eventType = parser.getEventType();
do {
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT) {
final String typeName = parser.getName();
try {
@@ -134,7 +131,7 @@ public class ProviderFileLoader implements ProviderLoader {
}
eventType = parser.next();
}
- while (eventType != XmlPullParser.END_DOCUMENT);
+ while (eventType != XmlPullParser.Event.END_DOCUMENT);
}
catch (Exception e) {
LOGGER.log(Level.SEVERE, "Unknown error occurred while parsing provider file", e);
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java
index 6211e6cc0..2509d89c8 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsFailureProvider.java
@@ -19,7 +19,7 @@ package org.jivesoftware.smack.provider;
import org.jivesoftware.smack.packet.TlsProceed;
import org.jivesoftware.smack.packet.XmlEnvironment;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class TlsFailureProvider extends NonzaProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java
index 3be9f904f..f8e8b1158 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/provider/TlsProceedProvider.java
@@ -19,7 +19,7 @@ package org.jivesoftware.smack.provider;
import org.jivesoftware.smack.packet.TlsFailure;
import org.jivesoftware.smack.packet.XmlEnvironment;
-import org.xmlpull.v1.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
public final class TlsProceedProvider extends NonzaProvider {
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java
index dd065fe92..13ce501fb 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/util/PacketParserUtils.java
@@ -17,18 +17,19 @@
package org.jivesoftware.smack.util;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.logging.Level;
import java.util.logging.Logger;
-import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.compress.packet.Compress;
import org.jivesoftware.smack.packet.EmptyResultIQ;
import org.jivesoftware.smack.packet.ErrorIQ;
@@ -49,11 +50,11 @@ import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
+import org.jivesoftware.smack.xml.SmackXmlParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.Jid;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
/**
* Utility class that helps to parse packets. Any parsing packets method that must be shared
@@ -64,51 +65,27 @@ import org.xmlpull.v1.XmlPullParserFactory;
public class PacketParserUtils {
private static final Logger LOGGER = Logger.getLogger(PacketParserUtils.class.getName());
- public static final String FEATURE_XML_ROUNDTRIP = "http://xmlpull.org/v1/doc/features.html#xml-roundtrip";
-
- private static final XmlPullParserFactory XML_PULL_PARSER_FACTORY;
-
- /**
- * True if the XmlPullParser supports the XML_ROUNDTRIP feature.
- */
- public static final boolean XML_PULL_PARSER_SUPPORTS_ROUNDTRIP;
-
- static {
- // Ensure that Smack is initialized.
- SmackConfiguration.getVersion();
-
- XmlPullParser xmlPullParser;
- boolean roundtrip = false;
- try {
- XML_PULL_PARSER_FACTORY = XmlPullParserFactory.newInstance();
- xmlPullParser = XML_PULL_PARSER_FACTORY.newPullParser();
- try {
- xmlPullParser.setFeature(FEATURE_XML_ROUNDTRIP, true);
- // We could successfully set the feature
- roundtrip = true;
- } catch (XmlPullParserException e) {
- // Doesn't matter if FEATURE_XML_ROUNDTRIP isn't available
- LOGGER.log(Level.FINEST, "XmlPullParser does not support XML_ROUNDTRIP", e);
- }
- }
- catch (XmlPullParserException e) {
- // Something really bad happened
- throw new AssertionError(e);
- }
- XML_PULL_PARSER_SUPPORTS_ROUNDTRIP = roundtrip;
- }
-
// TODO: Rename argument name from 'stanza' to 'element'.
public static XmlPullParser getParserFor(String stanza) throws XmlPullParserException, IOException {
return getParserFor(new StringReader(stanza));
}
+ public static XmlPullParser getParserFor(InputStream inputStream) throws XmlPullParserException {
+ InputStreamReader inputStreamReader;
+ try {
+ inputStreamReader = new InputStreamReader(inputStream, StringUtils.UTF8);
+ } catch (UnsupportedEncodingException e) {
+ throw new AssertionError(e);
+ }
+ return SmackXmlParser.newXmlParser(inputStreamReader);
+ }
+
public static XmlPullParser getParserFor(Reader reader) throws XmlPullParserException, IOException {
- XmlPullParser parser = newXmppParser(reader);
+ XmlPullParser parser = SmackXmlParser.newXmlParser(reader);
// Wind the parser forward to the first start tag
- int event = parser.getEventType();
- while (event != XmlPullParser.START_TAG) {
- if (event == XmlPullParser.END_DOCUMENT) {
+ XmlPullParser.Event event = parser.getEventType();
+ while (event != XmlPullParser.Event.START_ELEMENT) {
+ if (event == XmlPullParser.Event.END_DOCUMENT) {
throw new IllegalArgumentException("Document contains no start tag");
}
event = parser.next();
@@ -116,26 +93,6 @@ public class PacketParserUtils {
return parser;
}
- public static XmlPullParser getParserFor(String stanza, String startTag)
- throws XmlPullParserException, IOException {
- XmlPullParser parser = getParserFor(stanza);
-
- while (true) {
- int event = parser.getEventType();
- String name = parser.getName();
- if (event == XmlPullParser.START_TAG && name.equals(startTag)) {
- break;
- }
- else if (event == XmlPullParser.END_DOCUMENT) {
- throw new IllegalArgumentException("Could not find start tag '" + startTag
- + "' in stanza: " + stanza);
- }
- parser.next();
- }
-
- return parser;
- }
-
@SuppressWarnings("unchecked")
public static S parseStanza(String stanza) throws Exception {
return (S) parseStanza(getParserFor(stanza), null);
@@ -166,53 +123,6 @@ public class PacketParserUtils {
}
}
- /**
- * Creates a new XmlPullParser suitable for parsing XMPP. This means in particular that
- * FEATURE_PROCESS_NAMESPACES is enabled.
- *
- * Note that not all XmlPullParser implementations will return a String on
- * getText()
if the parser is on START_TAG or END_TAG. So you must not rely on this
- * behavior when using the parser.
- *
- *
- * @return A suitable XmlPullParser for XMPP parsing
- * @throws XmlPullParserException
- */
- public static XmlPullParser newXmppParser() throws XmlPullParserException {
- XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
- parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
- if (XML_PULL_PARSER_SUPPORTS_ROUNDTRIP) {
- try {
- parser.setFeature(FEATURE_XML_ROUNDTRIP, true);
- }
- catch (XmlPullParserException e) {
- LOGGER.log(Level.SEVERE,
- "XmlPullParser does not support XML_ROUNDTRIP, although it was first determined to be supported",
- e);
- }
- }
- return parser;
- }
-
- /**
- * Creates a new XmlPullParser suitable for parsing XMPP. This means in particular that
- * FEATURE_PROCESS_NAMESPACES is enabled.
- *
- * Note that not all XmlPullParser implementations will return a String on
- * getText()
if the parser is on START_TAG or END_TAG. So you must not rely on this
- * behavior when using the parser.
- *
- *
- * @param reader
- * @return A suitable XmlPullParser for XMPP parsing
- * @throws XmlPullParserException
- */
- public static XmlPullParser newXmppParser(Reader reader) throws XmlPullParserException {
- XmlPullParser parser = newXmppParser();
- parser.setInput(reader);
- return parser;
- }
-
public static Message parseMessage(XmlPullParser parser) throws XmlPullParserException, IOException, SmackParsingException {
return parseMessage(parser, null);
}
@@ -249,9 +159,9 @@ public class PacketParserUtils {
// in arbitrary sub-elements.
String thread = null;
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
String namespace = parser.getNamespace();
switch (elementName) {
@@ -276,11 +186,12 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default: // fall out
}
}
@@ -295,9 +206,9 @@ public class PacketParserUtils {
/**
* Returns the textual content of an element as String. After this method returns the parser
- * position will be END_TAG, following the established pull parser calling convention.
+ * position will be END_ELEMENT, following the established pull parser calling convention.
*
- * The parser must be positioned on a START_TAG of an element which MUST NOT contain Mixed
+ * The parser must be positioned on a START_ELEMENT of an element which MUST NOT contain Mixed
* Content (as defined in XML 3.2.2), or else an XmlPullParserException will be thrown.
*
* This method is used for the parts where the XMPP specification requires elements that contain
@@ -309,41 +220,36 @@ public class PacketParserUtils {
* @throws IOException
*/
public static String parseElementText(XmlPullParser parser) throws XmlPullParserException, IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
String res;
- if (parser.isEmptyElementTag()) {
- res = "";
- }
- else {
- // Advance to the text of the Element
- int event = parser.next();
- if (event != XmlPullParser.TEXT) {
- if (event == XmlPullParser.END_TAG) {
- // Assume this is the end tag of the start tag at the
- // beginning of this method. Typical examples where this
- // happens are body elements containing the empty string,
- // ie. , which appears to be valid XMPP, or a
- // least it's not explicitly forbidden by RFC 6121 5.2.3
- return "";
- } else {
- throw new XmlPullParserException(
- "Non-empty element tag not followed by text, while Mixed Content (XML 3.2.2) is disallowed");
- }
- }
- res = parser.getText();
- event = parser.next();
- if (event != XmlPullParser.END_TAG) {
+ // Advance to the text of the Element
+ XmlPullParser.Event event = parser.next();
+ if (event != XmlPullParser.Event.TEXT_CHARACTERS) {
+ if (event == XmlPullParser.Event.END_ELEMENT) {
+ // Assume this is the end tag of the start tag at the
+ // beginning of this method. Typical examples where this
+ // happens are body elements containing the empty string,
+ // ie. , which appears to be valid XMPP, or a
+ // least it's not explicitly forbidden by RFC 6121 5.2.3
+ return "";
+ } else {
throw new XmlPullParserException(
- "Non-empty element tag contains child-elements, while Mixed Content (XML 3.2.2) is disallowed");
+ "Non-empty element tag not followed by text, while Mixed Content (XML 3.2.2) is disallowed");
}
}
+ res = parser.getText();
+ event = parser.next();
+ if (event != XmlPullParser.Event.END_ELEMENT) {
+ throw new XmlPullParserException(
+ "Non-empty element tag contains child-elements, while Mixed Content (XML 3.2.2) is disallowed");
+ }
return res;
}
/**
* Returns the current element as string.
*
- * The parser must be positioned on START_TAG.
+ * The parser must be positioned on START_ELEMENT.
*
* Note that only the outermost namespace attributes ("xmlns") will be returned, not nested ones.
*
@@ -359,37 +265,10 @@ public class PacketParserUtils {
public static CharSequence parseElement(XmlPullParser parser,
boolean fullNamespaces) throws XmlPullParserException,
IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
return parseContentDepth(parser, parser.getDepth(), fullNamespaces);
}
- /**
- * Returns the content of a element.
- *
- * The parser must be positioned on the START_TAG of the element which content is going to get
- * returned. If the current element is the empty element, then the empty string is returned. If
- * it is a element which contains just text, then just the text is returned. If it contains
- * nested elements (and text), then everything from the current opening tag to the corresponding
- * closing tag of the same depth is returned as String.
- *
- * Note that only the outermost namespace attributes ("xmlns") will be returned, not nested ones.
- *
- * @param parser the XML pull parser
- * @return the content of a tag
- * @throws XmlPullParserException if parser encounters invalid XML
- * @throws IOException if an IO error occurs
- */
- public static CharSequence parseContent(XmlPullParser parser)
- throws XmlPullParserException, IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
- if (parser.isEmptyElementTag()) {
- return "";
- }
- // Advance the parser, since we want to parse the content of the current element
- parser.next();
- return parseContentDepth(parser, parser.getDepth(), false);
- }
-
public static CharSequence parseContentDepth(XmlPullParser parser, int depth)
throws XmlPullParserException, IOException {
return parseContentDepth(parser, depth, false);
@@ -402,7 +281,7 @@ public class PacketParserUtils {
* parent elements will be added to child elements that don't define a different namespace.
*
* This method is able to parse the content with MX- and KXmlParser. KXmlParser does not support
- * xml-roundtrip. i.e. return a String on getText() on START_TAG and END_TAG. We check for the
+ * xml-roundtrip. i.e. return a String on getText() on START_ELEMENT and END_ELEMENT. We check for the
* XML_ROUNDTRIP feature. If it's not found we are required to work around this limitation, which
* results in only partial support for XML namespaces ("xmlns"): Only the outermost namespace of
* elements will be included in the resulting String, if fullNamespaces
is set to false.
@@ -419,7 +298,7 @@ public class PacketParserUtils {
* @throws IOException
*/
public static CharSequence parseContentDepth(XmlPullParser parser, int depth, boolean fullNamespaces) throws XmlPullParserException, IOException {
- if (parser.getFeature(FEATURE_XML_ROUNDTRIP)) {
+ if (parser.supportsRoundtrip()) {
return parseContentDepthWithRoundtrip(parser, depth, fullNamespaces);
} else {
return parseContentDepthWithoutRoundtrip(parser, depth, fullNamespaces);
@@ -429,15 +308,21 @@ public class PacketParserUtils {
private static CharSequence parseContentDepthWithoutRoundtrip(XmlPullParser parser, int depth,
boolean fullNamespaces) throws XmlPullParserException, IOException {
XmlStringBuilder xml = new XmlStringBuilder();
- int event = parser.getEventType();
- boolean isEmptyElement = false;
+ XmlPullParser.Event event = parser.getEventType();
// XmlPullParser reports namespaces in nested elements even if *only* the outer ones defines
// it. This 'flag' ensures that when a namespace is set for an element, it won't be set again
// in a nested element. It's an ugly workaround that has the potential to break things.
String namespaceElement = null;
+ boolean startElementJustSeen = false;
outerloop: while (true) {
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
+ if (startElementJustSeen) {
+ xml.rightAngleBracket();
+ }
+ else {
+ startElementJustSeen = true;
+ }
xml.halfOpenElement(parser.getName());
if (namespaceElement == null || fullNamespaces) {
String namespace = parser.getNamespace();
@@ -449,18 +334,11 @@ public class PacketParserUtils {
for (int i = 0; i < parser.getAttributeCount(); i++) {
xml.attribute(parser.getAttributeName(i), parser.getAttributeValue(i));
}
- if (parser.isEmptyElementTag()) {
- xml.closeEmptyElement();
- isEmptyElement = true;
- }
- else {
- xml.rightAngleBracket();
- }
break;
- case XmlPullParser.END_TAG:
- if (isEmptyElement) {
- // Do nothing as the element was already closed, just reset the flag
- isEmptyElement = false;
+ case END_ELEMENT:
+ if (startElementJustSeen) {
+ xml.closeEmptyElement();
+ startElementJustSeen = false;
}
else {
xml.closeElement(parser.getName());
@@ -474,9 +352,16 @@ public class PacketParserUtils {
break outerloop;
}
break;
- case XmlPullParser.TEXT:
+ case TEXT_CHARACTERS:
+ if (startElementJustSeen) {
+ startElementJustSeen = false;
+ xml.rightAngleBracket();
+ }
xml.escape(parser.getText());
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
event = parser.next();
}
@@ -485,20 +370,39 @@ public class PacketParserUtils {
private static CharSequence parseContentDepthWithRoundtrip(XmlPullParser parser, int depth, boolean fullNamespaces)
throws XmlPullParserException, IOException {
- StringBuilder sb = new StringBuilder();
- int event = parser.getEventType();
+ XmlStringBuilder sb = new XmlStringBuilder();
+ XmlPullParser.Event event = parser.getEventType();
+ boolean startElementJustSeen = false;
outerloop: while (true) {
- // Only append the text if the parser is not on on an empty element' start tag. Empty elements are reported
- // twice, so in order to prevent duplication we only add their text when we are on their end tag.
- if (!(event == XmlPullParser.START_TAG && parser.isEmptyElementTag())) {
+ switch (event) {
+ case START_ELEMENT:
+ if (startElementJustSeen) {
+ sb.rightAngleBracket();
+ }
+ startElementJustSeen = true;
+ break;
+ case END_ELEMENT:
+ boolean isEmptyElement = false;
+ if (startElementJustSeen) {
+ isEmptyElement = true;
+ startElementJustSeen = false;
+ }
+ if (!isEmptyElement) {
+ String text = parser.getText();
+ sb.append(text);
+ }
+ if (parser.getDepth() <= depth) {
+ break outerloop;
+ }
+ break;
+ default:
+ startElementJustSeen = false;
CharSequence text = parser.getText();
- if (event == XmlPullParser.TEXT) {
- text = StringUtils.escapeForXmlText(text);
+ if (event == XmlPullParser.Event.TEXT_CHARACTERS) {
+ text = StringUtils.escapeForXml(text);
}
sb.append(text);
- }
- if (event == XmlPullParser.END_TAG && parser.getDepth() <= depth) {
- break outerloop;
+ break;
}
event = parser.next();
}
@@ -543,9 +447,9 @@ public class PacketParserUtils {
// Parse sub-elements
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
String namespace = parser.getNamespace();
switch (elementName) {
@@ -587,11 +491,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return presence;
@@ -622,10 +529,10 @@ public class PacketParserUtils {
final IQ.Type type = IQ.Type.fromString(parser.getAttributeValue("", "type"));
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String elementName = parser.getName();
String namespace = parser.getNamespace();
switch (elementName) {
@@ -640,7 +547,7 @@ public class PacketParserUtils {
iqPacket = provider.parse(parser, outerXmlEnvironment);
}
// Note that if we reach this code, it is guranteed that the result IQ contained a child element
- // (RFC 6120 § 8.2.3 6) because otherwhise we would have reached the END_TAG first.
+ // (RFC 6120 § 8.2.3 6) because otherwhise we would have reached the END_ELEMENT first.
else {
// No Provider found for the IQ stanza, parse it to an UnparsedIQ instance
// so that the content of the IQ can be examined later on
@@ -649,11 +556,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
// Decide what to do when an IQ packet was not understood
@@ -694,15 +604,15 @@ public class PacketParserUtils {
List mechanisms = new ArrayList();
boolean done = false;
while (!done) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
- if (eventType == XmlPullParser.START_TAG) {
+ if (eventType == XmlPullParser.Event.START_ELEMENT) {
String elementName = parser.getName();
if (elementName.equals("mechanism")) {
mechanisms.add(parser.nextText());
}
}
- else if (eventType == XmlPullParser.END_TAG) {
+ else if (eventType == XmlPullParser.Event.END_ELEMENT) {
if (parser.getName().equals("mechanisms")) {
done = true;
}
@@ -721,14 +631,14 @@ public class PacketParserUtils {
*/
public static Compress.Feature parseCompressionFeature(XmlPullParser parser)
throws IOException, XmlPullParserException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
String name;
final int initialDepth = parser.getDepth();
List methods = new LinkedList<>();
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
name = parser.getName();
switch (name) {
case "method":
@@ -736,7 +646,7 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
name = parser.getName();
switch (name) {
case Compress.Feature.ELEMENT:
@@ -744,9 +654,13 @@ public class PacketParserUtils {
break outerloop;
}
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
- assert (parser.getEventType() == XmlPullParser.END_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.END_ELEMENT);
assert (parser.getDepth() == initialDepth);
return new Compress.Feature(methods);
}
@@ -782,9 +696,9 @@ public class PacketParserUtils {
String condition = null;
Map descriptiveTexts = null;
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
if (name.equals("text")) {
descriptiveTexts = parseDescriptiveTexts(parser, descriptiveTexts);
@@ -794,11 +708,14 @@ public class PacketParserUtils {
condition = parser.getName();
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return new SASLFailure(condition, descriptiveTexts);
@@ -826,9 +743,9 @@ public class PacketParserUtils {
String conditionText = null;
XmlEnvironment streamErrorXmlEnvironment = XmlEnvironment.from(parser, outerXmlEnvironment);
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String namespace = parser.getNamespace();
switch (namespace) {
@@ -841,8 +758,9 @@ public class PacketParserUtils {
// If it's not a text element, that is qualified by the StreamError.NAMESPACE,
// then it has to be the stream error code
condition = StreamError.Condition.fromString(name);
- if (!parser.isEmptyElementTag()) {
- conditionText = parser.nextText();
+ conditionText = parser.nextText();
+ if (conditionText.isEmpty()) {
+ conditionText = null;
}
break;
}
@@ -852,11 +770,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
return new StreamError(condition, conditionText, descriptiveTexts, extensions);
@@ -888,9 +809,9 @@ public class PacketParserUtils {
builder.setErrorGenerator(parser.getAttributeValue("", "by"));
outerloop: while (true) {
- int eventType = parser.next();
+ XmlPullParser.Event eventType = parser.next();
switch (eventType) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
String namespace = parser.getNamespace();
switch (namespace) {
@@ -901,8 +822,9 @@ public class PacketParserUtils {
break;
default:
builder.setCondition(StanzaError.Condition.fromString(name));
- if (!parser.isEmptyElementTag()) {
- builder.setConditionText(parser.nextText());
+ String conditionText = parser.nextText();
+ if (!conditionText.isEmpty()) {
+ builder.setConditionText(conditionText);
}
break;
}
@@ -911,10 +833,14 @@ public class PacketParserUtils {
PacketParserUtils.addExtensionElement(extensions, parser, name, namespace, stanzaErrorXmlEnvironment);
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
builder.setExtensions(extensions).setDescriptiveTexts(descriptiveTexts);
@@ -949,14 +875,14 @@ public class PacketParserUtils {
public static StartTls parseStartTlsFeature(XmlPullParser parser)
throws XmlPullParserException, IOException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
assert (parser.getNamespace().equals(StartTls.NAMESPACE));
int initalDepth = parser.getDepth();
boolean required = false;
outerloop: while (true) {
- int event = parser.next();
+ XmlPullParser.Event event = parser.next();
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
switch (name) {
case "required":
@@ -964,13 +890,17 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initalDepth) {
break outerloop;
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
- assert (parser.getEventType() == XmlPullParser.END_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.END_ELEMENT);
return new StartTls(required);
}
@@ -978,14 +908,11 @@ public class PacketParserUtils {
ParserUtils.assertAtStartTag(parser);
final int initialDepth = parser.getDepth();
boolean optional = false;
- if (parser.isEmptyElementTag()) {
- return new Session.Feature(optional);
- }
outerloop: while (true) {
- int event = parser.next();
+ XmlPullParser.Event event = parser.next();
switch (event) {
- case XmlPullParser.START_TAG:
+ case START_ELEMENT:
String name = parser.getName();
switch (name) {
case Session.Feature.OPTIONAL_ELEMENT:
@@ -993,10 +920,14 @@ public class PacketParserUtils {
break;
}
break;
- case XmlPullParser.END_TAG:
+ case END_ELEMENT:
if (parser.getDepth() == initialDepth) {
break outerloop;
}
+ break;
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
}
}
diff --git a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java
index 2a06c9c3c..61a56e0f3 100644
--- a/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java
+++ b/smack-core/src/main/java/org/jivesoftware/smack/util/ParserUtils.java
@@ -29,6 +29,8 @@ import javax.xml.namespace.QName;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.parsing.SmackParsingException.SmackTextParseException;
import org.jivesoftware.smack.parsing.SmackParsingException.SmackUriSyntaxParsingException;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.EntityFullJid;
@@ -38,8 +40,6 @@ import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.jid.parts.Resourcepart;
import org.jxmpp.stringprep.XmppStringprepException;
import org.jxmpp.util.XmppDateTime;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
public class ParserUtils {
@@ -49,7 +49,7 @@ public class ParserUtils {
public static final String JID = "jid";
public static void assertAtStartTag(XmlPullParser parser) throws XmlPullParserException {
- assert (parser.getEventType() == XmlPullParser.START_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.START_ELEMENT);
}
public static void assertAtStartTag(XmlPullParser parser, String name) throws XmlPullParserException {
@@ -58,13 +58,13 @@ public class ParserUtils {
}
public static void assertAtEndTag(XmlPullParser parser) throws XmlPullParserException {
- assert (parser.getEventType() == XmlPullParser.END_TAG);
+ assert (parser.getEventType() == XmlPullParser.Event.END_ELEMENT);
}
public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth)
throws XmlPullParserException, IOException {
- int event = parser.getEventType();
- while (!(event == XmlPullParser.END_TAG && parser.getDepth() == depth)) {
+ XmlPullParser.Event event = parser.getEventType();
+ while (!(event == XmlPullParser.Event.END_ELEMENT && parser.getDepth() == depth)) {
event = parser.next();
}
}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java b/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java
index 6e2c3a781..ee75ac468 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/compress/provider/FailureProviderTest.java
@@ -1,6 +1,6 @@
/**
*
- * Copyright 2018 Florian Schmaus
+ * Copyright 2018-2019 Florian Schmaus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,9 +22,9 @@ import org.jivesoftware.smack.compress.packet.Failure;
import org.jivesoftware.smack.packet.StanzaError;
import org.jivesoftware.smack.packet.StanzaError.Condition;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class FailureProviderTest {
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java b/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java
index 515053714..76682f07f 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/packet/StreamErrorTest.java
@@ -18,19 +18,25 @@ package org.jivesoftware.smack.packet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+
+import java.io.IOException;
import org.jivesoftware.smack.packet.StreamError.Condition;
+import org.jivesoftware.smack.parsing.SmackParsingException;
+import org.jivesoftware.smack.test.util.SmackTestUtil;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
-import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
public class StreamErrorTest {
- @Test
- public void testParsingOfSimpleStreamError() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testParsingOfSimpleStreamError(SmackTestUtil.XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
@@ -39,19 +45,17 @@ public class StreamErrorTest {
" +" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.conflict, error.getCondition());
}
- @Test
- public void testParsingOfStreamErrorWithText() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testParsingOfStreamErrorWithText(SmackTestUtil.XmlPullParserKind parserKind) throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
@@ -63,20 +67,19 @@ public class StreamErrorTest {
"" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.conflict, error.getCondition());
assertEquals("Replaced by new connection", error.getDescriptiveText());
}
- @Test
- public void testParsingOfStreamErrorWithTextAndOptionalElement() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testParsingOfStreamErrorWithTextAndOptionalElement(SmackTestUtil.XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
@@ -91,12 +94,10 @@ public class StreamErrorTest {
"" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.conflict, error.getCondition());
assertEquals("Replaced by new connection", error.getDescriptiveText());
@@ -104,21 +105,20 @@ public class StreamErrorTest {
assertNotNull(appSpecificElement);
}
- @Test
- public void testStreamErrorXmlNotWellFormed() {
- StreamError error = null;
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void testStreamErrorXmlNotWellFormed(SmackTestUtil.XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
final String xml =
// Usually the stream:stream element has more attributes (to, version, ...)
// We omit those, since they are not relevant for testing
"" +
"" +
"";
- try {
- XmlPullParser parser = PacketParserUtils.getParserFor(xml, "error");
- error = PacketParserUtils.parseStreamError(parser);
- } catch (Exception e) {
- fail(e.getMessage());
- }
+
+ XmlPullParser parser = SmackTestUtil.getParserFor(xml, "error", parserKind);
+ StreamError error = PacketParserUtils.parseStreamError(parser);
+
assertNotNull(error);
assertEquals(Condition.not_well_formed, error.getCondition());
}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java b/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java
index db3283c3e..c8673bc0c 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/parsing/ParsingExceptionTest.java
@@ -27,11 +27,11 @@ import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smack.util.PacketParserUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class ParsingExceptionTest {
@@ -39,6 +39,7 @@ public class ParsingExceptionTest {
"" +
"" +
"" +
+ "text content" +
"" +
"" +
"";
@@ -57,8 +58,7 @@ public class ParsingExceptionTest {
public void consumeUnparsedInput() throws Exception {
final String MESSAGE_EXCEPTION_ELEMENT =
"<" + ThrowException.ELEMENT + " xmlns='" + ThrowException.NAMESPACE + "'>" +
- "" +
- "" +
+ "" +
"" + ThrowException.ELEMENT + ">";
XmlPullParser parser = TestUtils.getMessageParser(
"" +
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java
index 56da18453..b66024509 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderConfigTest.java
@@ -22,10 +22,10 @@ import java.util.Collection;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XmlEnvironment;
import org.jivesoftware.smack.util.FileUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.Assert;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class ProviderConfigTest {
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java
index b3c5ebe9f..5210e6344 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/provider/ProviderManagerTest.java
@@ -21,9 +21,9 @@ import static org.junit.Assert.assertTrue;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.XmlEnvironment;
+import org.jivesoftware.smack.xml.XmlPullParser;
import org.junit.Test;
-import org.xmlpull.v1.XmlPullParser;
public class ProviderManagerTest {
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java b/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java
index 0288a55c4..adf5b2bb5 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/sasl/DigestMd5SaslTest.java
@@ -1,6 +1,6 @@
/**
*
- * Copyright © 2014-2017 Florian Schmaus
+ * Copyright © 2014-2019 Florian Schmaus
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,8 +16,8 @@
*/
package org.jivesoftware.smack.sasl;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java b/smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java
new file mode 100644
index 000000000..cfa0b114e
--- /dev/null
+++ b/smack-core/src/test/java/org/jivesoftware/smack/test/util/SmackTestUtil.java
@@ -0,0 +1,165 @@
+/**
+ *
+ * Copyright 2019 Florian Schmaus
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jivesoftware.smack.test.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.InvocationTargetException;
+import java.nio.charset.StandardCharsets;
+import java.util.function.Predicate;
+
+import javax.xml.namespace.QName;
+
+import org.jivesoftware.smack.packet.Element;
+import org.jivesoftware.smack.parsing.SmackParsingException;
+import org.jivesoftware.smack.provider.Provider;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
+import org.jivesoftware.smack.xml.XmlPullParserFactory;
+import org.jivesoftware.smack.xml.stax.StaxXmlPullParserFactory;
+import org.jivesoftware.smack.xml.xpp3.Xpp3XmlPullParserFactory;
+
+public class SmackTestUtil {
+
+ @SuppressWarnings("ImmutableEnumChecker")
+ public enum XmlPullParserKind {
+ StAX(StaxXmlPullParserFactory.class),
+ XPP3(Xpp3XmlPullParserFactory.class),
+ ;
+
+ public final XmlPullParserFactory factory;
+
+ XmlPullParserKind(Class extends XmlPullParserFactory> factoryClass) {
+ try {
+ factory = factoryClass.getDeclaredConstructor().newInstance();
+ }
+ catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+ throw new AssertionError(e);
+ }
+ }
+ }
+
+ public static > E parse(CharSequence xml, Class providerClass, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ P provider = providerClassToProvider(providerClass);
+ return parse(xml, provider, parserKind);
+ }
+
+ public static > E parse(InputStream inputStream, Class providerClass, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ P provider = providerClassToProvider(providerClass);
+ return parse(inputStream, provider, parserKind);
+ }
+
+ public static > E parse(Reader reader, Class providerClass, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ P provider = providerClassToProvider(providerClass);
+ return parse(reader, provider, parserKind);
+ }
+
+ public static E parse(CharSequence xml, Provider provider, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ String xmlString = xml.toString();
+ Reader reader = new StringReader(xmlString);
+ return parse(reader, provider, parserKind);
+ }
+
+ public static E parse(InputStream inputStream, Provider provider, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
+ return parse(inputStreamReader, provider, parserKind);
+ }
+
+ public static E parse(Reader reader, Provider provider, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException, SmackParsingException {
+ XmlPullParser parser = getParserFor(reader, parserKind);
+ E element = provider.parse(parser);
+ return element;
+ }
+
+ public static XmlPullParser getParserFor(String xml, XmlPullParserKind parserKind) throws XmlPullParserException, IOException {
+ Reader reader = new StringReader(xml);
+ return getParserFor(reader, parserKind);
+ }
+
+ public static XmlPullParser getParserFor(InputStream inputStream, XmlPullParserKind parserKind) throws XmlPullParserException, IOException {
+ InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
+ return getParserFor(inputStreamReader, parserKind);
+ }
+
+ public static XmlPullParser getParserFor(Reader reader, XmlPullParserKind parserKind) throws XmlPullParserException, IOException {
+ XmlPullParser parser = parserKind.factory.newXmlPullParser(reader);
+ forwardParserToStartElement(parser);
+ return parser;
+ }
+
+ public static XmlPullParser getParserFor(String xml, QName startTagQName, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException {
+ XmlPullParser parser = getParserFor(xml, parserKind);
+ forwardParserToStartElement(parser, (p) -> p.getQName().equals(startTagQName));
+ return parser;
+ }
+
+ public static XmlPullParser getParserFor(String xml, String startTagLocalpart, XmlPullParserKind parserKind)
+ throws XmlPullParserException, IOException {
+ XmlPullParser parser = getParserFor(xml, parserKind);
+ forwardParserToStartElement(parser, (p) -> p.getName().equals(startTagLocalpart));
+ return parser;
+ }
+
+ private static > P providerClassToProvider(Class providerClass) {
+ P provider;
+ // TODO: Consider adding a shortcut in case there is a static INSTANCE field holding an instance of the
+ // requested provider.
+ try {
+ provider = providerClass.getDeclaredConstructor().newInstance();
+ }
+ catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
+ | NoSuchMethodException | SecurityException e) {
+ throw new AssertionError(e);
+ }
+ return provider;
+ }
+
+ private static void forwardParserToStartElement(XmlPullParser parser) throws XmlPullParserException, IOException {
+ forwardParserToStartElement(parser, p -> true);
+ }
+
+ private static void forwardParserToStartElement(XmlPullParser parser,
+ Predicate doneForwarding) throws XmlPullParserException, IOException {
+ outerloop: while (true) {
+ XmlPullParser.Event event = parser.getEventType();
+ switch (event) {
+ case START_ELEMENT:
+ if (doneForwarding.test(parser)) {
+ break outerloop;
+ }
+ break;
+ case END_DOCUMENT:
+ throw new IllegalArgumentException("Not matching START_ELEMENT found");
+ default:
+ // Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
+ break;
+ }
+ parser.next();
+ }
+ }
+}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java b/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java
index b6a94d2a9..a1ebdc9ac 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/test/util/TestUtils.java
@@ -20,14 +20,11 @@ import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
-import org.jivesoftware.smack.packet.ExtensionElement;
-import org.jivesoftware.smack.packet.XmlEnvironment;
-import org.jivesoftware.smack.util.PacketParserUtils;
-import org.jivesoftware.smack.util.ParserUtils;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
+import org.jivesoftware.smack.xml.SmackXmlParser;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
+// TODO: Remove this class and replace it with SmackTestUtil.
public final class TestUtils {
private TestUtils() {
}
@@ -52,12 +49,12 @@ public final class TestUtils {
return getParser(new StringReader(string), startTag);
}
- public static XmlPullParser getParser(Reader reader, String startTag) {
+ private static XmlPullParser getParser(Reader reader, String startTag) {
XmlPullParser parser;
try {
- parser = PacketParserUtils.newXmppParser(reader);
+ parser = SmackXmlParser.newXmlParser(reader);
if (startTag == null) {
- while (parser.getEventType() != XmlPullParser.START_TAG) {
+ while (parser.getEventType() != XmlPullParser.Event.START_ELEMENT) {
parser.next();
}
return parser;
@@ -65,7 +62,7 @@ public final class TestUtils {
boolean found = false;
while (!found) {
- if ((parser.next() == XmlPullParser.START_TAG) && parser.getName().equals(startTag))
+ if ((parser.next() == XmlPullParser.Event.START_ELEMENT) && parser.getName().equals(startTag))
found = true;
}
@@ -79,17 +76,4 @@ public final class TestUtils {
return parser;
}
- public static EE parseExtensionElement(String elementString)
- throws Exception {
- return parseExtensionElement(getParser(elementString), null);
- }
-
- @SuppressWarnings("unchecked")
- public static EE parseExtensionElement(XmlPullParser parser, XmlEnvironment outerXmlEnvironment)
- throws Exception {
- ParserUtils.assertAtStartTag(parser);
- final String elementName = parser.getName();
- final String namespace = parser.getNamespace();
- return (EE) PacketParserUtils.parseExtensionElement(elementName, namespace, parser, outerXmlEnvironment);
- }
}
diff --git a/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java b/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java
index c2ed877f5..1f23eed5a 100644
--- a/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java
+++ b/smack-core/src/test/java/org/jivesoftware/smack/util/PacketParserUtilsTest.java
@@ -29,6 +29,8 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;
@@ -42,15 +44,18 @@ import org.jivesoftware.smack.packet.StreamOpen;
import org.jivesoftware.smack.sasl.SASLError;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements;
import org.jivesoftware.smack.sasl.packet.SaslStreamElements.SASLFailure;
+import org.jivesoftware.smack.test.util.SmackTestUtil;
import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smack.test.util.XmlUnitUtils;
+import org.jivesoftware.smack.xml.XmlPullParser;
+import org.jivesoftware.smack.xml.XmlPullParserException;
import com.jamesmurty.utils.XMLBuilder;
import org.junit.Ignore;
import org.junit.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
import org.xml.sax.SAXException;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
public class PacketParserUtilsTest {
@@ -59,8 +64,9 @@ public class PacketParserUtilsTest {
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
}
- @Test
- public void singleMessageBodyTest() throws Exception {
+ @ParameterizedTest
+ @EnumSource(SmackTestUtil.XmlPullParserKind.class)
+ public void singleMessageBodyTest(SmackTestUtil.XmlPullParserKind parserKind) throws Exception {
String defaultLanguage = Stanza.getDefaultLanguage();
String otherLanguage = determineNonDefaultLanguage();
@@ -79,7 +85,7 @@ public class PacketParserUtilsTest {
.asString(outputProperties);
Message message = PacketParserUtils
- .parseMessage(PacketParserUtils.getParserFor(control));
+ .parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertEquals(defaultLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
@@ -99,7 +105,7 @@ public class PacketParserUtilsTest {
.t(otherLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertEquals(otherLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
@@ -118,7 +124,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertEquals(defaultLanguage, message.getBody());
assertTrue(message.getBodyLanguages().isEmpty());
@@ -138,7 +144,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -159,7 +165,7 @@ public class PacketParserUtilsTest {
.t(otherLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -181,7 +187,7 @@ public class PacketParserUtilsTest {
.t(otherLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -203,7 +209,7 @@ public class PacketParserUtilsTest {
.t(defaultLanguage)
.asString(outputProperties);
- message = PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(control));
+ message = PacketParserUtils.parseMessage(SmackTestUtil.getParserFor(control, parserKind));
assertNull(message.getBody());
assertFalse(message.getBodyLanguages().isEmpty());
@@ -708,13 +714,18 @@ public class PacketParserUtilsTest {
.t("Good Message Body")
.asString(outputProperties);
+ // XPP3 writes "end tag", StAX writes "end-tag".
+ Supplier> expectedContentOfExceptionMessage = () -> Stream.of("end tag", "end-tag");
+
String invalidControl = validControl.replace("Good Message Body", "Bad Body");
try {
PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl));
fail("Exception should be thrown");
} catch (XmlPullParserException e) {
- assertTrue(e.getMessage().contains("end tag name "));
+ String exceptionMessage = e.getMessage();
+ boolean expectedContentFound = expectedContentOfExceptionMessage.get().anyMatch((expected) -> exceptionMessage.contains(expected));
+ assertTrue(expectedContentFound);
}
invalidControl = validControl.replace("Good Message Body", "Bad