Changelog


Version 0.9.1 (2023-01-08)

  • Emit status event immediately on disconnection, before closing the connection
  • Improve BoshConnection by applying an in-order executor for HTTP responses
  • Implement ExtensionProtocol on RosterManager, so that it will be registered as IQHandler and can receive roster pushes
  • Automatically PrivacyListManager enable if a listener is added

Version 0.9.0 (2022-09-22)

  • Migrate to Java 11 (doesn't run on Java 8 anymore)
  • Introduce the concept of a transport connector
  • Add new BOSH connector using java.net.http.HttpClient
  • Allow to return stanza errors in RPC handler
  • Presence#createError should flip ‘to’ and ‘from’ (issue #156)
  • Add toBuilder() method to standardized data forms (issue #162)
  • Limit the thread usage when multiple clients are running in the same VM
  • Stream Management: Add handled-count-too-high failure
  • Allow the original child element to be included in error responses
  • Implement equals() and hashCode() for XEP-0004 DataForm fields
  • Make BOSH Body's compareTo() consistent with equals()
  • Add support for XEP-0368: SRV records for XMPP over TLS
  • Ensure UTF-8 when reading XML from file caches
  • Update PRECIS library to 1.1.0
  • PubSub: Add “pubsub#rsm” disco feature
  • Rework Comparable implementation in Presence
  • Redesign IQHandler
  • Introduce an ExtensionProtocol interface
  • Add functional interfaces for handling stanzas
  • Ensure that date times are formatted as specified by XEP-0082 (e.g. don't marshal nanoseconds)
  • Add InfoNodeProvider interface
  • Add support for XEP-0232: Software Information
  • Extract vCard-Based-Avatars protocol and User Avatar protocol (PEP) out of AvatarManager
  • Simplify stream negotiation
  • Redesign Entity Capabilities
  • Add a CombinedResultSetProvider which combines multiple ResultSetProviders into one.
  • Presence: getPriority() should return primitive byte instead of Byte
  • Add low-level support for XEP-0402: PEP Native Bookmarks

Version 0.8.0 (2018-07-17)

  • Works as JPMS modules on Java 9 and as conventional JAR library on Java 8
  • Make Jid class an interface. Full JIDs and bare JIDs now share the same instance. No new instances need to be created when calling asBareJid(), the interface just returns a different view on the full JID. Reduces GC pressure and increase performance.
  • Allow Unicode (non-ASCII) domain names in JIDs (Issue #128)
  • Update Jid implementation to use new PRECIS specification RFC 8264
  • Add a MalformedJid implementation to allow to use malformed-jid stanza error.
  • Add Java NIO support
  • Every connection now has closeAsync() method
  • Allow to set a custom thread factory for all threads being started
  • Add support for XEP-0390: Entity Capabilities 2.0
  • Add support for XEP-0392: Consistent Color Generation
  • Add low-level support for XEP-0258: Security Labels in XMPP
  • Add low-level support for XEP-0264: Jingle Content Thumbnails
  • Add low-level support for XEP-0352: Client State Indication
  • Add a class StreamHeader which represents the stream header and checks for the rules in RFC 6120.
  • Refactor Text classes from the urn:ietf:params:xml:ns:xmpp-stanzas, urn:ietf:params:xml:ns:xmpp-streams and urn:ietf:params:xml:ns:xmpp-sasl namespaces into one common rocks.xmpp.core.Text class (API change).
  • Add putExtension() and addExtensions() methods to Stanza.
  • Move rocks.xmpp.core.stream.StreamErrorException to rocks.xmpp.core.stream.model.StreamErrorException
  • XEP-0033: Extended Stanza Addressing: Implement reply handling, add delivered attribute, add varargs constructor.
  • XEP-0045: Revoking admin status should result in mere membership, rather than no affiliation at all.
  • XEP-0059: Add nextPage() and previousPage() method to result set management. Also refine the naming of the RSM methods.
  • XEP-0085: Add isSupported method for Chat State Notifications (either discover implicit support or else use service discovery)
  • XEP-0096: Only return a single value during SI FileTransfer negotiation.
  • XEP-0115: Sort by octets, not by characters.
  • XEP-0300: Update to urn:xmpp:hashes:2
  • XEP-0184: Receipt messages should have the same type as the request message instead of normal type.
  • Fix Message#createError() (Issue #127)
  • Check the ‘from’ attribute of IQ responses to prevent spoofing
  • Ensure that xsi:type values have a known namespace prefix (Issue #137)
  • EntitityCapabilities payload is not added to outgoing presence when presence have ‘to’ address (Issue #132)
  • sendAndAwaitMessage not handling concurrent requests/responses correctly (Issue #136)

Version 0.7.5 (2018-01-27)

  • Add stream ID to ConsoleDebugger output (Issue #105).
  • Improve CustomIQ example and documentation (Issue #112).
  • PingManager: Make exception for feature-not-implemented (Issue #113).
  • Allow configuration of custom name server for DNS SRV resolution.
  • MUC service discovery should handle items with non-room JIDs (Issue #106).
  • Connecting to stream hosts should not exceed configured response timeout (Issue #111).
  • Fixed DataForm.getReportedFields() to work when null.
  • Fix NullPointerException in RPC Value class (Issue #117).
  • Fix memory leak on WebSocket connection failure (Issue #122)
  • Ensure WebSocket session is closed, if server does not respond with <close/> element.
  • Store avatar image using correct hash code.

Version 0.7.4 (2017-03-14)

  • Resolve rare deadlock when using Stream Management
  • Rework how WebSocket connections are closed
  • Don't let a stream error close the stream immediately, but instead wait for the closing stream element and then close the connection.
  • Increase performance of IBB stream
  • Prevent rare, but possible NullPointerException after sending stanzas.
  • Fix error when using pages (XEP-0141) within data forms (XEP-0004)
  • Reset nick to null, if entering a chat room fails

Version 0.7.3 (2017-02-09)

  • Use single equals sign (“=”) for zero-length data in SASL, as per RFC 6120 § 6.4.2
  • Allow configuring a custom stream host and skip proxy discovery then for SI file transfer.
  • Implement WebSocket pings/pongs.
  • Fix WebSocket's proxy URI construction.
  • Use connect timeout for WebSocket connections.
  • XEP-0198: Send an ack right before gracefully closing the stream (i.e. update to version 1.5.2).
  • MUC Room “enter” events should fire for oneself entering the room as well.
  • Use java.text.Collator for String-based default comparison.
  • XEP-0066: Use URI instead of URL.
  • Fix XMPP Ping in External Components, which broke the connection.
  • Jid.asBareJid returns this if it is already bare, reducing GC pressure.
  • connect() method should not throw CancellationException
  • Check if the connection has been secured (if configured) before starting to authenticate.

Version 0.7.2 (2016-09-08)

  • Fix reconnection issue, when using multiple connection methods per session.
  • Improve and fix stanza acknowledging and Stream Management
    • Add Delayed Delivery (XEP-0203) extension to stanzas, which are resent automatically later (when reconnected again)
    • Always resent all unacknowledged stanzas after login, not only after stream resumption.
    • Highlight StreamManagement's request / answer pairs in VisualDebugger.
    • Update XEP-0198 Stream Management to version 1.5 (respect the ‘h’ attribute in the failed element)
  • Wait for the roster response before sending initial presence during login, to prevent receiving presence information from yet unknown contacts.
  • Make sure asynchronous method calls do not block (affected only few methods for avatars and entity capabilities)
  • Use the hostname instead of the domain for SASL clients (i.e. use the Sasl.createSaslClient API correctly as per the documentation, may affect DIGEST-MD5 authentication).
  • Call SaslClient.dispose() when SASL authentication has completed.
  • Include the requesting IQ in NoResponseException, when doing IQ queries.
  • XEP-0184: Add the sender of a receipt to the MessageDeliveryEvent.
  • Allow event consumption for outbound stanzas, which prevents the stanza to be sent.
  • Make stream feature negotiation more stable.
  • Minor graphical fixes in VisualDebugger.
  • Add API to include the hash and mime type in File Transfer offers.
  • Add API to create a chat session with a thread id.
  • Immediately complete (IQ-)queries if sending failed and don't wait on the timeout.

Version 0.7.1 (2016-08-09)

  • Discovering services should not fail immediately if one sub-query fails.
  • Make sure abnormal WebSocket disconnections trigger the reconnection.
  • Make sure RECONNECTION_SUCCEEDED event is triggered for external components.
  • Add listeners to listen for successful or failed send operations.
  • Add public constructor for the SASL challenge class.
  • Add public constructors to SASL Failure class.
  • Make sure to not write XMLConstants.XML_NS_URI to XML elements (FasterXML Aalto's XMLStreamWriter implementation writes it)
  • Add DataForm.Field#getValue() and implement toString() method.
  • Add convenient API to compare two MUC affiliations and roles ( i.e. Affiliation.OWNER.isHigherThan(Affiliation.ADMIN))
  • Compare presences of MUC occupants in the Occupant's Comparable implementation.
  • Minor performance improvement by using a ListIterator in collection based result sets.
  • Discover PubSub services by identity, not by feature name (it's more reliable)
  • Add nextPage() and previousPage() method and refine the naming of other methods in result set management (e.g. having forCount() and forItemCount() was confusing)

Version 0.7.0 (2016-06-05)

  • Add support for XEP-0198: Stream Management
  • Add support for WebSocket connection method (RFC 7395).
  • Update Jid class to the new XMPP Address Format (RFC 7622)
  • IQ queries can now be executed asynchronously (non-blocking) using Java 8's java.util.concurrent.CompletableFuture API.
  • Represent xml:lang attributes as java.util.Locale, not as String.
  • Represent timeouts as java.time.Duration instead of int/long for better clearness.
  • Add a very minimalistic DNS resolver for resolving SRV and TXT records in order to remove the dependency to com.sun.* classes.
  • Add more ReconnectionStrategy implementations.
  • Check connected state of socket before connecting (to prevent SocketException when a SocketFactory provides a connected socket)
  • Add XmppSession#isAuthenticated() method.
  • Add static XmppSession#addCreationListener() method to allow to listen for newly created sessions.
  • Update XEP-0080 to version 1.9 (add altaccuracy element).
  • Add API to destroy a MUC room without a reason.
  • More documentation, e.g. clarify the use of ConnectionConfiguration#secure()
  • Don't include an empty body in Message Delivery Receipts.
  • Add correct XML names to component namespace stanzas.
  • Eagerly release unused port to prevent ports-leaks due to delayed GC
  • Improve thread-safety during connect() and login()
  • Fix encoding issues, caused by missing UTF-8 encoding, mainly in the debugger.
  • XEP-0033: Address should have extensions.
  • Add workaround for a JDK bug causing memory issues and high CPU.
  • Add documentation for custom SASL authentication.

Version 0.6.2 (2015-12-08)

  • Fix bug when closing a BOSH connection and when using key sequences.
  • Prevent long DNS resolution of InetAddress.getHostname() when using an IP address in TCP connection as hostname.
  • Make the acceptance of file transfer requests more stable.
  • Real-time Text (XEP-0301) should count Unicode code points instead of characters (e.g. a surrogate pair counts as 1, not as 2)
  • Prevent high CPU usage when receiving and processing real-time text.
  • Include session id in <streamhost-used/> SOCKS5 query.
  • Prevent UnsupportedOperationException when suggesting a contact addition (XEP-0144 Roster Item Exchange).
  • Prefer CharSequence over String in some APIs.

Version 0.6.1 (2015-09-13)

  • Verify SCRAM-SHA-1 server response during login.
  • Add Jid.atSubdomain() method and use CharSequence in static Jid factory methods.
  • Fix bug with FasterXML/Aalto's XMLStreamWriter implementation.
  • Add shortcuts to retrieve the error condition from StanzaException and StreamErrorException.
  • Validate MUC room JID, when creating a chat room.
  • Add API to retrieve owners, admins and outcasts in a chat room.
  • Fix bug when declining a MUC invitation.
  • Minor bug fixes in VisualDebugger.
  • Add factory method to create XEP-131 headers from a Map.
  • Improve BoshConnection class by queuing up stanzas and send multiple stanzas in the same request.
  • Add API to better listen for disconnects and reconnects.
  • Process inbound IQs on another thread as messages and presences. This allows to query IQs from within a Message listener without using extra threads/executors, which seems to be a common use case.

Version 0.6.0 (2015-08-12)

  • Add support for XEP-0114: Jabber Component Protocol
  • Add support for XEP-0171: Language Translation
  • Add support for XEP-0205: Best Practices to Discourage Denial of Service Attacks ( error conditions)
  • Add support for XEP-0301: In-Band Real Time Text
  • Add support for XEP-0319: Last User Interaction in Presence
  • Send initial presence automatically during login (no need to do it manually anymore).
  • Disabled extensions no longer process stanzas (for increased performance).
  • XmppSession is now XmppClient and derives the now abstract XmppSession. This is due to the added support for XEP-0114.
  • XmppSession has a new convenient method for determining support of a feature (since it's used by many XEPs).
  • login method now returns “additional data with success”, i.e. the contents of the <success/> element.
  • Add a new ReconnectionStrategy implementation, which always tries to reconnect after fix time.
  • There's a new “xmpp-addr” project for RFC 6122 which contains the Jid class, which has therefore also moved to a new package (rocks.xmpp.addr)
  • Likewise the Roster and Chat classes have been moved from the ‘core’ to ‘im’ package to better resemble the separation of RFC 6120 and 6121.

Use Java 8's Functional Interfaces:

  • All event listeners have been replaced by java.util.function.Consumer<T extends EventObject> (if you used lambda expressions, nothing has changed for you)

  • Use Java 8's Date-Time API:

    • java.util.TimeZone has been replaced with java.time.ZoneOffset
    • java.util.Date has been replaced with java.time.OffsetDateTime or java.time.Instant
  • Reduce logging overhead by deferred string building.

  • XEP-0092 Software Version now responds with Babbler's version automatically.

  • Stanza classes refactoring:

    • Stanzas moved from rocks.xmpp.core.stanza.model.client to rocks.xmpp.core.stanza.model. This was a necessary change for XEP-0114.
    • Message.Body, Message.Subject, Presence.Status classes have been replaced by a common Text class, since they are all the same.
    • There are new addExtension() / removeExtension() / hasExtension() methods.
  • XmppSession.getDomain() returns a Jid instead of a String.

Version 0.5.1 (2015-06-18)

Version 0.5.0 (2015-03-21)

  • Add support for XEP-0059: Result Set Management
    • Specifically your hosted Service Discovery items (XEP-0030) can now return limited result sets.
  • Add support for XEP-0222: Persistent Storage of Public Data via PubSub
  • Add support for XEP-0223: Persistent Storage of Private Data via PubSub
  • Add support for Roster Versioning
  • Rework the way inbound/outbound stanzas are handled: Instead of add[Message|Presence|IQ]Listener you now have to use addInbound[Message|Presence|IQ]Listener. (API change!)
  • Add IQHandler interface which allows to easily respond to IQ request.
  • PubSub: Add support for Publish Options
  • PubSub: Add API to retrieve subscription options for a specific subscription id.
  • Harmonize Exception design: Most methods now only throw XmppException (or a subclass thereof)
  • Add helper classes to work with standardized MUC and PubSub data forms, e.g. to configure a node.
  • Rename some methods to better resemble the terminology of the specifications (e.g. discover* instead of get*).
  • Refactor Chat State Notifications, Message Delivery Receipts, PingManager
  • Refactor XEP-0107: Mood values can now take specific (custom) moods.
  • Most extension classes are now immutable.
  • Couple RosterManager more tightly with XEP-0083: Nested Roster Groups.
  • Add new connect(Jid from) method to set the ‘from’ attribute in the stream header.
  • Add new login() method, which allows to pass an authorization id and a CallbackHandler.
  • Implement Comparable for ChatRoom and ChatService classes.
  • MUC: Add API to discover allowable traffic in a chat room.
  • MUC: Add support for http://jabber.org/protocol/muc#rooms
  • Add support for optional session establishment.
  • Add persistent (directory-based) cache support for Entity Capabilities and Avatars.
  • Use Singleton pattern for XML elements where appropriate (e.g. most stanza errors).
  • Add support for BOSH compression (gzip, deflate)
  • XmppSession.getExtensionManager() has been replaced with a more general getManager(), which also covers core managers.
  • Various minor tweaks and bug fixes (e.g. thread-safety, Objects.requireNonNull())

Version 0.4.0 (2014-11-01)

  • Add support for XEP-0070: Verifying HTTP Requests via XMPP
  • Add support for XEP-0084: User Avatar
  • Add visual debugger.
  • First version available on Maven Central.
  • Add ability for modularization.
  • Improve package structure and rename base package to rocks.xmpp (due to new domain and Maven group id).
  • More options to configure a connection (e.g. to set a SocketFactory, a keep-alive ping interval, etc…)
  • Improve reconnection logic.
  • Improvements for BOSH connection:
    • Allow secure HTTPS connection
    • Provide ability to use a key sequencing mechanism.
    • minor improvements and tests with ejabberd server.
  • Periodically ping the server (XEP-0199) to allow for a more stable connection.
  • Add isRequest() and isResponse() method to IQ.
  • Bug fix in authentication logic, which prevented successful authentication on ejabberd server.
  • Various minor bug fixes (e.g. stuff like NullPointerException).
  • Add more documentation.

Version 0.3.0 (2014-08-02)

Version 0.2.0 (2014-07-06)

  • Add support for XEP-0045: Multi-User Chat
  • Add support for XEP-0079: Advanced Message Processing
  • Add support for XEP-0122: Data Forms Validation
  • Add support for XEP-0141: Data Forms Layout
  • Add support for XEP-0144: Roster Item Exchange
  • Add support for XEP-0280: Message Carbons
  • Add support for XEP-0335: JSON Containers
  • RosterManager now supports (nested) contact groups
  • Improve Jid class (nodeprep, resourceprep, better escaping logic, caching for better performance, Comparable interface implemented)
  • Add JID Escaping feature (jid\\escaping) to feature list for Service Discovery.
  • Restructure the project: It's now separated into modules:
    • xmpp-core, which contains XML schema implementations and core classes. It could theoretically be useful for a server implementation, too.
    • xmpp-client, which contains business logic, used by XMPP clients (e.g. connection logic, roster management, …)
  • The base Connection class is now called XmppSession, which can have multiple connection methods. Each connection method is tried while connecting. That way a XMPP session can have a normal TcpConnection and an alternative BoshConnection, which is tried as fallback.
  • Move Message, Presence and IQ classes from org.xmpp.stanza to `org.xmpp.stanza.client package (API change).
  • The ‘from’ attribute of roster/privacy lists/blocking command pushes are now checked to prevent IQ spoofing.
  • Update XEP-0080: User Location implementation from version 1.7 to 1.8.
  • Provide convenience methods for creating XEP-0126: Invisibility privacy lists.
  • Implement Comparable interface for PrivacyList and PrivacyRule.
  • Various minor refactoring and improvements.

Version 0.1.0 (2014-03-22)

  • Initial version