Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
4387eea
GroupChatRoom: extract text variable
stokito Oct 20, 2025
71bdf42
TranslatorPlugin: extract transcriptWindow variable
stokito Oct 20, 2025
69b5d24
TranslatorPlugin: use MessageFilter instead of MessageEventListener
stokito Oct 20, 2025
d523711
SPARK-2374: TranslatorPlugin: don't clear body if translation failed
stokito Oct 20, 2025
22cafa3
SPARK-2355: UserStatusListener: remove empty methods, they are defaul…
stokito Oct 18, 2025
c670190
SparkFileUploadPlugin.messageReceived() avoid NPE
stokito Oct 19, 2025
8d0093c
SparkFileUploadPlugin: remove empty lines
stokito Oct 19, 2025
8e890aa
ChatRoom: remove unused addToTranscript(String to, String from, Strin…
stokito Oct 19, 2025
34a5088
GroupChatRoom.sendMessage(): move message set out of try
stokito Oct 19, 2025
e16d05f
GroupChatRoom.addToTranscript(): use copy constructor
stokito Oct 19, 2025
af16320
ChatRoomDecorator and SparkMeetPlugin: message.To is set in sendMessa…
stokito Oct 19, 2025
a1b41bb
BroadcastDialog.sendBroadcasts(): simplify message.setType()
stokito Oct 19, 2025
c25fc2d
BroadcastDialog.sendBroadcasts(): rearrange lines
stokito Oct 19, 2025
99f72c5
ReceiveFileTransfer.saveEventToHistory(): use Message setters
stokito Oct 19, 2025
662253b
ReceiveFileTransfer.saveEventToHistory(): pass requestor JID instead …
stokito Oct 19, 2025
254efab
SendFileTransfer.saveEventToHistory(): use message setters
stokito Oct 19, 2025
c93b306
SendFileTransfer.saveEventToHistory(): pass receiver JID
stokito Oct 19, 2025
f142471
ChatContainer.groupChatMessageCheck(): lazy init lastChatMessage;
stokito Oct 19, 2025
95b5598
ChatRoom.insertMessage(): check for message null
stokito Oct 21, 2025
e363029
spark-core/pom.xml: resources plugin: filter only one file spark.prop…
stokito Oct 23, 2025
c8fe336
SPARK-2370: Show chat room event messages
guusdk Oct 10, 2025
99d4465
SPARK-2369: Prevent NPE in User-has-joined event
guusdk Oct 10, 2025
646a63c
SPARK-2371: Use a sensible timeout when waiting for a HTTP connection
guusdk Oct 10, 2025
30178c1
SPARK-2367: Improve performance of message reordering
guusdk Oct 10, 2025
121ca44
SPARK-2368: Proof-of-concept: display images
guusdk Oct 10, 2025
b19e30b
SPARK-2368 review feedback: fix casing of "Content-Type"
guusdk Oct 21, 2025
bbd1751
Fix NPE when FRAME_IMAGE not found
stokito Oct 21, 2025
2cfc3e9
SPARK-2355: upgrade Smack version to v4.5
stokito Oct 14, 2025
e69ef96
SPARK-2355: Upgrade to smack-java11 dependency
stokito Oct 14, 2025
09c95fd
SPARK-2355: unbanUser(): JidCreate.bareFrom()
stokito Oct 14, 2025
03ab347
SPARK-2355: Migrate to new Smack API
stokito Oct 14, 2025
c1755eb
SPARK-2355: Use StanzaBuilder to create Presence
stokito Oct 18, 2025
2e47923
SPARK-2355: VCardManager: getExtensionElement() now returns XmlElement
stokito Oct 18, 2025
7e5c138
SPARK-2355: StanzaError call .build()
stokito Oct 18, 2025
3a13b30
SPARK-2355: MessageFilter.filterOutgoing() receive a MessageBuilder b…
stokito Oct 19, 2025
6f486c7
SPARK-2355: Migrate to MessageBuilder
stokito Oct 19, 2025
def5c06
SPARK-2355: BannedUsers: use BareJid for grantMembership()
stokito Oct 19, 2025
b532f90
SPARK-2355: Migrate usersearchManager.getSearchResults() to sendSimpl…
stokito Oct 19, 2025
2eb685f
SPARK-2355: Migrate RosterEntry.createEntry() to preApproveAndCreateE…
stokito Oct 19, 2025
2afcf11
SPARK-2355: Migrate Time and Version
stokito Oct 19, 2025
9e5f1ed
SPARK-2355: ApplePlugin: build Presence
stokito Oct 19, 2025
5fa85c4
SPARK-2355: ChatViewer: migrate removeExtension()
stokito Oct 19, 2025
a6536c6
SPARK-2355: ReversiPanel: fix type to StandardExtensionElement
stokito Oct 19, 2025
4c561a0
SPARK-2355: VCardManager: migrate to the new signature of VCardProvid…
stokito Oct 21, 2025
949e6d6
ci.yml: remove Java 8
stokito Oct 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ jobs:
strategy:
matrix:
java:
- 8
- 11
- 17
- 21
Expand Down
9 changes: 8 additions & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/spark.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
Expand Down Expand Up @@ -128,7 +135,7 @@
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java8</artifactId>
<artifactId>smack-java11</artifactId>
<version>${dependency.smack.version}</version>
</dependency>
<dependency>
Expand Down
7 changes: 6 additions & 1 deletion core/src/main/java/org/jivesoftware/MainWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.ui.ChatFrame;
import org.jivesoftware.spark.ui.RawPacketSender;
Expand Down Expand Up @@ -292,7 +293,11 @@ public void closeConnectionAndInvoke(String reason) {
final AbstractXMPPConnection con = SparkManager.getConnection();
if (con.isConnected()) {
if (reason != null) {
Presence byePresence = new Presence(Presence.Type.unavailable, reason, -1, null);
Presence byePresence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.unavailable)
.setStatus(reason)
.setPriority(-1)
.build();
try
{
con.disconnect(byePresence);
Expand Down
13 changes: 11 additions & 2 deletions core/src/main/java/org/jivesoftware/resource/Default.java
Original file line number Diff line number Diff line change
Expand Up @@ -203,20 +203,29 @@ public static ImageIcon getImageIcon(String imageName) {
// Otherwise, load and add to cache.
try {
final URL imageURL = getURL(imageName);
if (imageURL == null) {
Log.debug(imageName + " not found.");
return null;
}

final ImageIcon icon = new ImageIcon(imageURL);
cache.put(imageName, icon);
return icon;
}
catch (Exception e) {
Log.warning(imageName + " not found.", e);
Log.warning("Unable to load " + imageName, e);
}
return null;
}

public static URL getURL(String propertyName) {
URL pluginUrl = PluginRes.getDefaultURL(propertyName);
return pluginUrl != null ? pluginUrl : cl.getResource(getString(propertyName));
if (pluginUrl != null) return pluginUrl;
String resourceName = getString(propertyName);
if (resourceName == null) {
return null;
}
return cl.getResource(resourceName);
}


Expand Down
9 changes: 5 additions & 4 deletions core/src/main/java/org/jivesoftware/spark/ChatManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.chat2.Chat;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.MessageBuilder;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smackx.chatstates.ChatState;
import org.jivesoftware.smackx.chatstates.ChatStateListener;
Expand Down Expand Up @@ -470,19 +471,19 @@ public void filterIncomingMessage( ChatRoom room, Message message )
* Notifies all <code>MessageFilter</code>s about a new outgoing message.
*
* @param room the <code>ChatRoom</code> the message belongs too.
* @param message the <code>Message</code> being sent.
* @param messageBuilder the <code>Message</code> being sent.
*/
public void filterOutgoingMessage( ChatRoom room, Message message )
public void filterOutgoingMessage(ChatRoom room, MessageBuilder messageBuilder )
{
for ( final MessageFilter filter : messageFilters )
{
try
{
filter.filterOutgoing( room, message );
filter.filterOutgoing( room, messageBuilder );
}
catch ( Exception e )
{
Log.error( "A MessageFilter ('" + filter + "') threw an exception while processing an outgoing chat message (from '" + message.getFrom() + "') in a chat room ('" + room + "').", e );
Log.error( "A MessageFilter ('" + filter + "') threw an exception while processing an outgoing chat message (from '" + messageBuilder.getFrom() + "') in a chat room ('" + room + "').", e );
}
}
}
Expand Down
70 changes: 52 additions & 18 deletions core/src/main/java/org/jivesoftware/spark/PresenceManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import org.jivesoftware.resource.Default;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.packet.XmlElement;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smackx.muc.packet.MUCUser;
Expand Down Expand Up @@ -47,13 +49,54 @@ public class PresenceManager {

static {
// Add Available Presence
final Presence availablePresence = new Presence(Presence.Type.available, Res.getString("status.online"), 1, Presence.Mode.available);
final Presence freeToChatPresence = new Presence(Presence.Type.available, Res.getString("status.free.to.chat"), 1, Presence.Mode.chat);
final Presence awayPresence = new Presence(Presence.Type.available, Res.getString("status.away"), 0, Presence.Mode.away);
final Presence phonePresence = new Presence(Presence.Type.available, Res.getString("status.on.phone"), 0, Presence.Mode.away);
final Presence dndPresence = new Presence(Presence.Type.available, Res.getString("status.do.not.disturb"), 0, Presence.Mode.dnd);
final Presence extendedAway = new Presence(Presence.Type.available, Res.getString("status.extended.away"), 0, Presence.Mode.xa);
final Presence invisible = new Presence(Presence.Type.unavailable, Res.getString("status.invisible"), 0, Presence.Mode.available);
final Presence availablePresence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.setStatus(Res.getString("status.online"))
.setPriority(1)
.setMode(Presence.Mode.available)
.build();

final Presence freeToChatPresence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.setStatus(Res.getString("status.free.to.chat"))
.setPriority(1)
.setMode(Presence.Mode.chat)
.build();

final Presence awayPresence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.setStatus(Res.getString("status.away"))
.setPriority(0)
.setMode(Presence.Mode.away)
.build();

final Presence phonePresence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.setStatus(Res.getString("status.on.phone"))
.setPriority(0)
.setMode(Presence.Mode.away)
.build();

final Presence dndPresence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.setStatus(Res.getString("status.do.not.disturb"))
.setPriority(0)
.setMode(Presence.Mode.dnd)
.build();

final Presence extendedAway = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.setStatus(Res.getString("status.extended.away"))
.setPriority(0)
.setMode(Presence.Mode.xa)
.build();

final Presence invisible = StanzaBuilder.buildPresence()
.ofType(Presence.Type.unavailable)
.setStatus(Res.getString("status.invisible"))
.setPriority(0)
.setMode(Presence.Mode.available)
.build();

PRESENCES.add(freeToChatPresence);
PRESENCES.add(availablePresence);
Expand Down Expand Up @@ -135,8 +178,8 @@ public static EntityFullJid getFullyQualifiedJID(BareJid jid) {
}

public static String getJidFromMUCPresence(Presence presence) {
Collection<ExtensionElement> extensions = presence.getExtensions();
for (ExtensionElement extension : extensions) {
Collection<XmlElement> extensions = presence.getExtensions();
for (XmlElement extension : extensions) {
if (extension instanceof MUCUser) {
final MUCUser mucUser = (MUCUser) extension;
Jid fullJid = mucUser.getItem().getJid();
Expand Down Expand Up @@ -246,13 +289,4 @@ public static boolean areEqual(Presence p1, Presence p2) {
&& p1.getStatus().equals(p2.getStatus());
}

public static Presence copy(Presence presence) {
if (presence == null)
return null;
Presence copy = new Presence(presence.getType());
copy.setMode(presence.getMode());
copy.setStatus(presence.getStatus());
copy.setPriority(presence.getPriority());
return copy;
}
}
7 changes: 5 additions & 2 deletions core/src/main/java/org/jivesoftware/spark/SessionManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.jivesoftware.resource.Res;
import org.jivesoftware.smack.*;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smackx.iqprivate.PrivateDataManager;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
Expand Down Expand Up @@ -149,8 +150,10 @@ public void setServerAddress(DomainBareJid address) {
public void connectionClosedOnError(final Exception ex) {
SwingUtilities.invokeLater( () -> {
preError = Workspace.getInstance().getStatusBar().getPresence();
final Presence presence = new Presence(Presence.Type.unavailable);
presence.setStatus(Res.getString("status.offline"));
final Presence presence = StanzaBuilder.buildPresence()
.ofType(Presence.Type.unavailable)
.setStatus(Res.getString("status.offline"))
.build();
changePresence(presence);

Workspace.getInstance().getStatusBar().setStatusPanelEnabled(false);
Expand Down
13 changes: 10 additions & 3 deletions core/src/main/java/org/jivesoftware/spark/Workspace.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.jivesoftware.resource.Default;
import org.jivesoftware.smack.SmackException;
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.filter.StanzaFilter;
import org.jivesoftware.smack.filter.StanzaTypeFilter;
Expand Down Expand Up @@ -244,9 +245,15 @@ public void loadPlugins() {
JivePropertiesExtension extension = (JivePropertiesExtension) presence.getExtension( JivePropertiesExtension.NAMESPACE );
if (extension != null && extension.getProperty("anonymous") != null) {
boolean isAvailable = statusBox.getPresence().getMode() == Presence.Mode.available;
Presence reply = new Presence(Presence.Type.available);
if (!isAvailable) {
reply.setType(Presence.Type.unavailable);
Presence reply;
if (isAvailable) {
reply = StanzaBuilder.buildPresence()
.ofType(Presence.Type.available)
.build();
} else {
reply = StanzaBuilder.buildPresence()
.ofType(Presence.Type.unavailable)
.build();
}
reply.setTo(presence.getFrom());
try
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,9 @@
import org.jivesoftware.smack.filter.AndFilter;
import org.jivesoftware.smack.filter.FromMatchesFilter;
import org.jivesoftware.smack.filter.StanzaTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.MessageBuilder;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.bytestreams.ibb.InBandBytestreamManager;
import org.jivesoftware.smackx.filetransfer.FileTransferManager;
Expand Down Expand Up @@ -480,9 +481,9 @@ private void addPresenceListener() {
}

if (room != null) {
Message message = new Message();
message.setBody(Res.getString("message.sent.offline.files"));
room.sendMessage(message);
MessageBuilder messageBuilder = StanzaBuilder.buildMessage()
.setBody(Res.getString("message.sent.offline.files"));
room.sendMessage(messageBuilder);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smack.provider.IQProvider;
import org.jivesoftware.smack.provider.IqProvider;
import org.jivesoftware.smack.provider.ProviderManager;
import org.jivesoftware.smack.xml.SmackXmlParser;
import org.jivesoftware.smack.xml.XmlPullParser;
Expand Down Expand Up @@ -139,7 +139,7 @@ private void loadSmackProvider(InputStream providerStream) throws Exception {
try {
// Add the provider to the map.
Class<?> provider = this.loadClass(className);
if (IQProvider.class.isAssignableFrom(provider)) {
if (IqProvider.class.isAssignableFrom(provider)) {
ProviderManager.addIQProvider(elementName, namespace, provider.newInstance());
}
else if (IQ.class.isAssignableFrom(provider)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.jivesoftware.smack.filter.StanzaTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.StanzaBuilder;
import org.jivesoftware.smackx.muc.MultiUserChatManager;
import org.jivesoftware.spark.ChatManager;
import org.jivesoftware.spark.SparkManager;
Expand Down Expand Up @@ -956,7 +957,9 @@ protected void fireUserHasJoined(final ChatRoom room, final Resourcepart userid)
-> {
for (final ChatRoomListener listener : chatRoomListeners) {
try {
listener.userHasJoined(room, userid.toString());
if (userid != null) {
listener.userHasJoined(room, userid.toString());
}
} catch (Exception e) {
Log.error("A ChatRoomListener (" + listener + ") threw an exception while processing a 'user joined' event for user '" + userid + "' in room: " + room, e);
}
Expand Down Expand Up @@ -1125,7 +1128,7 @@ private void groupChatMessageCheck(ChatRoom chatRoom, boolean customMsg, String
if (isGroupChat) {
// is a group chat, perform some functions
String fromNickName = "";
Message lastChatMessage = new Message();
Message lastChatMessage;
Jid mucNickNameT;
String finalRoomName = "";
if (size > 0) {
Expand All @@ -1138,6 +1141,8 @@ private void groupChatMessageCheck(ChatRoom chatRoom, boolean customMsg, String
} else {
fromNickName = mucNickName[1];
}
} else {
lastChatMessage = StanzaBuilder.buildMessage().build();
}
String myNickName = chatRoom.getNickname().toString();
if (!myNickName.equals(fromNickName)) {
Expand Down
Loading