1
0
Fork 0
mirror of https://codeberg.org/Mercury-IM/Smack synced 2024-11-24 23:32:05 +01:00

Merge branch '4.2'

This commit is contained in:
Florian Schmaus 2017-05-25 10:39:59 +02:00
commit 7a5f9e6a03
187 changed files with 2284 additions and 588 deletions

2
.gitignore vendored
View file

@ -1,6 +1,8 @@
# IntelliJ # IntelliJ
.idea .idea
*.iml *.iml
*.ipr
*.iws
# Mac OS X # Mac OS X
.DS_Store .DS_Store

View file

@ -10,7 +10,7 @@ cache:
- $HOME/.m2 - $HOME/.m2
before_install: before_install:
- export GRADLE_VERSION=2.12 - export GRADLE_VERSION=3.5
- wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip - wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-all.zip
- unzip -q gradle-${GRADLE_VERSION}-all.zip - unzip -q gradle-${GRADLE_VERSION}-all.zip
- export PATH="$(pwd)/gradle-${GRADLE_VERSION}/bin:$PATH" - export PATH="$(pwd)/gradle-${GRADLE_VERSION}/bin:$PATH"
@ -19,6 +19,6 @@ install: gradle assemble --stacktrace
script: gradle check --stacktrace script: gradle check --stacktrace
after_success: after_success:
- JAVAC_VERSION=$((javac -version) 2>&1) - JAVAC_VERSION=$((javac -version) 2>&1)
# Only run jacocoRootReport in the Java7 build # Only run jacocoRootReport in the Java 8 build
- if [[ "$JAVAC_VERSION" = javac\ 1.7.* ]]; then gradle jacocoRootReport coveralls; fi - if [[ "$JAVAC_VERSION" = javac\ 1.8.* ]]; then gradle jacocoRootReport coveralls; fi

View file

@ -8,9 +8,9 @@ buildscript {
} }
dependencies { dependencies {
classpath 'org.kordamp:markdown-gradle-plugin:1.0.0' classpath 'org.kordamp:markdown-gradle-plugin:1.0.0'
classpath 'org.kordamp.gradle:clirr-gradle-plugin:0.2.0' classpath 'org.kordamp.gradle:clirr-gradle-plugin:0.2.2'
classpath "org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.3.1" classpath "org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.3.1"
classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.9' classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.10'
} }
} }
apply plugin: 'org.kordamp.gradle.markdown' apply plugin: 'org.kordamp.gradle.markdown'
@ -20,6 +20,7 @@ apply from: 'version.gradle'
allprojects { allprojects {
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'eclipse' apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'jacoco' apply plugin: 'jacoco'
apply plugin: 'net.ltgt.errorprone' apply plugin: 'net.ltgt.errorprone'
@ -266,6 +267,7 @@ subprojects {
checkstyle { checkstyle {
configFile = new File(rootConfigDir, 'checkstyle.xml') configFile = new File(rootConfigDir, 'checkstyle.xml')
toolVersion = '7.7'
} }
task sourcesJar(type: Jar, dependsOn: classes) { task sourcesJar(type: Jar, dependsOn: classes) {
classifier = 'sources' classifier = 'sources'

View file

@ -117,5 +117,75 @@
, INDEX_OP , INDEX_OP
"/> "/>
</module> </module>
<module name="WhitespaceAfter">
<property name="tokens" value="TYPECAST
, LITERAL_IF
, LITERAL_ELSE
, LITERAL_WHILE
, LITERAL_DO
, LITERAL_FOR
, DO_WHILE
"/>
</module>
<module name="WhitespaceAround">
<property
name="ignoreEnhancedForColon"
value="false"
/>
<!-- Currently disabled tokens: LCURLY, RCURLY, WILDCARD_TYPE, GENERIC_START, GENERIC_END -->
<property
name="tokens"
value="ASSIGN
, ARRAY_INIT
, BAND
, BAND_ASSIGN
, BOR
, BOR_ASSIGN
, BSR
, BSR_ASSIGN
, BXOR
, BXOR_ASSIGN
, COLON
, DIV
, DIV_ASSIGN
, DO_WHILE
, EQUAL
, GE
, GT
, LAMBDA
, LAND
, LE
, LITERAL_CATCH
, LITERAL_DO
, LITERAL_ELSE
, LITERAL_FINALLY
, LITERAL_FOR
, LITERAL_IF
, LITERAL_RETURN
, LITERAL_SWITCH
, LITERAL_SYNCHRONIZED
, LITERAL_TRY
, LITERAL_WHILE
, LOR
, LT
, MINUS
, MINUS_ASSIGN
, MOD
, MOD_ASSIGN
, NOT_EQUAL
, PLUS
, PLUS_ASSIGN
, QUESTION
, SL
, SLIST
, SL_ASSIGN
, SR
, SR_ASSIGN
, STAR
, STAR_ASSIGN
, LITERAL_ASSERT
, TYPE_EXTENSION_AND
"/>
</module>
</module> </module>
</module> </module>

View file

@ -87,6 +87,7 @@ Experimental Smack Extensions and currently supported XEPs of smack-experimental
| [Internet of Things - Control](iot.md) | [XEP-0325](http://xmpp.org/extensions/xep-0325.html) | Describes how to control devices or actuators in an XMPP-based sensor netowrk. | | [Internet of Things - Control](iot.md) | [XEP-0325](http://xmpp.org/extensions/xep-0325.html) | Describes how to control devices or actuators in an XMPP-based sensor netowrk. |
| [HTTP over XMPP transport](hoxt.md) | [XEP-0332](http://xmpp.org/extensions/xep-0332.html) | Allows to transport HTTP communication over XMPP peer-to-peer networks. | | [HTTP over XMPP transport](hoxt.md) | [XEP-0332](http://xmpp.org/extensions/xep-0332.html) | Allows to transport HTTP communication over XMPP peer-to-peer networks. |
| Chat Markers | [XEP-0333](http://xmpp.org/extensions/xep-0333.html) | A solution of marking the last received, displayed and acknowledged message in a chat. | | Chat Markers | [XEP-0333](http://xmpp.org/extensions/xep-0333.html) | A solution of marking the last received, displayed and acknowledged message in a chat. |
| Message Processing Hints | [XEP-0334](http://xmpp.org/extensions/xep-0334.html) | Hints to entities routing or receiving a message. |
| JSON Containers | [XEP-0335](http://xmpp.org/extensions/xep-0335.html) | Encapsulation of JSON data within XMPP Stanzas. | | JSON Containers | [XEP-0335](http://xmpp.org/extensions/xep-0335.html) | Encapsulation of JSON data within XMPP Stanzas. |
| [Internet of Things - Discovery](iot.md) | [XEP-0347](http://xmpp.org/extensions/xep-0347.html) | Describes how Things can be installed and discovered by their owners. | | [Internet of Things - Discovery](iot.md) | [XEP-0347](http://xmpp.org/extensions/xep-0347.html) | Describes how Things can be installed and discovered by their owners. |
| Client State Indication | [XEP-0352](http://xmpp.org/extensions/xep-0352.html) | A way for the client to indicate its active/inactive state. | | Client State Indication | [XEP-0352](http://xmpp.org/extensions/xep-0352.html) | A way for the client to indicate its active/inactive state. |

View file

@ -325,7 +325,7 @@ public class XMPPBOSHConnection extends AbstractXMPPConnection {
writer = new Writer() { writer = new Writer() {
@Override @Override
public void write(char[] cbuf, int off, int len) { public void write(char[] cbuf, int off, int len) {
/* ignore */} /* ignore */ }
@Override @Override
public void close() { public void close() {

View file

@ -41,6 +41,7 @@ import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode; import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;
import org.jivesoftware.smack.SmackConfiguration.UnknownIqRequestReplyMode;
import org.jivesoftware.smack.SmackException.AlreadyConnectedException; import org.jivesoftware.smack.SmackException.AlreadyConnectedException;
import org.jivesoftware.smack.SmackException.AlreadyLoggedInException; import org.jivesoftware.smack.SmackException.AlreadyLoggedInException;
import org.jivesoftware.smack.SmackException.NoResponseException; import org.jivesoftware.smack.SmackException.NoResponseException;
@ -626,7 +627,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
hostAddresses = DNSUtil.resolveXMPPServiceDomain(config.getXMPPServiceDomain().toString(), failedAddresses, config.getDnssecMode()); hostAddresses = DNSUtil.resolveXMPPServiceDomain(config.getXMPPServiceDomain().toString(), failedAddresses, config.getDnssecMode());
} }
// Either the populated host addresses are not empty *or* there must be at least one failed address. // Either the populated host addresses are not empty *or* there must be at least one failed address.
assert(!hostAddresses.isEmpty() || !failedAddresses.isEmpty()); assert (!hostAddresses.isEmpty() || !failedAddresses.isEmpty());
return failedAddresses; return failedAddresses;
} }
@ -665,7 +666,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
@Override @Override
public void sendStanza(Stanza stanza) throws NotConnectedException, InterruptedException { public void sendStanza(Stanza stanza) throws NotConnectedException, InterruptedException {
Objects.requireNonNull(stanza, "Stanza must not be null"); Objects.requireNonNull(stanza, "Stanza must not be null");
assert(stanza instanceof Message || stanza instanceof Presence || stanza instanceof IQ); assert (stanza instanceof Message || stanza instanceof Presence || stanza instanceof IQ);
throwNotConnectedExceptionIfAppropriate(); throwNotConnectedExceptionIfAppropriate();
switch (fromMode) { switch (fromMode) {
@ -894,7 +895,8 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
continue; continue;
} }
} }
}}); }
});
} }
@Override @Override
@ -991,20 +993,31 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
replyTimeout = timeout; replyTimeout = timeout;
} }
private static boolean replyToUnknownIqDefault = true;
/** /**
* Set the default value used to determine if new connection will reply to unknown IQ requests. The pre-configured * Set the default value used to determine if new connection will reply to unknown IQ requests. The pre-configured
* default is 'true'. * default is 'true'.
* *
* @param replyToUnkownIqDefault * @param replyToUnkownIqDefault
* @see #setReplyToUnknownIq(boolean) * @see #setReplyToUnknownIq(boolean)
* @deprecated Use {@link SmackConfiguration#setUnknownIqRequestReplyMode(org.jivesoftware.smack.SmackConfiguration.UnknownIqRequestReplyMode)} instead.
*/ */
@Deprecated
// TODO Remove in Smack 4.3
public static void setReplyToUnknownIqDefault(boolean replyToUnkownIqDefault) { public static void setReplyToUnknownIqDefault(boolean replyToUnkownIqDefault) {
AbstractXMPPConnection.replyToUnknownIqDefault = replyToUnkownIqDefault; SmackConfiguration.UnknownIqRequestReplyMode mode;
if (replyToUnkownIqDefault) {
mode = SmackConfiguration.UnknownIqRequestReplyMode.replyServiceUnavailable;
} else {
mode = SmackConfiguration.UnknownIqRequestReplyMode.doNotReply;
}
SmackConfiguration.setUnknownIqRequestReplyMode(mode);
} }
private boolean replyToUnkownIq = replyToUnknownIqDefault; private SmackConfiguration.UnknownIqRequestReplyMode unknownIqRequestReplyMode = SmackConfiguration.getUnknownIqRequestReplyMode();
public void setUnknownIqRequestReplyMode(UnknownIqRequestReplyMode unknownIqRequestReplyMode) {
this.unknownIqRequestReplyMode = Objects.requireNonNull(unknownIqRequestReplyMode, "Mode must not be null");
}
/** /**
* Set if Smack will automatically send * Set if Smack will automatically send
@ -1012,9 +1025,18 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
* registered {@link IQRequestHandler} is received. * registered {@link IQRequestHandler} is received.
* *
* @param replyToUnknownIq * @param replyToUnknownIq
* @deprecated use {@link #setUnknownIqRequestReplyMode(UnknownIqRequestReplyMode)} instead.
*/ */
@Deprecated
// TODO Remove in Smack 4.3
public void setReplyToUnknownIq(boolean replyToUnknownIq) { public void setReplyToUnknownIq(boolean replyToUnknownIq) {
this.replyToUnkownIq = replyToUnknownIq; SmackConfiguration.UnknownIqRequestReplyMode mode;
if (replyToUnknownIq) {
mode = SmackConfiguration.UnknownIqRequestReplyMode.replyServiceUnavailable;
} else {
mode = SmackConfiguration.UnknownIqRequestReplyMode.doNotReply;
}
unknownIqRequestReplyMode = mode;
} }
protected void parseAndProcessStanza(XmlPullParser parser) throws Exception { protected void parseAndProcessStanza(XmlPullParser parser) throws Exception {
@ -1048,7 +1070,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
* @throws InterruptedException * @throws InterruptedException
*/ */
protected void processStanza(final Stanza stanza) throws InterruptedException { protected void processStanza(final Stanza stanza) throws InterruptedException {
assert(stanza != null); assert (stanza != null);
lastStanzaReceived = System.currentTimeMillis(); lastStanzaReceived = System.currentTimeMillis();
// Deliver the incoming packet to listeners. // Deliver the incoming packet to listeners.
executorService.executeBlocking(new Runnable() { executorService.executeBlocking(new Runnable() {
@ -1089,13 +1111,24 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
throw new IllegalStateException("Should only encounter IQ type 'get' or 'set'"); throw new IllegalStateException("Should only encounter IQ type 'get' or 'set'");
} }
if (iqRequestHandler == null) { if (iqRequestHandler == null) {
if (!replyToUnkownIq) { XMPPError.Condition replyCondition;
switch (unknownIqRequestReplyMode) {
case doNotReply:
return; return;
case replyFeatureNotImplemented:
replyCondition = XMPPError.Condition.feature_not_implemented;
break;
case replyServiceUnavailable:
replyCondition = XMPPError.Condition.service_unavailable;
break;
default:
throw new AssertionError();
} }
// If the IQ stanza is of type "get" or "set" with no registered IQ request handler, then answer an // If the IQ stanza is of type "get" or "set" with no registered IQ request handler, then answer an
// IQ of type 'error' with condition 'service-unavailable'. // IQ of type 'error' with condition 'service-unavailable'.
ErrorIQ errorIQ = IQ.createErrorResponse(iq, XMPPError.getBuilder(( ErrorIQ errorIQ = IQ.createErrorResponse(iq, XMPPError.getBuilder((
XMPPError.Condition.service_unavailable))); replyCondition)));
try { try {
sendStanza(errorIQ); sendStanza(errorIQ);
} }
@ -1170,7 +1203,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
} }
// Loop through all collectors and notify the appropriate ones. // Loop through all collectors and notify the appropriate ones.
for (StanzaCollector collector: collectors) { for (StanzaCollector collector : collectors) {
collector.processStanza(packet); collector.processStanza(packet);
} }
@ -1192,7 +1225,7 @@ public abstract class AbstractXMPPConnection implements XMPPConnection {
for (StanzaListener listener : listenersToNotify) { for (StanzaListener listener : listenersToNotify) {
try { try {
listener.processStanza(packet); listener.processStanza(packet);
} catch(NotConnectedException e) { } catch (NotConnectedException e) {
LOGGER.log(Level.WARNING, "Got not connected exception, aborting", e); LOGGER.log(Level.WARNING, "Got not connected exception, aborting", e);
break; break;
} catch (Exception e) { } catch (Exception e) {

View file

@ -162,7 +162,7 @@ public abstract class ConnectionConfiguration {
enabledSaslMechanisms = builder.enabledSaslMechanisms; enabledSaslMechanisms = builder.enabledSaslMechanisms;
// If the enabledSaslmechanisms are set, then they must not be empty // If the enabledSaslmechanisms are set, then they must not be empty
assert(enabledSaslMechanisms != null ? !enabledSaslMechanisms.isEmpty() : true); assert (enabledSaslMechanisms != null ? !enabledSaslMechanisms.isEmpty() : true);
if (dnssecMode != DnssecMode.disabled && customSSLContext != null) { if (dnssecMode != DnssecMode.disabled && customSSLContext != null) {
throw new IllegalStateException("You can not use a custom SSL context with DNSSEC enabled"); throw new IllegalStateException("You can not use a custom SSL context with DNSSEC enabled");

View file

@ -132,13 +132,13 @@ public final class SASLAuthentication {
} }
public static boolean blacklistSASLMechanism(String mechansim) { public static boolean blacklistSASLMechanism(String mechansim) {
synchronized(BLACKLISTED_MECHANISMS) { synchronized (BLACKLISTED_MECHANISMS) {
return BLACKLISTED_MECHANISMS.add(mechansim); return BLACKLISTED_MECHANISMS.add(mechansim);
} }
} }
public static boolean unBlacklistSASLMechanism(String mechanism) { public static boolean unBlacklistSASLMechanism(String mechanism) {
synchronized(BLACKLISTED_MECHANISMS) { synchronized (BLACKLISTED_MECHANISMS) {
return BLACKLISTED_MECHANISMS.remove(mechanism); return BLACKLISTED_MECHANISMS.remove(mechanism);
} }
} }
@ -209,7 +209,7 @@ public final class SASLAuthentication {
} }
} }
if (saslException != null){ if (saslException != null) {
if (saslException instanceof SmackException) { if (saslException instanceof SmackException) {
throw (SmackException) saslException; throw (SmackException) saslException;
} else if (saslException instanceof SASLErrorException) { } else if (saslException instanceof SASLErrorException) {

View file

@ -34,6 +34,7 @@ import org.jivesoftware.smack.debugger.SmackDebugger;
import org.jivesoftware.smack.debugger.SmackDebuggerFactory; import org.jivesoftware.smack.debugger.SmackDebuggerFactory;
import org.jivesoftware.smack.parsing.ExceptionThrowingCallback; import org.jivesoftware.smack.parsing.ExceptionThrowingCallback;
import org.jivesoftware.smack.parsing.ParsingExceptionCallback; import org.jivesoftware.smack.parsing.ParsingExceptionCallback;
import org.jivesoftware.smack.util.Objects;
/** /**
* Represents the configuration of Smack. The configuration is used for: * Represents the configuration of Smack. The configuration is used for:
@ -173,7 +174,7 @@ public final class SmackConfiguration {
* @param mech the SASL mechanism to be added * @param mech the SASL mechanism to be added
*/ */
public static void addSaslMech(String mech) { public static void addSaslMech(String mech) {
if(!defaultMechs.contains(mech)) { if (!defaultMechs.contains(mech)) {
defaultMechs.add(mech); defaultMechs.add(mech);
} }
} }
@ -184,7 +185,7 @@ public final class SmackConfiguration {
* @param mechs the Collection of SASL mechanisms to be added * @param mechs the Collection of SASL mechanisms to be added
*/ */
public static void addSaslMechs(Collection<String> mechs) { public static void addSaslMechs(Collection<String> mechs) {
for(String mech : mechs) { for (String mech : mechs) {
addSaslMech(mech); addSaslMech(mech);
} }
} }
@ -370,4 +371,20 @@ public final class SmackConfiguration {
return defaultHostnameVerififer; return defaultHostnameVerififer;
} }
enum UnknownIqRequestReplyMode {
doNotReply,
replyFeatureNotImplemented,
replyServiceUnavailable,
}
// TODO Change to replyFeatureNotImplemented in Smack 4.3
private static UnknownIqRequestReplyMode unknownIqRequestReplyMode = UnknownIqRequestReplyMode.replyServiceUnavailable;
public static UnknownIqRequestReplyMode getUnknownIqRequestReplyMode() {
return unknownIqRequestReplyMode;
}
public static void setUnknownIqRequestReplyMode(UnknownIqRequestReplyMode unknownIqRequestReplyMode) {
SmackConfiguration.unknownIqRequestReplyMode = Objects.requireNonNull(unknownIqRequestReplyMode, "Must set mode");
}
} }

View file

@ -0,0 +1,170 @@
/**
*
* Copyright 2017 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;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.packet.Stanza;
public abstract class SmackFuture<V> implements Future<V> {
private boolean cancelled;
private V result;
protected Exception exception;
private SuccessCallback<V> successCallback;
private ExceptionCallback exceptionCallback;
@Override
public synchronized final boolean cancel(boolean mayInterruptIfRunning) {
if (isDone()) {
return false;
}
cancelled = true;
return true;
}
@Override
public synchronized final boolean isCancelled() {
return cancelled;
}
@Override
public synchronized final boolean isDone() {
return result != null;
}
public void onSuccessOrError(SuccessCallback<V> successCallback, ExceptionCallback exceptionCallback) {
this.successCallback = successCallback;
this.exceptionCallback = exceptionCallback;
maybeInvokeCallbacks();
}
public void onSuccess(SuccessCallback<V> successCallback) {
onSuccessOrError(successCallback, null);
}
public void onError(ExceptionCallback exceptionCallback) {
onSuccessOrError(null, exceptionCallback);
}
private final V getResultOrThrow() throws ExecutionException {
assert (result != null || exception != null);
if (result != null) {
return result;
}
throw new ExecutionException(exception);
}
@Override
public synchronized final V get() throws InterruptedException, ExecutionException {
while (result == null && exception == null) {
wait();
}
return getResultOrThrow();
}
@Override
public synchronized final V get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
final long deadline = System.currentTimeMillis() + unit.toMillis(timeout);
while (result != null && exception != null) {
final long waitTimeRemaining = deadline - System.currentTimeMillis();
if (waitTimeRemaining > 0) {
wait(waitTimeRemaining);
}
}
if (result == null || exception == null) {
throw new TimeoutException();
}
return getResultOrThrow();
}
protected final synchronized void maybeInvokeCallbacks() {
if (result != null && successCallback != null) {
successCallback.onSuccess(result);
} else if (exception != null && exceptionCallback != null) {
exceptionCallback.processException(exception);
}
}
/**
* This method checks if the given exception is <b>not</b> fatal. If this method returns <code>false</code>, then
* the future will automatically set the given exception as failure reason and notify potential waiting threads.
*
* @param exception the exception to check.
* @return <code>true</code> if the exception is not fatal, <code>false</code> otherwise.
*/
protected abstract boolean isNonFatalException(Exception exception);
protected abstract void handleStanza(Stanza stanza) throws NotConnectedException, InterruptedException;
protected final void setResult(V result) {
assert (Thread.holdsLock(this));
this.result = result;
this.notifyAll();
maybeInvokeCallbacks();
}
public static abstract class InternalSmackFuture<V> extends SmackFuture<V> implements StanzaListener, ExceptionCallback {
@Override
public synchronized final void processException(Exception exception) {
if (!isNonFatalException(exception)) {
this.exception = exception;
this.notifyAll();
maybeInvokeCallbacks();
}
}
/**
* Wrapper method for {@link #handleStanza(Stanza)}. Note that this method is <code>synchronized</code>.
*/
@Override
public synchronized final void processStanza(Stanza stanza) throws NotConnectedException, InterruptedException {
handleStanza(stanza);
}
}
/**
* A simple version of InternalSmackFuture which implements {@link #isNonFatalException(Exception)} as always returning <code>false</code> method.
*
* @param <V>
*/
public static abstract class SimpleInternalSmackFuture<V> extends InternalSmackFuture<V> {
@Override
protected boolean isNonFatalException(Exception exception) {
return false;
}
}
}

View file

@ -68,7 +68,7 @@ public final class SmackInitialization {
} catch (IOException e) { } catch (IOException e) {
LOGGER.log(Level.WARNING, "IOException closing stream", e); LOGGER.log(Level.WARNING, "IOException closing stream", e);
} }
} catch(Exception e) { } catch (Exception e) {
LOGGER.log(Level.SEVERE, "Could not determine Smack version", e); LOGGER.log(Level.SEVERE, "Could not determine Smack version", e);
smackVersion = "unkown"; smackVersion = "unkown";
} }

View file

@ -0,0 +1,23 @@
/**
*
* Copyright 2017 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;
public interface SuccessCallback<T> {
public void onSuccess(T result);
}

View file

@ -79,7 +79,7 @@ public class SynchronizationPoint<E extends Exception> {
if (request instanceof Stanza) { if (request instanceof Stanza) {
connection.sendStanza((Stanza) request); connection.sendStanza((Stanza) request);
} }
else if (request instanceof Nonza){ else if (request instanceof Nonza) {
connection.sendNonza((Nonza) request); connection.sendNonza((Nonza) request);
} else { } else {
throw new IllegalStateException("Unsupported element type"); throw new IllegalStateException("Unsupported element type");

View file

@ -413,6 +413,7 @@ public interface XMPPConnection {
* @deprecated use {@link #getReplyTimeout()} instead. * @deprecated use {@link #getReplyTimeout()} instead.
*/ */
@Deprecated @Deprecated
// TODO Remove in Smack 4.3
public long getPacketReplyTimeout(); public long getPacketReplyTimeout();
/** /**
@ -423,6 +424,7 @@ public interface XMPPConnection {
* @deprecated use {@link #setReplyTimeout(long)} instead. * @deprecated use {@link #setReplyTimeout(long)} instead.
*/ */
@Deprecated @Deprecated
// TODO Remove in Smack 4.3
public void setPacketReplyTimeout(long timeout); public void setPacketReplyTimeout(long timeout);
/** /**

View file

@ -39,7 +39,7 @@ public abstract class AbstractJidTypeFilter implements StanzaFilter {
@Override @Override
public final boolean accept(Stanza stanza) { public final boolean accept(Stanza stanza) {
final Jid jid = stanza.getFrom(); final Jid jid = getJidToInspect(stanza);
if (jid == null) { if (jid == null) {
return false; return false;

View file

@ -45,7 +45,7 @@ public abstract class AbstractListFilter implements StanzaFilter {
*/ */
protected AbstractListFilter(StanzaFilter... filters) { protected AbstractListFilter(StanzaFilter... filters) {
Objects.requireNonNull(filters, "Parameter must not be null."); Objects.requireNonNull(filters, "Parameter must not be null.");
for(StanzaFilter filter : filters) { for (StanzaFilter filter : filters) {
Objects.requireNonNull(filter, "Parameter must not be null."); Objects.requireNonNull(filter, "Parameter must not be null.");
} }
this.filters = new ArrayList<StanzaFilter>(Arrays.asList(filters)); this.filters = new ArrayList<StanzaFilter>(Arrays.asList(filters));

View file

@ -0,0 +1,43 @@
/**
*
* Copyright 2017 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.filter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.util.StringUtils;
/**
* Filters message stanzas which have at least one body.
*/
public final class MessageWithThreadFilter extends FlexibleStanzaTypeFilter<Message> {
public static final StanzaFilter INSTANCE = new MessageWithThreadFilter();
private MessageWithThreadFilter() {
super(Message.class);
}
@Override
protected boolean acceptSpecific(Message message) {
return StringUtils.isNotEmpty(message.getThread());
}
@Override
public String toString() {
return getClass().getSimpleName();
}
}

View file

@ -67,7 +67,10 @@ public class AbstractError {
String defaultLocale = Locale.getDefault().getLanguage(); String defaultLocale = Locale.getDefault().getLanguage();
String descriptiveText = getDescriptiveText(defaultLocale); String descriptiveText = getDescriptiveText(defaultLocale);
if (descriptiveText == null) { if (descriptiveText == null) {
descriptiveText = getDescriptiveText(""); descriptiveText = getDescriptiveText("en");
if (descriptiveText == null) {
descriptiveText = getDescriptiveText("");
}
} }
return descriptiveText; return descriptiveText;
} }

View file

@ -488,7 +488,7 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
// Add the subject in other languages // Add the subject in other languages
for (Subject subject : getSubjects()) { for (Subject subject : getSubjects()) {
// Skip the default language // Skip the default language
if(subject.equals(defaultSubject)) if (subject.equals(defaultSubject))
continue; continue;
buf.append(subject.toXML()); buf.append(subject.toXML());
} }
@ -500,7 +500,7 @@ public final class Message extends Stanza implements TypedCloneable<Message> {
// Add the bodies in other languages // Add the bodies in other languages
for (Body body : getBodies()) { for (Body body : getBodies()) {
// Skip the default language // Skip the default language
if(body.equals(defaultBody)) if (body.equals(defaultBody))
continue; continue;
buf.append(body.toXML()); buf.append(body.toXML());
} }

View file

@ -120,7 +120,7 @@ public final class StandardExtensionElement implements ExtensionElement {
} }
public List<StandardExtensionElement> getElements() { public List<StandardExtensionElement> getElements() {
if (elements == null){ if (elements == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
return elements.values(); return elements.values();

View file

@ -23,7 +23,7 @@ import org.xmlpull.v1.XmlPullParser;
public abstract class Provider<E extends Element> { public abstract class Provider<E extends Element> {
public final E parse(XmlPullParser parser) throws Exception{ public final E parse(XmlPullParser parser) throws Exception {
// XPP3 calling convention assert: Parser should be at start tag // XPP3 calling convention assert: Parser should be at start tag
ParserUtils.assertAtStartTag(parser); ParserUtils.assertAtStartTag(parser);

View file

@ -135,7 +135,7 @@ public class ProviderFileLoader implements ProviderLoader {
} }
while (eventType != XmlPullParser.END_DOCUMENT); while (eventType != XmlPullParser.END_DOCUMENT);
} }
catch (Exception e){ catch (Exception e) {
LOGGER.log(Level.SEVERE, "Unknown error occurred while parsing provider file", e); LOGGER.log(Level.SEVERE, "Unknown error occurred while parsing provider file", e);
exceptions.add(e); exceptions.add(e);
} }

View file

@ -31,7 +31,7 @@ public class ProxyException extends IOException {
public ProxyException(ProxyInfo.ProxyType type, String ex) public ProxyException(ProxyInfo.ProxyType type, String ex)
{ {
super("Proxy Exception " + type.toString() + " : "+ex); super("Proxy Exception " + type.toString() + " : " + ex);
} }
public ProxyException(ProxyInfo.ProxyType type) public ProxyException(ProxyInfo.ProxyType type)

View file

@ -50,12 +50,12 @@ public class Socks4ProxySocketConnection implements ProxySocketConnection {
try try
{ {
socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout); socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout);
in=socket.getInputStream(); in = socket.getInputStream();
out=socket.getOutputStream(); out = socket.getOutputStream();
socket.setTcpNoDelay(true); socket.setTcpNoDelay(true);
byte[] buf=new byte[1024]; byte[] buf = new byte[1024];
int index=0; int index = 0;
/* /*
1) CONNECT 1) CONNECT
@ -75,27 +75,27 @@ public class Socks4ProxySocketConnection implements ProxySocketConnection {
of all zero bits. of all zero bits.
*/ */
index=0; index = 0;
buf[index++]=4; buf[index++] = 4;
buf[index++]=1; buf[index++] = 1;
buf[index++]=(byte)(port>>>8); buf[index++] = (byte) (port >>> 8);
buf[index++]=(byte)(port&0xff); buf[index++] = (byte) (port & 0xff);
InetAddress inetAddress = InetAddress.getByName(proxy_host); InetAddress inetAddress = InetAddress.getByName(proxy_host);
byte[] byteAddress = inetAddress.getAddress(); byte[] byteAddress = inetAddress.getAddress();
for (int i = 0; i < byteAddress.length; i++) for (int i = 0; i < byteAddress.length; i++)
{ {
buf[index++]=byteAddress[i]; buf[index++] = byteAddress[i];
} }
if(user!=null) if (user != null)
{ {
byte[] userBytes = user.getBytes(StringUtils.UTF8); byte[] userBytes = user.getBytes(StringUtils.UTF8);
System.arraycopy(userBytes, 0, buf, index, user.length()); System.arraycopy(userBytes, 0, buf, index, user.length());
index+=user.length(); index += user.length();
} }
buf[index++]=0; buf[index++] = 0;
out.write(buf, 0, index); out.write(buf, 0, index);
/* /*
@ -125,49 +125,49 @@ public class Socks4ProxySocketConnection implements ProxySocketConnection {
The remaining fields are ignored. The remaining fields are ignored.
*/ */
int len=6; int len = 6;
int s=0; int s = 0;
while(s<len) while (s < len)
{ {
int i=in.read(buf, s, len-s); int i = in.read(buf, s, len - s);
if(i<=0) if (i <= 0)
{ {
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, throw new ProxyException(ProxyInfo.ProxyType.SOCKS4,
"stream is closed"); "stream is closed");
} }
s+=i; s += i;
} }
if(buf[0]!=0) if (buf[0] != 0)
{ {
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, throw new ProxyException(ProxyInfo.ProxyType.SOCKS4,
"server returns VN "+buf[0]); "server returns VN " + buf[0]);
} }
if(buf[1]!=90) if (buf[1] != 90)
{ {
try try
{ {
socket.close(); socket.close();
} }
catch(Exception eee) catch (Exception eee)
{ {
} }
String message="ProxySOCKS4: server returns CD "+buf[1]; String message = "ProxySOCKS4: server returns CD " + buf[1];
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4,message); throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, message);
} }
byte[] temp = new byte[2]; byte[] temp = new byte[2];
in.read(temp, 0, 2); in.read(temp, 0, 2);
} }
catch(RuntimeException e) catch (RuntimeException e)
{ {
throw e; throw e;
} }
catch(Exception e) catch (Exception e)
{ {
try try
{ {
socket.close(); socket.close();
} }
catch(Exception eee) catch (Exception eee)
{ {
} }
throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, e.toString()); throw new ProxyException(ProxyInfo.ProxyType.SOCKS4, e.toString());

View file

@ -50,13 +50,13 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
try try
{ {
socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout); socket.connect(new InetSocketAddress(proxy_host, proxy_port), timeout);
in=socket.getInputStream(); in = socket.getInputStream();
out=socket.getOutputStream(); out = socket.getOutputStream();
socket.setTcpNoDelay(true); socket.setTcpNoDelay(true);
byte[] buf=new byte[1024]; byte[] buf = new byte[1024];
int index=0; int index = 0;
/* /*
+----+----------+----------+ +----+----------+----------+
@ -79,11 +79,11 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
o X'FF' NO ACCEPTABLE METHODS o X'FF' NO ACCEPTABLE METHODS
*/ */
buf[index++]=5; buf[index++] = 5;
buf[index++]=2; buf[index++] = 2;
buf[index++]=0; // NO AUTHENTICATION REQUIRED buf[index++] = 0; // NO AUTHENTICATION REQUIRED
buf[index++]=2; // USERNAME/PASSWORD buf[index++] = 2; // USERNAME/PASSWORD
out.write(buf, 0, index); out.write(buf, 0, index);
@ -100,14 +100,14 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
//in.read(buf, 0, 2); //in.read(buf, 0, 2);
fill(in, buf, 2); fill(in, buf, 2);
boolean check=false; boolean check = false;
switch((buf[1])&0xff) switch ((buf[1]) & 0xff)
{ {
case 0: // NO AUTHENTICATION REQUIRED case 0: // NO AUTHENTICATION REQUIRED
check=true; check = true;
break; break;
case 2: // USERNAME/PASSWORD case 2: // USERNAME/PASSWORD
if(user==null || passwd==null) if (user == null || passwd == null)
{ {
break; break;
} }
@ -131,18 +131,18 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
PASSWD field that follows. The PASSWD field contains the password PASSWD field that follows. The PASSWD field contains the password
association with the given UNAME. association with the given UNAME.
*/ */
index=0; index = 0;
buf[index++]=1; buf[index++] = 1;
buf[index++]=(byte)(user.length()); buf[index++] = (byte) (user.length());
byte[] userBytes = user.getBytes(StringUtils.UTF8); byte[] userBytes = user.getBytes(StringUtils.UTF8);
System.arraycopy(userBytes, 0, buf, index, System.arraycopy(userBytes, 0, buf, index,
user.length()); user.length());
index+=user.length(); index += user.length();
byte[] passwordBytes = user.getBytes(StringUtils.UTF8); byte[] passwordBytes = user.getBytes(StringUtils.UTF8);
buf[index++]=(byte)(passwordBytes.length); buf[index++] = (byte) (passwordBytes.length);
System.arraycopy(passwordBytes, 0, buf, index, System.arraycopy(passwordBytes, 0, buf, index,
passwd.length()); passwd.length());
index+=passwd.length(); index += passwd.length();
out.write(buf, 0, index); out.write(buf, 0, index);
@ -162,21 +162,21 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
*/ */
//in.read(buf, 0, 2); //in.read(buf, 0, 2);
fill(in, buf, 2); fill(in, buf, 2);
if(buf[1]==0) if (buf[1] == 0)
{ {
check=true; check = true;
} }
break; break;
default: default:
} }
if(!check) if (!check)
{ {
try try
{ {
socket.close(); socket.close();
} }
catch(Exception eee) catch (Exception eee)
{ {
} }
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5, throw new ProxyException(ProxyInfo.ProxyType.SOCKS5,
@ -209,19 +209,19 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
order order
*/ */
index=0; index = 0;
buf[index++]=5; buf[index++] = 5;
buf[index++]=1; // CONNECT buf[index++] = 1; // CONNECT
buf[index++]=0; buf[index++] = 0;
byte[] hostb= host.getBytes(StringUtils.UTF8); byte[] hostb = host.getBytes(StringUtils.UTF8);
int len=hostb.length; int len = hostb.length;
buf[index++]=3; // DOMAINNAME buf[index++] = 3; // DOMAINNAME
buf[index++]=(byte)(len); buf[index++] = (byte) (len);
System.arraycopy(hostb, 0, buf, index, len); System.arraycopy(hostb, 0, buf, index, len);
index+=len; index += len;
buf[index++]=(byte)(port>>>8); buf[index++] = (byte) (port >>> 8);
buf[index++]=(byte)(port&0xff); buf[index++] = (byte) (port & 0xff);
out.write(buf, 0, index); out.write(buf, 0, index);
@ -263,20 +263,20 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
//in.read(buf, 0, 4); //in.read(buf, 0, 4);
fill(in, buf, 4); fill(in, buf, 4);
if(buf[1]!=0) if (buf[1] != 0)
{ {
try try
{ {
socket.close(); socket.close();
} }
catch(Exception eee) catch (Exception eee)
{ {
} }
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5, throw new ProxyException(ProxyInfo.ProxyType.SOCKS5,
"server returns "+buf[1]); "server returns " + buf[1]);
} }
switch(buf[3]&0xff) switch (buf[3] & 0xff)
{ {
case 1: case 1:
//in.read(buf, 0, 6); //in.read(buf, 0, 6);
@ -286,7 +286,7 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
//in.read(buf, 0, 1); //in.read(buf, 0, 1);
fill(in, buf, 1); fill(in, buf, 1);
//in.read(buf, 0, buf[0]+2); //in.read(buf, 0, buf[0]+2);
fill(in, buf, (buf[0]&0xff)+2); fill(in, buf, (buf[0] & 0xff) + 2);
break; break;
case 4: case 4:
//in.read(buf, 0, 18); //in.read(buf, 0, 18);
@ -295,17 +295,17 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
default: default:
} }
} }
catch(RuntimeException e) catch (RuntimeException e)
{ {
throw e; throw e;
} }
catch(Exception e) catch (Exception e)
{ {
try try
{ {
socket.close(); socket.close();
} }
catch(Exception eee) catch (Exception eee)
{ {
} }
// TODO convert to IOException(e) when minimum Android API level is 9 or higher // TODO convert to IOException(e) when minimum Android API level is 9 or higher
@ -316,16 +316,16 @@ public class Socks5ProxySocketConnection implements ProxySocketConnection {
private static void fill(InputStream in, byte[] buf, int len) private static void fill(InputStream in, byte[] buf, int len)
throws IOException throws IOException
{ {
int s=0; int s = 0;
while(s<len) while (s < len)
{ {
int i=in.read(buf, s, len-s); int i = in.read(buf, s, len - s);
if(i<=0) if (i <= 0)
{ {
throw new ProxyException(ProxyInfo.ProxyType.SOCKS5, "stream " + throw new ProxyException(ProxyInfo.ProxyType.SOCKS5, "stream " +
"is closed"); "is closed");
} }
s+=i; s += i;
} }
} }

View file

@ -164,7 +164,7 @@ public abstract class SASLMechanism implements Comparable<SASLMechanism> {
this.password = password; this.password = password;
this.authorizationId = authzid; this.authorizationId = authzid;
this.sslSession = sslSession; this.sslSession = sslSession;
assert(authorizationId == null || authzidSupported()); assert (authorizationId == null || authzidSupported());
authenticateInternal(); authenticateInternal();
authenticate(); authenticate();
} }
@ -194,7 +194,7 @@ public abstract class SASLMechanism implements Comparable<SASLMechanism> {
this.serviceName = serviceName; this.serviceName = serviceName;
this.authorizationId = authzid; this.authorizationId = authzid;
this.sslSession = sslSession; this.sslSession = sslSession;
assert(authorizationId == null || authzidSupported()); assert (authorizationId == null || authzidSupported());
authenticateInternal(cbh); authenticateInternal(cbh);
authenticate(); authenticate();
} }

View file

@ -232,7 +232,7 @@ public abstract class ScramMechanism extends SASLMechanism {
} }
String cbName = getChannelBindingName(); String cbName = getChannelBindingName();
assert(StringUtils.isNotEmpty(cbName)); assert (StringUtils.isNotEmpty(cbName));
return cbName + ',' + authzidPortion + ","; return cbName + ',' + authzidPortion + ",";
} }

View file

@ -81,7 +81,7 @@ public class EventManger<K, R, E extends Exception> {
return false; return false;
} }
reference.eventResult = eventResult; reference.eventResult = eventResult;
synchronized(reference) { synchronized (reference) {
reference.notifyAll(); reference.notifyAll();
} }
return true; return true;

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2014 Florian Schmaus * Copyright 2014-2017 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -19,9 +19,13 @@ package org.jivesoftware.smack.util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LazyStringBuilder implements Appendable, CharSequence { public class LazyStringBuilder implements Appendable, CharSequence {
private static final Logger LOGGER = Logger.getLogger(LazyStringBuilder.class.getName());
private final List<CharSequence> list; private final List<CharSequence> list;
private String cache; private String cache;
@ -69,8 +73,15 @@ public class LazyStringBuilder implements Appendable, CharSequence {
return cache.length(); return cache.length();
} }
int length = 0; int length = 0;
for (CharSequence csq : list) { try {
length += csq.length(); for (CharSequence csq : list) {
length += csq.length();
}
}
catch (NullPointerException npe) {
StringBuilder sb = safeToStringBuilder();
LOGGER.log(Level.SEVERE, "The following LazyStringBuilder threw a NullPointerException: " + sb, npe);
throw npe;
} }
return length; return length;
} }
@ -107,6 +118,14 @@ public class LazyStringBuilder implements Appendable, CharSequence {
return cache; return cache;
} }
public StringBuilder safeToStringBuilder() {
StringBuilder sb = new StringBuilder();
for (CharSequence csq : list) {
sb.append(csq);
}
return sb;
}
/** /**
* Get the List of CharSequences representation of this instance. The list is unmodifiable. If * Get the List of CharSequences representation of this instance. The list is unmodifiable. If
* the resulting String was already cached, a list with a single String entry will be returned. * the resulting String was already cached, a list with a single String entry will be returned.

View file

@ -143,7 +143,7 @@ public class MultiMap<K,V> {
if (res == null) { if (res == null) {
return null; return null;
} }
assert(!res.isEmpty()); assert (!res.isEmpty());
return res.iterator().next(); return res.iterator().next();
} }

View file

@ -214,7 +214,7 @@ public class PacketParserUtils {
public static Message parseMessage(XmlPullParser parser) public static Message parseMessage(XmlPullParser parser)
throws Exception { throws Exception {
ParserUtils.assertAtStartTag(parser); ParserUtils.assertAtStartTag(parser);
assert(parser.getName().equals(Message.ELEMENT)); assert (parser.getName().equals(Message.ELEMENT));
final int initialDepth = parser.getDepth(); final int initialDepth = parser.getDepth();
Message message = new Message(); Message message = new Message();
@ -247,7 +247,7 @@ public class PacketParserUtils {
case XmlPullParser.START_TAG: case XmlPullParser.START_TAG:
String elementName = parser.getName(); String elementName = parser.getName();
String namespace = parser.getNamespace(); String namespace = parser.getNamespace();
switch(elementName) { switch (elementName) {
case "subject": case "subject":
String xmlLangSubject = getLanguageAttribute(parser); String xmlLangSubject = getLanguageAttribute(parser);
if (xmlLangSubject == null) { if (xmlLangSubject == null) {
@ -385,7 +385,7 @@ public class PacketParserUtils {
*/ */
public static CharSequence parseContent(XmlPullParser parser) public static CharSequence parseContent(XmlPullParser parser)
throws XmlPullParserException, IOException { throws XmlPullParserException, IOException {
assert(parser.getEventType() == XmlPullParser.START_TAG); assert (parser.getEventType() == XmlPullParser.START_TAG);
if (parser.isEmptyElementTag()) { if (parser.isEmptyElementTag()) {
return ""; return "";
} }
@ -546,7 +546,7 @@ public class PacketParserUtils {
case XmlPullParser.START_TAG: case XmlPullParser.START_TAG:
String elementName = parser.getName(); String elementName = parser.getName();
String namespace = parser.getNamespace(); String namespace = parser.getNamespace();
switch(elementName) { switch (elementName) {
case "status": case "status":
presence.setStatus(parser.nextText()); presence.setStatus(parser.nextText());
break; break;
@ -620,7 +620,7 @@ public class PacketParserUtils {
case XmlPullParser.START_TAG: case XmlPullParser.START_TAG:
String elementName = parser.getName(); String elementName = parser.getName();
String namespace = parser.getNamespace(); String namespace = parser.getNamespace();
switch(elementName) { switch (elementName) {
case "error": case "error":
error = PacketParserUtils.parseError(parser); error = PacketParserUtils.parseError(parser);
break; break;
@ -775,7 +775,7 @@ public class PacketParserUtils {
descriptiveTexts = parseDescriptiveTexts(parser, descriptiveTexts); descriptiveTexts = parseDescriptiveTexts(parser, descriptiveTexts);
} }
else { else {
assert(condition == null); assert (condition == null);
condition = parser.getName(); condition = parser.getName();
} }
break; break;
@ -945,7 +945,7 @@ public class PacketParserUtils {
} }
} }
} }
assert(parser.getEventType() == XmlPullParser.END_TAG); assert (parser.getEventType() == XmlPullParser.END_TAG);
return new StartTls(required); return new StartTls(required);
} }
@ -954,7 +954,7 @@ public class PacketParserUtils {
final int initialDepth = parser.getDepth(); final int initialDepth = parser.getDepth();
boolean optional = false; boolean optional = false;
if (!parser.isEmptyElementTag()) { if (!parser.isEmptyElementTag()) {
outerloop: while(true) { outerloop: while (true) {
int event = parser.next(); int event = parser.next();
switch (event) { switch (event) {
case XmlPullParser.START_TAG: case XmlPullParser.START_TAG:
@ -1022,7 +1022,7 @@ public class PacketParserUtils {
} }
public static void addExtensionElement(Stanza packet, XmlPullParser parser, String elementName, public static void addExtensionElement(Stanza packet, XmlPullParser parser, String elementName,
String namespace) throws Exception{ String namespace) throws Exception {
ExtensionElement packetExtension = parseExtensionElement(elementName, namespace, parser); ExtensionElement packetExtension = parseExtensionElement(elementName, namespace, parser);
packet.addExtension(packetExtension); packet.addExtension(packetExtension);
} }

View file

@ -43,7 +43,7 @@ public class ParserUtils {
public static final String JID = "jid"; public static final String JID = "jid";
public static void assertAtStartTag(XmlPullParser parser) throws XmlPullParserException { public static void assertAtStartTag(XmlPullParser parser) throws XmlPullParserException {
assert(parser.getEventType() == XmlPullParser.START_TAG); assert (parser.getEventType() == XmlPullParser.START_TAG);
} }
public static void assertAtStartTag(XmlPullParser parser, String name) throws XmlPullParserException { public static void assertAtStartTag(XmlPullParser parser, String name) throws XmlPullParserException {
@ -52,7 +52,7 @@ public class ParserUtils {
} }
public static void assertAtEndTag(XmlPullParser parser) throws XmlPullParserException { public static void assertAtEndTag(XmlPullParser parser) throws XmlPullParserException {
assert(parser.getEventType() == XmlPullParser.END_TAG); assert (parser.getEventType() == XmlPullParser.END_TAG);
} }
public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth) public static void forwardToEndTagOfDepth(XmlPullParser parser, int depth)

View file

@ -121,7 +121,7 @@ public class StringUtils {
return null; return null;
} }
final int len = input.length(); final int len = input.length();
final StringBuilder out = new StringBuilder((int)(len*1.3)); final StringBuilder out = new StringBuilder((int) (len * 1.3));
CharSequence toAppend; CharSequence toAppend;
char ch; char ch;
int last = 0; int last = 0;
@ -153,7 +153,7 @@ public class StringUtils {
break; break;
case forAttribute: case forAttribute:
// No need to escape '>' for attributes. // No need to escape '>' for attributes.
switch(ch) { switch (ch) {
case '<': case '<':
toAppend = LT_ENCODE; toAppend = LT_ENCODE;
break; break;
@ -172,7 +172,7 @@ public class StringUtils {
break; break;
case forAttributeApos: case forAttributeApos:
// No need to escape '>' and '"' for attributes using '\'' as quote. // No need to escape '>' and '"' for attributes using '\'' as quote.
switch(ch) { switch (ch) {
case '<': case '<':
toAppend = LT_ENCODE; toAppend = LT_ENCODE;
break; break;
@ -188,7 +188,7 @@ public class StringUtils {
break; break;
case forText: case forText:
// No need to escape '"', '\'', and '>' for text. // No need to escape '"', '\'', and '>' for text.
switch(ch) { switch (ch) {
case '<': case '<':
toAppend = LT_ENCODE; toAppend = LT_ENCODE;
break; break;
@ -307,8 +307,8 @@ public class StringUtils {
final Random random = randGen.get(); final Random random = randGen.get();
// Create a char buffer to put random letters and numbers in. // Create a char buffer to put random letters and numbers in.
char [] randBuffer = new char[length]; char[] randBuffer = new char[length];
for (int i=0; i<randBuffer.length; i++) { for (int i = 0; i < randBuffer.length; i++) {
randBuffer[i] = numbersAndLetters[random.nextInt(numbersAndLetters.length)]; randBuffer[i] = numbersAndLetters[random.nextInt(numbersAndLetters.length)];
} }
return new String(randBuffer); return new String(randBuffer);
@ -336,7 +336,7 @@ public class StringUtils {
} }
private static char getPrintableChar(byte indexByte) { private static char getPrintableChar(byte indexByte) {
assert(numbersAndLetters.length < Byte.MAX_VALUE * 2); assert (numbersAndLetters.length < Byte.MAX_VALUE * 2);
// Convert indexByte as it where an unsigned byte by promoting it to int // Convert indexByte as it where an unsigned byte by promoting it to int
// and masking it with 0xff. Yields results from 0 - 254. // and masking it with 0xff. Yields results from 0 - 254.

View file

@ -172,7 +172,7 @@ public class XmlStringBuilder implements Appendable, CharSequence {
} }
public XmlStringBuilder halfOpenElement(String name) { public XmlStringBuilder halfOpenElement(String name) {
assert(StringUtils.isNotEmpty(name)); assert (StringUtils.isNotEmpty(name));
sb.append('<').append(name); sb.append('<').append(name);
return this; return this;
} }

View file

@ -89,7 +89,7 @@ public class HostAddress {
public void setException(InetAddress inetAddress, Exception exception) { public void setException(InetAddress inetAddress, Exception exception) {
Exception old = exceptions.put(inetAddress, exception); Exception old = exceptions.put(inetAddress, exception);
assert(old == null); assert (old == null);
} }
/** /**

View file

@ -0,0 +1,57 @@
/**
*
* Copyright 2017 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;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.jivesoftware.smack.SmackException.NotConnectedException;
import org.jivesoftware.smack.SmackFuture.InternalSmackFuture;
import org.jivesoftware.smack.SmackFuture.SimpleInternalSmackFuture;
import org.jivesoftware.smack.packet.Stanza;
import org.junit.Test;
public class SmackFutureTest {
@Test
public void simpleSmackFutureSuccessTest() throws NotConnectedException, InterruptedException, ExecutionException {
InternalSmackFuture<Boolean> future = new SimpleInternalSmackFuture<Boolean>() {
@Override
protected void handleStanza(Stanza stanza) throws NotConnectedException, InterruptedException {
setResult(true);
}
};
future.processStanza(null);
assertTrue(future.get());
}
@Test(expected = TimeoutException.class)
public void simpleSmackFutureTimeoutTest() throws InterruptedException, ExecutionException, TimeoutException {
InternalSmackFuture<Boolean> future = new SimpleInternalSmackFuture<Boolean>() {
@Override
protected void handleStanza(Stanza stanza) throws NotConnectedException, InterruptedException {
}
};
future.get(5, TimeUnit.SECONDS);
}
}

View file

@ -31,7 +31,7 @@ public class StanzaCollectorTest
{ {
TestStanzaCollector collector = new TestStanzaCollector(null, new OKEverything(), 5); TestStanzaCollector collector = new TestStanzaCollector(null, new OKEverything(), 5);
for (int i=0; i<6; i++) for (int i = 0; i < 6; i++)
{ {
Stanza testPacket = new TestPacket(i); Stanza testPacket = new TestPacket(i);
collector.processStanza(testPacket); collector.processStanza(testPacket);
@ -45,7 +45,7 @@ public class StanzaCollectorTest
assertEquals("5", collector.pollResult().getStanzaId()); assertEquals("5", collector.pollResult().getStanzaId());
assertNull(collector.pollResult()); assertNull(collector.pollResult());
for (int i=10; i<15; i++) for (int i = 10; i < 15; i++)
{ {
Stanza testPacket = new TestPacket(i); Stanza testPacket = new TestPacket(i);
collector.processStanza(testPacket); collector.processStanza(testPacket);
@ -156,7 +156,7 @@ public class StanzaCollectorTest
consumer2.start(); consumer2.start();
consumer3.start(); consumer3.start();
for(int i=0; i<insertCount; i++) for (int i = 0; i < insertCount; i++)
{ {
collector.processStanza(new TestPacket(i)); collector.processStanza(new TestPacket(i));
} }

View file

@ -57,9 +57,10 @@ public class ThreadedDummyConnection extends DummyConnection {
replyQ.add(replyPacket); replyQ.add(replyPacket);
} }
replyPacket.setStanzaId(packet.getStanzaId()); replyPacket.setStanzaId(packet.getStanzaId());
replyPacket.setFrom(packet.getTo());
replyPacket.setTo(packet.getFrom()); replyPacket.setTo(packet.getFrom());
replyPacket.setType(Type.result); if (replyPacket.getType() == null) {
replyPacket.setType(Type.result);
}
new ProcessQueue(replyQ).start(); new ProcessQueue(replyQ).start();
} }

View file

@ -29,7 +29,7 @@ public class FilterToStringTest {
andFilter.addFilter(new ThreadFilter("42")); andFilter.addFilter(new ThreadFilter("42"));
andFilter.addFilter(MessageWithBodiesFilter.INSTANCE); andFilter.addFilter(MessageWithBodiesFilter.INSTANCE);
final String res =andFilter.toString(); final String res = andFilter.toString();
assertEquals("AndFilter: (StanzaIdFilter: id=foo, ThreadFilter: thread=42, MessageWithBodiesFilter)", res); assertEquals("AndFilter: (StanzaIdFilter: id=foo, ThreadFilter: thread=42, MessageWithBodiesFilter)", res);
} }
} }

View file

@ -64,7 +64,7 @@ public class MessageTest {
assertXMLEqual(control, messageTypeSet.toXML().toString()); assertXMLEqual(control, messageTypeSet.toXML().toString());
} }
@Test(expected=NullPointerException.class) @Test(expected = NullPointerException.class)
public void setNullMessageBodyTest() { public void setNullMessageBodyTest() {
Message message = getNewMessage(); Message message = getNewMessage();
message.addBody(null, null); message.addBody(null, null);

View file

@ -60,7 +60,7 @@ public class PresenceTest {
assertXMLEqual(control, presenceTypeSet.toXML().toString()); assertXMLEqual(control, presenceTypeSet.toXML().toString());
} }
@Test(expected=NullPointerException.class) @Test(expected = NullPointerException.class)
public void setNullPresenceTypeTest() { public void setNullPresenceTypeTest() {
getNewPresence().setType(null); getNewPresence().setType(null);
} }
@ -113,7 +113,7 @@ public class PresenceTest {
assertXMLEqual(control, presence.toXML().toString()); assertXMLEqual(control, presence.toXML().toString());
} }
@Test(expected=IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void setIllegalPriorityTest() { public void setIllegalPriorityTest() {
getNewPresence().setPriority(Integer.MIN_VALUE); getNewPresence().setPriority(Integer.MIN_VALUE);
} }

View file

@ -54,7 +54,7 @@ public class ProviderConfigTest {
} }
@Test @Test
public void addClasspathFileLoaderProvider() throws Exception{ public void addClasspathFileLoaderProvider() throws Exception {
ProviderManager.addLoader(new ProviderFileLoader(FileUtils.getStreamForUrl("classpath:test.providers", null))); ProviderManager.addLoader(new ProviderFileLoader(FileUtils.getStreamForUrl("classpath:test.providers", null)));
Assert.assertNotNull(ProviderManager.getIQProvider("provider", "test:file_provider")); Assert.assertNotNull(ProviderManager.getIQProvider("provider", "test:file_provider"));
} }

View file

@ -29,7 +29,7 @@ public class ProviderManagerTest {
* This test should be run in a clean (e.g. forked) VM * This test should be run in a clean (e.g. forked) VM
*/ */
@Test @Test
public void shouldInitializeSmackTest() throws Exception{ public void shouldInitializeSmackTest() throws Exception {
ProviderManager.addIQProvider("foo", "bar", new TestIQProvider()); ProviderManager.addIQProvider("foo", "bar", new TestIQProvider());
assertTrue(SmackConfiguration.isSmackInitialized()); assertTrue(SmackConfiguration.isSmackInitialized());
} }

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright © 2014 Florian Schmaus * Copyright © 2014-2017 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -32,7 +32,7 @@ import org.jxmpp.jid.EntityBareJid;
public class DigestMd5SaslTest extends AbstractSaslTest { public class DigestMd5SaslTest extends AbstractSaslTest {
protected static final String challenge = "realm=\"xmpp.org\",nonce=\"aTUr3GXqUtyy2B7HVDW6C+gQs+j+0EhWWjoBKkkg\",qop=\"auth\",charset=utf-8,algorithm=md5-sess"; protected static final String challenge = "realm=\"xmpp.org\",nonce=\"jgGgnz+cQcmyVaAs2n88kQ==\",qop=\"auth\",charset=utf-8,algorithm=md5-sess";
protected static final byte[] challengeBytes = StringUtils.toBytes(challenge); protected static final byte[] challengeBytes = StringUtils.toBytes(challenge);
public DigestMd5SaslTest(SASLMechanism saslMechanism) { public DigestMd5SaslTest(SASLMechanism saslMechanism) {
@ -50,8 +50,7 @@ public class DigestMd5SaslTest extends AbstractSaslTest {
String[] responseParts = responseString.split(","); String[] responseParts = responseString.split(",");
Map<String, String> responsePairs = new HashMap<String, String>(); Map<String, String> responsePairs = new HashMap<String, String>();
for (String part : responseParts) { for (String part : responseParts) {
String[] keyValue = part.split("="); String[] keyValue = part.split("=", 2);
assertTrue(keyValue.length == 2);
String key = keyValue[0]; String key = keyValue[0];
String value = keyValue[1].replace("\"", ""); String value = keyValue[1].replace("\"", "");
responsePairs.put(key, value); responsePairs.put(key, value);
@ -59,7 +58,7 @@ public class DigestMd5SaslTest extends AbstractSaslTest {
if (useAuthzid) { if (useAuthzid) {
assertMapValue("authzid", "shazbat@xmpp.org", responsePairs); assertMapValue("authzid", "shazbat@xmpp.org", responsePairs);
} else { } else {
assert(!responsePairs.containsKey("authzid")); assertTrue (!responsePairs.containsKey("authzid"));
} }
assertMapValue("username", "florian", responsePairs); assertMapValue("username", "florian", responsePairs);
assertMapValue("realm", "xmpp.org", responsePairs); assertMapValue("realm", "xmpp.org", responsePairs);

View file

@ -664,7 +664,7 @@ public class PacketParserUtilsTest {
* *
* @throws Exception * @throws Exception
*/ */
@Test(expected=XmlPullParserException.class) @Test(expected = XmlPullParserException.class)
public void invalidMessageBodyContainingTagTest() throws Exception { public void invalidMessageBodyContainingTagTest() throws Exception {
String control = XMLBuilder.create("message") String control = XMLBuilder.create("message")
.a("from", "romeo@montague.lit/orchard") .a("from", "romeo@montague.lit/orchard")
@ -701,7 +701,7 @@ public class PacketParserUtilsTest {
try { try {
PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl)); PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl));
fail("Exception should be thrown"); fail("Exception should be thrown");
} catch(XmlPullParserException e) { } catch (XmlPullParserException e) {
assertTrue(e.getMessage().contains("end tag name </span>")); assertTrue(e.getMessage().contains("end tag name </span>"));
} }
@ -710,7 +710,7 @@ public class PacketParserUtilsTest {
try { try {
PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl)); PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl));
fail("Exception should be thrown"); fail("Exception should be thrown");
} catch(XmlPullParserException e) { } catch (XmlPullParserException e) {
assertTrue(e.getMessage().contains("end tag name </body>")); assertTrue(e.getMessage().contains("end tag name </body>"));
} }
@ -719,7 +719,7 @@ public class PacketParserUtilsTest {
try { try {
PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl)); PacketParserUtils.parseMessage(PacketParserUtils.getParserFor(invalidControl));
fail("Exception should be thrown"); fail("Exception should be thrown");
} catch(XmlPullParserException e) { } catch (XmlPullParserException e) {
assertTrue(e.getMessage().contains("end tag name </message>")); assertTrue(e.getMessage().contains("end tag name </message>"));
} }

View file

@ -70,7 +70,7 @@ public class SHA1Test {
*/ */
private boolean isValidHash(String result) { private boolean isValidHash(String result) {
boolean valid = true; boolean valid = true;
for (int i=0; i<result.length(); i++) { for (int i = 0; i < result.length(); i++) {
char c = result.charAt(i); char c = result.charAt(i);
if (HASH_CHARS.indexOf(c) < 0) { if (HASH_CHARS.indexOf(c) < 0) {
valid = false; valid = false;

View file

@ -263,7 +263,7 @@ public class EnhancedDebugger implements SmackDebugger {
} }
@Override @Override
public void reconnectingIn(final int seconds){ public void reconnectingIn(final int seconds) {
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -301,7 +301,7 @@ public class EnhancedDebugger implements SmackDebugger {
messagesTable = messagesTable =
new DefaultTableModel( new DefaultTableModel(
new Object[]{"Hide", "Timestamp", "", "", "Message", "Id", "Type", "To", "From"}, new Object[] {"Hide", "Timestamp", "", "", "Message", "Id", "Type", "To", "From"},
0) { 0) {
// CHECKSTYLE:OFF // CHECKSTYLE:OFF
private static final long serialVersionUID = 8136121224474217264L; private static final long serialVersionUID = 8136121224474217264L;
@ -735,9 +735,9 @@ public class EnhancedDebugger implements SmackDebugger {
packetsPanel.setBorder(BorderFactory.createTitledBorder("Transmitted Packets")); packetsPanel.setBorder(BorderFactory.createTitledBorder("Transmitted Packets"));
statisticsTable = statisticsTable =
new DefaultTableModel(new Object[][]{{"IQ", 0, 0}, {"Message", 0, 0}, new DefaultTableModel(new Object[][] { {"IQ", 0, 0}, {"Message", 0, 0},
{"Presence", 0, 0}, {"Other", 0, 0}, {"Total", 0, 0}}, {"Presence", 0, 0}, {"Other", 0, 0}, {"Total", 0, 0}},
new Object[]{"Type", "Received", "Sent"}) { new Object[] {"Type", "Received", "Sent"}) {
// CHECKSTYLE:OFF // CHECKSTYLE:OFF
private static final long serialVersionUID = -6793886085109589269L; private static final long serialVersionUID = -6793886085109589269L;
@Override @Override
@ -878,7 +878,7 @@ public class EnhancedDebugger implements SmackDebugger {
} }
messagesTable.addRow( messagesTable.addRow(
new Object[]{ new Object[] {
formatXML(packet.toXML().toString()), formatXML(packet.toXML().toString()),
dateFormatter.format(new Date()), dateFormatter.format(new Date()),
packetReceivedIcon, packetReceivedIcon,
@ -940,7 +940,7 @@ public class EnhancedDebugger implements SmackDebugger {
} }
messagesTable.addRow( messagesTable.addRow(
new Object[]{ new Object[] {
formatXML(packet.toXML().toString()), formatXML(packet.toXML().toString()),
dateFormatter.format(new Date()), dateFormatter.format(new Date()),
packetSentIcon, packetSentIcon,

View file

@ -289,8 +289,8 @@ public class LiteDebugger implements SmackDebugger {
*/ */
public void rootWindowClosing(WindowEvent evt) { public void rootWindowClosing(WindowEvent evt) {
connection.removeAsyncStanzaListener(listener); connection.removeAsyncStanzaListener(listener);
((ObservableReader)reader).removeReaderListener(readerListener); ((ObservableReader) reader).removeReaderListener(readerListener);
((ObservableWriter)writer).removeWriterListener(writerListener); ((ObservableWriter) writer).removeWriterListener(writerListener);
} }
/** /**
@ -322,7 +322,7 @@ public class LiteDebugger implements SmackDebugger {
@Override @Override
public Reader newConnectionReader(Reader newReader) { public Reader newConnectionReader(Reader newReader) {
((ObservableReader)reader).removeReaderListener(readerListener); ((ObservableReader) reader).removeReaderListener(readerListener);
ObservableReader debugReader = new ObservableReader(newReader); ObservableReader debugReader = new ObservableReader(newReader);
debugReader.addReaderListener(readerListener); debugReader.addReaderListener(readerListener);
reader = debugReader; reader = debugReader;
@ -331,7 +331,7 @@ public class LiteDebugger implements SmackDebugger {
@Override @Override
public Writer newConnectionWriter(Writer newWriter) { public Writer newConnectionWriter(Writer newWriter) {
((ObservableWriter)writer).removeWriterListener(writerListener); ((ObservableWriter) writer).removeWriterListener(writerListener);
ObservableWriter debugWriter = new ObservableWriter(newWriter); ObservableWriter debugWriter = new ObservableWriter(newWriter);
debugWriter.addWriterListener(writerListener); debugWriter.addWriterListener(writerListener);
writer = debugWriter; writer = debugWriter;

View file

@ -123,7 +123,7 @@ public final class CarbonManager extends Manager {
// also reset here. // also reset here.
enabled_state = false; enabled_state = false;
boolean removed = connection().removeSyncStanzaListener(carbonsListener); boolean removed = connection().removeSyncStanzaListener(carbonsListener);
assert(removed); assert (removed);
} }
@Override @Override
public void authenticated(XMPPConnection connection, boolean resumed) { public void authenticated(XMPPConnection connection, boolean resumed) {

View file

@ -0,0 +1,57 @@
/**
*
* Copyright 2017 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.smackx.eme;
import java.util.Map;
import java.util.WeakHashMap;
import org.jivesoftware.smack.ConnectionCreationListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPConnectionRegistry;
import org.jivesoftware.smackx.disco.ServiceDiscoveryManager;
import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement;
public final class ExplicitMessageEncryptionManager {
private static final Map<XMPPConnection, ExplicitMessageEncryptionManager> INSTANCES = new WeakHashMap<>();
static {
XMPPConnectionRegistry.addConnectionCreationListener(new ConnectionCreationListener() {
@Override
public void connectionCreated(XMPPConnection connection) {
getInstanceFor(connection);
}
});
}
public static final String NAMESPACE_V0 = ExplicitMessageEncryptionElement.NAMESPACE;
public static synchronized ExplicitMessageEncryptionManager getInstanceFor(XMPPConnection connection) {
ExplicitMessageEncryptionManager manager = INSTANCES.get(connection);
if (manager == null) {
manager = new ExplicitMessageEncryptionManager(connection);
INSTANCES.put(connection, manager);
}
return manager;
}
private ExplicitMessageEncryptionManager(XMPPConnection connection) {
ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection);
sdm.addFeature(NAMESPACE_V0);
}
}

View file

@ -0,0 +1,146 @@
/**
*
* Copyright 2017 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.smackx.eme.element;
import java.util.HashMap;
import java.util.Map;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smack.util.XmlStringBuilder;
public class ExplicitMessageEncryptionElement implements ExtensionElement {
private static final Map<String, ExplicitMessageEncryptionProtocol> PROTOCOL_LUT = new HashMap<>();
public static final String ELEMENT = "encryption";
public static final String NAMESPACE = "urn:xmpp:eme:0";
public enum ExplicitMessageEncryptionProtocol {
/**
* The encryption method specified in <a href="https://xmpp.org/extensions/xep-0373.html">XEP-0373: OpenPGP for
* XMPP</a>.
*/
openpgpV0("urn:xmpp:openpgp:0", "OpenPGP for XMPP (XEP-0373)"),
otrV0("urn:xmpp:otr:0", "Off-the-Record Messaging (XEP-0364)"),
legacyOpenPGP("jabber:x:encrypted", "Legacy OpenPGP for XMPP [DANGEROUS, DO NOT USE!]"),
;
private final String namespace;
private final String name;
private ExplicitMessageEncryptionProtocol(String namespace, String name) {
this.namespace = namespace;
this.name = name;
PROTOCOL_LUT.put(namespace, this);
}
public String getNamespace() {
return namespace;
}
public String getName() {
return name;
}
public static ExplicitMessageEncryptionProtocol from(String namespace) {
return PROTOCOL_LUT.get(namespace);
}
}
private final String encryptionNamespace;
private final String name;
private boolean isUnknownProtocol;
private ExplicitMessageEncryptionProtocol protocolCache;
public ExplicitMessageEncryptionElement(ExplicitMessageEncryptionProtocol protocol) {
this(protocol.getNamespace(), protocol.getName());
}
public ExplicitMessageEncryptionElement(String encryptionNamespace) {
this(encryptionNamespace, null);
}
public ExplicitMessageEncryptionElement(String encryptionNamespace, String name) {
this.encryptionNamespace = StringUtils.requireNotNullOrEmpty(encryptionNamespace,
"encryptionNamespace must not be null");
this.name = name;
}
public ExplicitMessageEncryptionProtocol getProtocol() {
if (protocolCache != null) {
return protocolCache;
}
if (isUnknownProtocol) {
return null;
}
ExplicitMessageEncryptionProtocol protocol = PROTOCOL_LUT.get(encryptionNamespace);
if (protocol == null) {
isUnknownProtocol = true;
return null;
}
protocolCache = protocol;
return protocol;
}
public String getEncryptionNamespace() {
return encryptionNamespace;
}
/**
* Get the optional name of the encryption method.
*
* @return the name of the encryption method or <code>null</code>.
*/
public String getName() {
return name;
}
@Override
public String getElementName() {
return ELEMENT;
}
@Override
public String getNamespace() {
return NAMESPACE;
}
@Override
public XmlStringBuilder toXML() {
XmlStringBuilder xml = new XmlStringBuilder(this);
xml.attribute("namespace", getEncryptionNamespace());
xml.optAttribute("name", getName());
xml.closeEmptyElement();
return xml;
}
public static ExplicitMessageEncryptionElement from(Message message) {
return message.getExtension(ELEMENT, NAMESPACE);
}
}

View file

@ -0,0 +1,20 @@
/**
*
* Copyright 2017 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.
*/
/**
* XMPP extension elements for XEP-0380: Explicit Message Encryption.
*/
package org.jivesoftware.smackx.eme.element;

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright 2015 Florian Schmaus * Copyright 2017 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -14,8 +14,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
/** /**
* TODO describe me * Smack's API for XEP-0380: Explicit Message Encryption.
*/ */
package org.jivesoftware.smackx.iqprivate; package org.jivesoftware.smackx.eme;

View file

@ -0,0 +1,32 @@
/**
*
* Copyright 2017 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.smackx.eme.provider;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement;
import org.xmlpull.v1.XmlPullParser;
public class ExplicitMessageEncryptionProvider extends ExtensionElementProvider<ExplicitMessageEncryptionElement> {
@Override
public ExplicitMessageEncryptionElement parse(XmlPullParser parser, int initialDepth) throws Exception {
String namespace = parser.getAttributeValue(null, "namespace");
String name = parser.getAttributeValue(null, "name");
return new ExplicitMessageEncryptionElement(namespace, name);
}
}

View file

@ -0,0 +1,20 @@
/**
*
* Copyright 2017 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.
*/
/**
* Smack Provider for XEP-0380: Explicit Message Encryption.
*/
package org.jivesoftware.smackx.eme.provider;

View file

@ -0,0 +1,71 @@
/**
*
* Copyright 2017 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.smackx.hints;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.hints.element.MessageProcessingHintType;
import org.jivesoftware.smackx.hints.element.NoCopyHint;
import org.jivesoftware.smackx.hints.element.NoPermanentStoreHint;
import org.jivesoftware.smackx.hints.element.NoStoreHint;
import org.jivesoftware.smackx.hints.element.StoreHint;
public class MessageProcessingHintsManager {
public static Set<MessageProcessingHintType> getHintsFrom(Message message) {
Set<MessageProcessingHintType> hints = null;
boolean noCopyHint = NoCopyHint.hasHint(message);
if (noCopyHint) {
hints = new HashSet<>(MessageProcessingHintType.values().length);
hints.add(MessageProcessingHintType.no_copy);
}
boolean noPermanentStoreHint = NoPermanentStoreHint.hasHint(message);
if (noPermanentStoreHint) {
if (hints == null) {
hints = new HashSet<>(MessageProcessingHintType.values().length);
}
hints.add(MessageProcessingHintType.no_permanent_store);
}
boolean noStoreHint = NoStoreHint.hasHint(message);
if (noStoreHint) {
if (hints == null) {
hints = new HashSet<>(MessageProcessingHintType.values().length);
}
hints.add(MessageProcessingHintType.no_store);
}
boolean storeHint = StoreHint.hasHint(message);
if (storeHint) {
if (hints == null) {
hints = new HashSet<>(MessageProcessingHintType.values().length);
}
hints.add(MessageProcessingHintType.store);
}
if (hints == null) {
return Collections.emptySet();
}
return hints;
}
}

View file

@ -0,0 +1,32 @@
/**
*
* Copyright 2017 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.smackx.hints.element;
import org.jivesoftware.smack.packet.ExtensionElement;
public abstract class MessageProcessingHint implements ExtensionElement {
public static final String NAMESPACE = "urn:xmpp:hints";
@Override
public final String getNamespace() {
return NAMESPACE;
}
public abstract MessageProcessingHintType getHintType();
}

View file

@ -0,0 +1,27 @@
/**
*
* Copyright 2017 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.smackx.hints.element;
public enum MessageProcessingHintType {
no_permanent_store,
no_store,
no_copy,
store,
;
}

View file

@ -0,0 +1,61 @@
/**
*
* Copyright 2017 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.smackx.hints.element;
import org.jivesoftware.smack.packet.Message;
/**
* A "no copy" hint. Messages with this hint should not be copied to addresses other than the one to which it is addressed.
*
* @see <a href="https://xmpp.org/extensions/xep-0334.html#no-copy">XEP-0344 § 4.3 No copies</a>
*/
public final class NoCopyHint extends MessageProcessingHint {
public static final NoCopyHint INSTANCE = new NoCopyHint();
public static final String ELEMENT = "no-copy";
private NoCopyHint() {
}
@Override
public String getElementName() {
return ELEMENT;
}
@Override
public String toXML() {
return '<' + ELEMENT + " xmlns='" + NAMESPACE + "'/>";
}
@Override
public MessageProcessingHintType getHintType() {
return MessageProcessingHintType.no_copy;
}
public static NoCopyHint from(Message message) {
return message.getExtension(ELEMENT, NAMESPACE);
}
public static boolean hasHint(Message message) {
return from(message) != null;
}
public static void set(Message message) {
message.addExtension(INSTANCE);
}
}

View file

@ -0,0 +1,69 @@
/**
*
* Copyright 2017 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.smackx.hints.element;
import org.jivesoftware.smack.packet.Message;
/**
* A "no permanent store" hint. Messages with this hint should not be stored in permanent stores or archives.
*
* @see <a href="https://xmpp.org/extensions/xep-0334.html#no-permanent-store">XEP-0334 § 4.1 No permanent store</a>
*/
public final class NoPermanentStoreHint extends MessageProcessingHint {
public static final NoPermanentStoreHint INSTANCE = new NoPermanentStoreHint();
public static final String ELEMENT = "no-permanent-store";
private NoPermanentStoreHint() {
}
@Override
public String getElementName() {
return ELEMENT;
}
@Override
public String toXML() {
return '<' + ELEMENT + " xmlns='" + NAMESPACE + "'/>";
}
@Override
public MessageProcessingHintType getHintType() {
return MessageProcessingHintType.no_permanent_store;
}
public static NoPermanentStoreHint from(Message message) {
return message.getExtension(ELEMENT, NAMESPACE);
}
public static boolean hasHint(Message message) {
return from(message) != null;
}
public static void set(Message message) {
if (StoreHint.hasHint(message)) {
// No need to set the no-permanent-store hint when a no-store hint is already set.
return;
}
setExplicitly(message);
}
public static void setExplicitly(Message message) {
message.addExtension(INSTANCE);
}
}

View file

@ -0,0 +1,61 @@
/**
*
* Copyright 2017 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.smackx.hints.element;
import org.jivesoftware.smack.packet.Message;
/**
* A "no store" hint. Messages with this hint should not be stored in stores or archives.
*
* <a href="https://xmpp.org/extensions/xep-0334.html#no-store">XEP-0334 § 4.2 No store</a>
*/
public final class NoStoreHint extends MessageProcessingHint {
public static final NoStoreHint INSTANCE = new NoStoreHint();
public static final String ELEMENT = "no-store";
private NoStoreHint() {
}
@Override
public String getElementName() {
return ELEMENT;
}
@Override
public String toXML() {
return '<' + ELEMENT + " xmlns='" + NAMESPACE + "'/>";
}
@Override
public MessageProcessingHintType getHintType() {
return MessageProcessingHintType.no_store;
}
public static NoStoreHint from(Message message) {
return message.getExtension(ELEMENT, NAMESPACE);
}
public static boolean hasHint(Message message) {
return from(message) != null;
}
public static void set(Message message) {
message.addExtension(INSTANCE);
}
}

View file

@ -0,0 +1,61 @@
/**
*
* Copyright 2017 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.smackx.hints.element;
import org.jivesoftware.smack.packet.Message;
/**
* A "store" hint. Messages with this hint should be stored in permanent stores or archives.
*
* @see <a href="https://xmpp.org/extensions/xep-0334.html#sect-idm140684698220992">XEP-0334 § 4.4 Store</a>
*/
public final class StoreHint extends MessageProcessingHint {
public static final StoreHint INSTANCE = new StoreHint();
public static final String ELEMENT = "store";
private StoreHint() {
}
@Override
public String getElementName() {
return ELEMENT;
}
@Override
public String toXML() {
return '<' + ELEMENT + " xmlns='" + NAMESPACE + "'/>";
}
@Override
public MessageProcessingHintType getHintType() {
return MessageProcessingHintType.store;
}
public static StoreHint from(Message message) {
return message.getExtension(ELEMENT, NAMESPACE);
}
public static boolean hasHint(Message message) {
return from(message) != null;
}
public static void set(Message message) {
message.addExtension(INSTANCE);
}
}

View file

@ -0,0 +1,20 @@
/**
*
* Copyright 2017 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.
*/
/**
* XMPP extension elements for XEP-0334: Message Processing Hints.
*/
package org.jivesoftware.smackx.hints.element;

View file

@ -0,0 +1,20 @@
/**
*
* Copyright 2017 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.
*/
/**
* Smack's API for XEP-0334: Message Processing Hints.
*/
package org.jivesoftware.smackx.hints;

View file

@ -0,0 +1,31 @@
/**
*
* Copyright 2017 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.smackx.hints.provider;
import org.jivesoftware.smack.provider.ExtensionElementProvider;
import org.jivesoftware.smackx.hints.element.MessageProcessingHint;
import org.xmlpull.v1.XmlPullParser;
public abstract class MessageProcessingHintProvider<H extends MessageProcessingHint> extends ExtensionElementProvider<H> {
@Override
public H parse(XmlPullParser parser, int initialDepth) throws Exception {
return getHint();
}
protected abstract H getHint();
}

View file

@ -0,0 +1,28 @@
/**
*
* Copyright 2017 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.smackx.hints.provider;
import org.jivesoftware.smackx.hints.element.NoCopyHint;
public class NoCopyHintProvider extends MessageProcessingHintProvider<NoCopyHint> {
@Override
protected NoCopyHint getHint() {
return NoCopyHint.INSTANCE;
}
}

View file

@ -0,0 +1,28 @@
/**
*
* Copyright 2017 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.smackx.hints.provider;
import org.jivesoftware.smackx.hints.element.NoPermanentStoreHint;
public class NoPermanentStoreHintProvider extends MessageProcessingHintProvider<NoPermanentStoreHint> {
@Override
protected NoPermanentStoreHint getHint() {
return NoPermanentStoreHint.INSTANCE;
}
}

View file

@ -0,0 +1,28 @@
/**
*
* Copyright 2017 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.smackx.hints.provider;
import org.jivesoftware.smackx.hints.element.NoStoreHint;
public class NoStoreHintProvider extends MessageProcessingHintProvider<NoStoreHint> {
@Override
protected NoStoreHint getHint() {
return NoStoreHint.INSTANCE;
}
}

View file

@ -0,0 +1,28 @@
/**
*
* Copyright 2017 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.smackx.hints.provider;
import org.jivesoftware.smackx.hints.element.StoreHint;
public class StoreHintProvider extends MessageProcessingHintProvider<StoreHint> {
@Override
protected StoreHint getHint() {
return StoreHint.INSTANCE;
}
}

View file

@ -0,0 +1,20 @@
/**
*
* Copyright 2017 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.
*/
/**
* Smack Provider for XEP-0334: Message Processing Hints.
*/
package org.jivesoftware.smackx.hints.provider;

View file

@ -121,7 +121,7 @@ public final class HttpFileUploadManager extends Manager {
} }
private static UploadService uploadServiceFrom(DiscoverInfo discoverInfo) { private static UploadService uploadServiceFrom(DiscoverInfo discoverInfo) {
assert(containsHttpFileUploadNamespace(discoverInfo)); assert (containsHttpFileUploadNamespace(discoverInfo));
UploadService.Version version; UploadService.Version version;
if (discoverInfo.containsFeature(NAMESPACE)) { if (discoverInfo.containsFeature(NAMESPACE)) {

View file

@ -34,13 +34,13 @@ public class FileTooLargeErrorProvider extends ExtensionElementProvider<FileTooL
final String namespace = parser.getNamespace(); final String namespace = parser.getNamespace();
Long maxFileSize = null; Long maxFileSize = null;
outerloop: while(true) { outerloop: while (true) {
int event = parser.next(); int event = parser.next();
switch (event) { switch (event) {
case XmlPullParser.START_TAG: case XmlPullParser.START_TAG:
String name = parser.getName(); String name = parser.getName();
switch(name) { switch (name) {
case "max-file-size": case "max-file-size":
maxFileSize = Long.valueOf(parser.nextText()); maxFileSize = Long.valueOf(parser.nextText());
break; break;

View file

@ -50,7 +50,7 @@ public class SlotProvider extends IQProvider<Slot> {
switch (event) { switch (event) {
case XmlPullParser.START_TAG: case XmlPullParser.START_TAG:
String name = parser.getName(); String name = parser.getName();
switch(name) { switch (name) {
case "put": case "put":
putUrl = new URL(parser.nextText()); putUrl = new URL(parser.nextText());
break; break;

View file

@ -1,6 +1,6 @@
/** /**
* *
* Copyright © 2016 Florian Schmaus * Copyright © 2016-2017 Florian Schmaus
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -21,7 +21,7 @@ import org.jxmpp.jid.BareJid;
public class IoTIsFriendResponse extends IQ { public class IoTIsFriendResponse extends IQ {
public static final String ELEMENT = "isFriend"; public static final String ELEMENT = "isFriendResponse";
public static final String NAMESPACE = Constants.IOT_PROVISIONING_NAMESPACE; public static final String NAMESPACE = Constants.IOT_PROVISIONING_NAMESPACE;
private final BareJid jid; private final BareJid jid;
@ -46,6 +46,7 @@ public class IoTIsFriendResponse extends IQ {
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.attribute("jid", jid); xml.attribute("jid", jid);
xml.attribute("result", result); xml.attribute("result", result);
xml.setEmptyElement();
return xml; return xml;
} }

View file

@ -96,7 +96,7 @@ public class EnablePushNotificationsIQ extends IQ {
xml.rightAngleBracket(); xml.rightAngleBracket();
if (publishOptions != null) { if (publishOptions != null) {
DataForm dataForm = new DataForm(DataForm.Type.form); DataForm dataForm = new DataForm(DataForm.Type.submit);
FormField formTypeField = new FormField("FORM_TYPE"); FormField formTypeField = new FormField("FORM_TYPE");
formTypeField.addValue(PubSub.NAMESPACE + "#publish-options"); formTypeField.addValue(PubSub.NAMESPACE + "#publish-options");

View file

@ -233,6 +233,28 @@
<className>org.jivesoftware.smackx.chat_markers.provider.AcknowledgedProvider</className> <className>org.jivesoftware.smackx.chat_markers.provider.AcknowledgedProvider</className>
</extensionProvider> </extensionProvider>
<!-- XEP-0334: Message Processing Hints -->
<extensionProvider>
<elementName>no-copy</elementName>
<namespace>urn:xmpp:hints</namespace>
<className>org.jivesoftware.smackx.hints.provider.NoCopyHintProvider</className>
</extensionProvider>
<extensionProvider>
<elementName>no-permanent-store</elementName>
<namespace>urn:xmpp:hints</namespace>
<className>org.jivesoftware.smackx.hints.provider.NoPermanentStoreHintProvider</className>
</extensionProvider>
<extensionProvider>
<elementName>no-store</elementName>
<namespace>urn:xmpp:hints</namespace>
<className>org.jivesoftware.smackx.hints.provider.NoStoreHintProvider</className>
</extensionProvider>
<extensionProvider>
<elementName>store</elementName>
<namespace>urn:xmpp:hints</namespace>
<className>org.jivesoftware.smackx.hints.provider.StoreHintProvider</className>
</extensionProvider>
g
<!-- XEP-0363: HTTP File Upload --> <!-- XEP-0363: HTTP File Upload -->
<iqProvider> <iqProvider>
<elementName>slot</elementName> <elementName>slot</elementName>
@ -255,4 +277,11 @@
<className>org.jivesoftware.smackx.httpfileupload.provider.FileTooLargeErrorProvider</className> <className>org.jivesoftware.smackx.httpfileupload.provider.FileTooLargeErrorProvider</className>
</extensionProvider> </extensionProvider>
<!-- XEP-0380: Explicit Message Encryption -->
<extensionProvider>
<elementName>encryption</elementName>
<namespace>urn:xmpp:eme:0</namespace>
<className>org.jivesoftware.smackx.eme.provider.ExplicitMessageEncryptionProvider</className>
</extensionProvider>
</smackProviders> </smackProviders>

View file

@ -5,5 +5,6 @@
<className>org.jivesoftware.smackx.iot.discovery.IoTDiscoveryManager</className> <className>org.jivesoftware.smackx.iot.discovery.IoTDiscoveryManager</className>
<className>org.jivesoftware.smackx.iot.provisioning.IoTProvisioningManager</className> <className>org.jivesoftware.smackx.iot.provisioning.IoTProvisioningManager</className>
<className>org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager</className> <className>org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager</className>
<className>org.jivesoftware.smackx.eme.ExplicitMessageEncryptionManager</className>
</startupClasses> </startupClasses>
</smack> </smack>

View file

@ -94,7 +94,7 @@ public class CarbonTest extends ExperimentalInitializerTest {
assertEquals("received", parser.getName()); assertEquals("received", parser.getName());
} }
@Test(expected=Exception.class) @Test(expected = Exception.class)
public void carbonEmptyTest() throws Exception { public void carbonEmptyTest() throws Exception {
XmlPullParser parser; XmlPullParser parser;
String control; String control;

View file

@ -0,0 +1,47 @@
/**
*
* Copyright 2017 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.smackx.eme.provider;
import static org.junit.Assert.assertEquals;
import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement;
import org.jivesoftware.smackx.eme.element.ExplicitMessageEncryptionElement.ExplicitMessageEncryptionProtocol;
import org.junit.Test;
public class ExplicitMessageEncryptionProviderTest {
private static final String OX_EME_ELEMENT = "<encryption xmlns='urn:xmpp:eme:0' namespace='urn:xmpp:openpgp:0'/>";
private static final String UNKNOWN_NAMESPACE = "urn:xmpp:foobar:0";
private static final String UNKNOWN_NAME = "Foo Bar";
private static final String UNKNOWN_EME_ELEMENT = "<encryption xmlns='urn:xmpp:eme:0' namespace='" + UNKNOWN_NAMESPACE
+ "' name='" + UNKNOWN_NAME + "'/>";
@Test
public void testParseOxEmeElement() throws Exception {
ExplicitMessageEncryptionElement eme = TestUtils.parseExtensionElement(OX_EME_ELEMENT);
assertEquals(ExplicitMessageEncryptionProtocol.openpgpV0, eme.getProtocol());
}
@Test
public void testParseUnknownEmeElement() throws Exception {
ExplicitMessageEncryptionElement eme = TestUtils.parseExtensionElement(UNKNOWN_EME_ELEMENT);
assertEquals(UNKNOWN_NAMESPACE, eme.getEncryptionNamespace());
assertEquals(UNKNOWN_NAME, eme.getName());
}
}

View file

@ -27,7 +27,7 @@ public class MUCLightDestroyTest {
+ "<query xmlns='urn:xmpp:muclight:0#destroy'/>" + "</iq>"; + "<query xmlns='urn:xmpp:muclight:0#destroy'/>" + "</iq>";
@Test @Test
public void checkDestroyMUCLightStanza() throws Exception{ public void checkDestroyMUCLightStanza() throws Exception {
MUCLightDestroyIQ mucLightDestroyIQ = new MUCLightDestroyIQ(JidCreate.from("coven@muclight.shakespeare.lit")); MUCLightDestroyIQ mucLightDestroyIQ = new MUCLightDestroyIQ(JidCreate.from("coven@muclight.shakespeare.lit"));
mucLightDestroyIQ.setStanzaId("destroy1"); mucLightDestroyIQ.setStanzaId("destroy1");
Assert.assertEquals(mucLightDestroyIQ.toXML().toString(), stanza); Assert.assertEquals(mucLightDestroyIQ.toXML().toString(), stanza);

View file

@ -31,7 +31,7 @@ public class EnablePushNotificationsIQTest {
String exampleEnableIQWithPublishOptions = "<iq id='x42' type='set'>" String exampleEnableIQWithPublishOptions = "<iq id='x42' type='set'>"
+ "<enable xmlns='urn:xmpp:push:0' jid='push-5.client.example' node='yxs32uqsflafdk3iuqo'>" + "<enable xmlns='urn:xmpp:push:0' jid='push-5.client.example' node='yxs32uqsflafdk3iuqo'>"
+ "<x xmlns='jabber:x:data' type='form'>" + "<x xmlns='jabber:x:data' type='submit'>"
+ "<field var='FORM_TYPE'><value>http://jabber.org/protocol/pubsub#publish-options</value></field>" + "<field var='FORM_TYPE'><value>http://jabber.org/protocol/pubsub#publish-options</value></field>"
+ "<field var='secret'><value>eruio234vzxc2kla-91</value></field>" + "</x>" + "</enable>" + "</iq>"; + "<field var='secret'><value>eruio234vzxc2kla-91</value></field>" + "</x>" + "</enable>" + "</iq>";

View file

@ -84,7 +84,7 @@ public class ServiceAdministrationManager extends Manager {
passwordVerifyField.addValue(password); passwordVerifyField.addValue(password);
command.next(answerForm); command.next(answerForm);
assert(command.isCompleted()); assert (command.isCompleted());
} }
public RemoteCommand deleteUser() { public RemoteCommand deleteUser() {
@ -112,6 +112,6 @@ public class ServiceAdministrationManager extends Manager {
accountJids.addValues(JidUtil.toStringList(jidsToDelete)); accountJids.addValues(JidUtil.toStringList(jidsToDelete));
command.next(answerForm); command.next(answerForm);
assert(command.isCompleted()); assert (command.isCompleted());
} }
} }

View file

@ -228,7 +228,7 @@ public class AMPExtension implements ExtensionElement {
String getName(); String getName();
String getValue(); String getValue();
static final String ATTRIBUTE_NAME="condition"; static final String ATTRIBUTE_NAME = "condition";
} }
/** /**
@ -265,7 +265,7 @@ public class AMPExtension implements ExtensionElement {
*/ */
notify; notify;
public static final String ATTRIBUTE_NAME="action"; public static final String ATTRIBUTE_NAME = "action";
} }
/** /**

View file

@ -82,7 +82,7 @@ public class BoBData {
private void setContentBinaryIfRequired() { private void setContentBinaryIfRequired() {
if (contentBinary == null) { if (contentBinary == null) {
assert(StringUtils.isNotEmpty(contentString)); assert (StringUtils.isNotEmpty(contentString));
contentBinary = Base64.decode(contentString); contentBinary = Base64.decode(contentString);
} }
} }

View file

@ -118,9 +118,9 @@ public final class BookmarkManager {
BookmarkedConference bookmark BookmarkedConference bookmark
= new BookmarkedConference(name, jid, isAutoJoin, nickname, password); = new BookmarkedConference(name, jid, isAutoJoin, nickname, password);
List<BookmarkedConference> conferences = bookmarks.getBookmarkedConferences(); List<BookmarkedConference> conferences = bookmarks.getBookmarkedConferences();
if(conferences.contains(bookmark)) { if (conferences.contains(bookmark)) {
BookmarkedConference oldConference = conferences.get(conferences.indexOf(bookmark)); BookmarkedConference oldConference = conferences.get(conferences.indexOf(bookmark));
if(oldConference.isShared()) { if (oldConference.isShared()) {
throw new IllegalArgumentException("Cannot modify shared bookmark"); throw new IllegalArgumentException("Cannot modify shared bookmark");
} }
oldConference.setAutoJoin(isAutoJoin); oldConference.setAutoJoin(isAutoJoin);
@ -149,10 +149,10 @@ public final class BookmarkManager {
public void removeBookmarkedConference(EntityBareJid jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public void removeBookmarkedConference(EntityBareJid jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
retrieveBookmarks(); retrieveBookmarks();
Iterator<BookmarkedConference> it = bookmarks.getBookmarkedConferences().iterator(); Iterator<BookmarkedConference> it = bookmarks.getBookmarkedConferences().iterator();
while(it.hasNext()) { while (it.hasNext()) {
BookmarkedConference conference = it.next(); BookmarkedConference conference = it.next();
if(conference.getJid().equals(jid)) { if (conference.getJid().equals(jid)) {
if(conference.isShared()) { if (conference.isShared()) {
throw new IllegalArgumentException("Conference is shared and can't be removed"); throw new IllegalArgumentException("Conference is shared and can't be removed");
} }
it.remove(); it.remove();
@ -192,9 +192,9 @@ public final class BookmarkManager {
retrieveBookmarks(); retrieveBookmarks();
BookmarkedURL bookmark = new BookmarkedURL(URL, name, isRSS); BookmarkedURL bookmark = new BookmarkedURL(URL, name, isRSS);
List<BookmarkedURL> urls = bookmarks.getBookmarkedURLS(); List<BookmarkedURL> urls = bookmarks.getBookmarkedURLS();
if(urls.contains(bookmark)) { if (urls.contains(bookmark)) {
BookmarkedURL oldURL = urls.get(urls.indexOf(bookmark)); BookmarkedURL oldURL = urls.get(urls.indexOf(bookmark));
if(oldURL.isShared()) { if (oldURL.isShared()) {
throw new IllegalArgumentException("Cannot modify shared bookmarks"); throw new IllegalArgumentException("Cannot modify shared bookmarks");
} }
oldURL.setName(name); oldURL.setName(name);
@ -219,10 +219,10 @@ public final class BookmarkManager {
public void removeBookmarkedURL(String bookmarkURL) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { public void removeBookmarkedURL(String bookmarkURL) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
retrieveBookmarks(); retrieveBookmarks();
Iterator<BookmarkedURL> it = bookmarks.getBookmarkedURLS().iterator(); Iterator<BookmarkedURL> it = bookmarks.getBookmarkedURLS().iterator();
while(it.hasNext()) { while (it.hasNext()) {
BookmarkedURL bookmark = it.next(); BookmarkedURL bookmark = it.next();
if(bookmark.getURL().equalsIgnoreCase(bookmarkURL)) { if (bookmark.getURL().equalsIgnoreCase(bookmarkURL)) {
if(bookmark.isShared()) { if (bookmark.isShared()) {
throw new IllegalArgumentException("Cannot delete a shared bookmark."); throw new IllegalArgumentException("Cannot delete a shared bookmark.");
} }
it.remove(); it.remove();
@ -249,8 +249,8 @@ public final class BookmarkManager {
} }
private Bookmarks retrieveBookmarks() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException { private Bookmarks retrieveBookmarks() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
synchronized(bookmarkLock) { synchronized (bookmarkLock) {
if(bookmarks == null) { if (bookmarks == null) {
bookmarks = (Bookmarks) privateDataManager.getPrivateData("storage", bookmarks = (Bookmarks) privateDataManager.getPrivateData("storage",
"storage:bookmarks"); "storage:bookmarks");
} }

View file

@ -115,10 +115,10 @@ public class BookmarkedConference implements SharedBookmark {
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if(obj == null || !(obj instanceof BookmarkedConference)) { if (obj == null || !(obj instanceof BookmarkedConference)) {
return false; return false;
} }
BookmarkedConference conference = (BookmarkedConference)obj; BookmarkedConference conference = (BookmarkedConference) obj;
return conference.getJid().equals(jid); return conference.getJid().equals(jid);
} }

View file

@ -86,10 +86,10 @@ public class BookmarkedURL implements SharedBookmark {
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if(!(obj instanceof BookmarkedURL)) { if (!(obj instanceof BookmarkedURL)) {
return false; return false;
} }
BookmarkedURL url = (BookmarkedURL)obj; BookmarkedURL url = (BookmarkedURL) obj;
return url.getURL().equalsIgnoreCase(URL); return url.getURL().equalsIgnoreCase(URL);
} }

View file

@ -177,7 +177,7 @@ public class Bookmarks implements PrivateData {
buf.halfOpenElement(ELEMENT).xmlnsAttribute(NAMESPACE).rightAngleBracket(); buf.halfOpenElement(ELEMENT).xmlnsAttribute(NAMESPACE).rightAngleBracket();
for (BookmarkedURL urlStorage : getBookmarkedURLS()) { for (BookmarkedURL urlStorage : getBookmarkedURLS()) {
if(urlStorage.isShared()) { if (urlStorage.isShared()) {
continue; continue;
} }
buf.halfOpenElement("url").attribute("name", urlStorage.getName()).attribute("url", urlStorage.getURL()); buf.halfOpenElement("url").attribute("name", urlStorage.getName()).attribute("url", urlStorage.getURL());
@ -187,7 +187,7 @@ public class Bookmarks implements PrivateData {
// Add Conference additions // Add Conference additions
for (BookmarkedConference conference : getBookmarkedConferences()) { for (BookmarkedConference conference : getBookmarkedConferences()) {
if(conference.isShared()) { if (conference.isShared()) {
continue; continue;
} }
buf.halfOpenElement("conference"); buf.halfOpenElement("conference");
@ -260,7 +260,7 @@ public class Bookmarks implements PrivateData {
boolean done = false; boolean done = false;
while (!done) { while (!done) {
int eventType = parser.next(); int eventType = parser.next();
if(eventType == XmlPullParser.START_TAG if (eventType == XmlPullParser.START_TAG
&& "shared_bookmark".equals(parser.getName())) { && "shared_bookmark".equals(parser.getName())) {
urlStore.setShared(true); urlStore.setShared(true);
} }
@ -291,7 +291,7 @@ public class Bookmarks implements PrivateData {
else if (eventType == XmlPullParser.START_TAG && "password".equals(parser.getName())) { else if (eventType == XmlPullParser.START_TAG && "password".equals(parser.getName())) {
conf.setPassword(parser.nextText()); conf.setPassword(parser.nextText());
} }
else if(eventType == XmlPullParser.START_TAG else if (eventType == XmlPullParser.START_TAG
&& "shared_bookmark".equals(parser.getName())) { && "shared_bookmark".equals(parser.getName())) {
conf.setShared(true); conf.setShared(true);
} }

View file

@ -64,7 +64,7 @@ class DataListener extends AbstractIqRequestHandler {
ibbSession.processIQPacket(data); ibbSession.processIQPacket(data);
} }
} }
catch (NotConnectedException|InterruptedException e) { catch (NotConnectedException | InterruptedException e) {
return null; return null;
} }
return null; return null;

View file

@ -415,7 +415,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream
*/ */
@Override @Override
public Socks5BytestreamSession establishSession(Jid targetJID, String sessionID) public Socks5BytestreamSession establishSession(Jid targetJID, String sessionID)
throws IOException, InterruptedException, NoResponseException, SmackException, XMPPException{ throws IOException, InterruptedException, NoResponseException, SmackException, XMPPException {
XMPPConnection connection = connection(); XMPPConnection connection = connection();
XMPPErrorException discoveryException = null; XMPPErrorException discoveryException = null;
// check if target supports SOCKS5 Bytestream // check if target supports SOCKS5 Bytestream
@ -556,7 +556,7 @@ public final class Socks5BytestreamManager extends Manager implements Bytestream
try { try {
proxyInfo = serviceDiscoveryManager.discoverInfo(item.getEntityID()); proxyInfo = serviceDiscoveryManager.discoverInfo(item.getEntityID());
} }
catch (NoResponseException|XMPPErrorException e) { catch (NoResponseException | XMPPErrorException e) {
// blacklist errornous server // blacklist errornous server
proxyBlacklist.add(item.getEntityID()); proxyBlacklist.add(item.getEntityID());
continue; continue;

View file

@ -280,7 +280,7 @@ public final class Socks5Proxy {
* @return true if the address was removed. * @return true if the address was removed.
*/ */
public boolean removeLocalAddress(String address) { public boolean removeLocalAddress(String address) {
synchronized(localAddresses) { synchronized (localAddresses) {
return localAddresses.remove(address); return localAddresses.remove(address);
} }
} }
@ -311,7 +311,7 @@ public final class Socks5Proxy {
if (addresses == null) { if (addresses == null) {
throw new IllegalArgumentException("list must not be null"); throw new IllegalArgumentException("list must not be null");
} }
synchronized(localAddresses) { synchronized (localAddresses) {
localAddresses.clear(); localAddresses.clear();
localAddresses.addAll(addresses); localAddresses.addAll(addresses);
} }

View file

@ -224,7 +224,7 @@ public class Bytestream extends IQ {
@Override @Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) { protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
switch(getType()) { switch (getType()) {
case set: case set:
xml.optAttribute("sid", getSessionID()); xml.optAttribute("sid", getSessionID());
xml.optAttribute("mode", getMode()); xml.optAttribute("mode", getMode());

View file

@ -717,7 +717,7 @@ public final class EntityCapsManager extends Manager {
throw new AssertionError(e); throw new AssertionError(e);
} }
byte[] digest; byte[] digest;
synchronized(md) { synchronized (md) {
digest = md.digest(bytes); digest = md.digest(bytes);
} }
String version = Base64.encodeToString(digest); String version = Base64.encodeToString(digest);

View file

@ -105,10 +105,10 @@ public final class ChatStateManager extends Manager {
* @throws InterruptedException * @throws InterruptedException
*/ */
public void setCurrentState(ChatState newState, org.jivesoftware.smack.chat.Chat chat) throws NotConnectedException, InterruptedException { public void setCurrentState(ChatState newState, org.jivesoftware.smack.chat.Chat chat) throws NotConnectedException, InterruptedException {
if(chat == null || newState == null) { if (chat == null || newState == null) {
throw new IllegalArgumentException("Arguments cannot be null."); throw new IllegalArgumentException("Arguments cannot be null.");
} }
if(!updateChatState(chat, newState)) { if (!updateChatState(chat, newState)) {
return; return;
} }
Message message = new Message(); Message message = new Message();

View file

@ -140,7 +140,7 @@ public final class ServiceDiscoveryManager extends Manager {
response.addItems(nodeInformationProvider.getNodeItems()); response.addItems(nodeInformationProvider.getNodeItems());
// Add packet extensions // Add packet extensions
response.addExtensions(nodeInformationProvider.getNodePacketExtensions()); response.addExtensions(nodeInformationProvider.getNodePacketExtensions());
} else if(discoverItems.getNode() != null) { } else if (discoverItems.getNode() != null) {
// Return <item-not-found/> error since client doesn't contain // Return <item-not-found/> error since client doesn't contain
// the specified node // the specified node
response.setType(IQ.Type.error); response.setType(IQ.Type.error);
@ -761,7 +761,7 @@ public final class ServiceDiscoveryManager extends Manager {
try { try {
// Get the disco items and send the disco packet to each server item // Get the disco items and send the disco packet to each server item
items = discoverItems(serviceName); items = discoverItems(serviceName);
} catch(XMPPErrorException e) { } catch (XMPPErrorException e) {
LOGGER.log(Level.WARNING, "Could not discover items about service", e); LOGGER.log(Level.WARNING, "Could not discover items about service", e);
return serviceDiscoInfo; return serviceDiscoInfo;
} }

View file

@ -74,7 +74,7 @@ public class DiscoverInfoProvider extends IQProvider<DiscoverInfo> {
if (parser.getName().equals("feature")) { if (parser.getName().equals("feature")) {
// Create a new feature and add it to the discovered info. // Create a new feature and add it to the discovered info.
boolean notADuplicateFeature = discoverInfo.addFeature(variable); boolean notADuplicateFeature = discoverInfo.addFeature(variable);
assert(notADuplicateFeature); assert (notADuplicateFeature);
} }
if (parser.getName().equals("query")) { if (parser.getName().equals("query")) {
done = true; done = true;

View file

@ -73,7 +73,7 @@ public class FaultTolerantNegotiator extends StreamNegotiator {
private StreamNegotiator determineNegotiator(Stanza streamInitiation) { private StreamNegotiator determineNegotiator(Stanza streamInitiation) {
if (streamInitiation instanceof Bytestream) { if (streamInitiation instanceof Bytestream) {
return primaryNegotiator; return primaryNegotiator;
} else if (streamInitiation instanceof Open){ } else if (streamInitiation instanceof Open) {
return secondaryNegotiator; return secondaryNegotiator;
} else { } else {
throw new IllegalStateException("Unknown stream initation type"); throw new IllegalStateException("Unknown stream initation type");

View file

@ -308,7 +308,7 @@ public abstract class FileTransfer {
* Return the length of bytes written out to the stream. * Return the length of bytes written out to the stream.
* @return the amount in bytes written out. * @return the amount in bytes written out.
*/ */
public long getAmountWritten(){ public long getAmountWritten() {
return amountWritten; return amountWritten;
} }

View file

@ -162,7 +162,7 @@ public class OutgoingFileTransfer extends FileTransfer {
final long fileSize, final String description, final long fileSize, final String description,
final NegotiationProgress progress) final NegotiationProgress progress)
{ {
if(progress == null) { if (progress == null) {
throw new IllegalArgumentException("Callback progress cannot be null."); throw new IllegalArgumentException("Callback progress cannot be null.");
} }
checkTransferThread(); checkTransferThread();
@ -295,7 +295,7 @@ public class OutgoingFileTransfer extends FileTransfer {
* @param fileSize the size of the file that is transferred * @param fileSize the size of the file that is transferred
* @param description a description for the file to transfer. * @param description a description for the file to transfer.
*/ */
public synchronized void sendStream(final InputStream in, final String fileName, final long fileSize, final String description){ public synchronized void sendStream(final InputStream in, final String fileName, final long fileSize, final String description) {
checkTransferThread(); checkTransferThread();
setFileInfo(fileName, fileSize); setFileInfo(fileName, fileSize);
@ -409,7 +409,7 @@ public class OutgoingFileTransfer extends FileTransfer {
@Override @Override
protected boolean updateStatus(Status oldStatus, Status newStatus) { protected boolean updateStatus(Status oldStatus, Status newStatus) {
boolean isUpdated = super.updateStatus(oldStatus, newStatus); boolean isUpdated = super.updateStatus(oldStatus, newStatus);
if(callback != null && isUpdated) { if (callback != null && isUpdated) {
callback.statusUpdated(oldStatus, newStatus); callback.statusUpdated(oldStatus, newStatus);
} }
return isUpdated; return isUpdated;
@ -419,7 +419,7 @@ public class OutgoingFileTransfer extends FileTransfer {
protected void setStatus(Status status) { protected void setStatus(Status status) {
Status oldStatus = getStatus(); Status oldStatus = getStatus();
super.setStatus(status); super.setStatus(status);
if(callback != null) { if (callback != null) {
callback.statusUpdated(oldStatus, status); callback.statusUpdated(oldStatus, status);
} }
} }
@ -427,7 +427,7 @@ public class OutgoingFileTransfer extends FileTransfer {
@Override @Override
protected void setException(Exception exception) { protected void setException(Exception exception) {
super.setException(exception); super.setException(exception);
if(callback != null) { if (callback != null) {
callback.errorEstablishingStream(exception); callback.errorEstablishingStream(exception);
} }
} }

Some files were not shown because too many files have changed in this diff Show more