mirror of
https://github.com/vanitasvitae/Smack.git
synced 2025-09-09 17:19:39 +02:00
Enfore spaces for indentation
Although I'm in the tabs camp, Smack uses mostly spaces. Therefore it is the logical choice for the indentation style.
This commit is contained in:
parent
ffe9397e66
commit
ef0af66b21
125 changed files with 5336 additions and 5344 deletions
|
@ -18,6 +18,6 @@ package org.jivesoftware.smackx.blocking;
|
|||
|
||||
public interface AllJidsUnblockedListener {
|
||||
|
||||
void onAllJidsUnblocked();
|
||||
void onAllJidsUnblocked();
|
||||
|
||||
}
|
||||
|
|
|
@ -22,6 +22,6 @@ import org.jxmpp.jid.Jid;
|
|||
|
||||
public interface JidsBlockedListener {
|
||||
|
||||
void onJidsBlocked(List<Jid> blockedJids);
|
||||
void onJidsBlocked(List<Jid> blockedJids);
|
||||
|
||||
}
|
||||
|
|
|
@ -31,27 +31,27 @@ import org.jxmpp.jid.Jid;
|
|||
*/
|
||||
public abstract class FileTransfer {
|
||||
|
||||
private String fileName;
|
||||
private String fileName;
|
||||
|
||||
private String filePath;
|
||||
private String filePath;
|
||||
|
||||
private long fileSize;
|
||||
private long fileSize;
|
||||
|
||||
private Jid peer;
|
||||
private Jid peer;
|
||||
|
||||
private Status status = Status.initial;
|
||||
private Status status = Status.initial;
|
||||
|
||||
private final Object statusMonitor = new Object();
|
||||
|
||||
protected FileTransferNegotiator negotiator;
|
||||
protected FileTransferNegotiator negotiator;
|
||||
|
||||
protected String streamID;
|
||||
protected String streamID;
|
||||
|
||||
protected long amountWritten = -1;
|
||||
protected long amountWritten = -1;
|
||||
|
||||
private Error error;
|
||||
private Error error;
|
||||
|
||||
private Exception exception;
|
||||
private Exception exception;
|
||||
|
||||
/**
|
||||
* Buffer size between input and output
|
||||
|
@ -59,137 +59,137 @@ public abstract class FileTransfer {
|
|||
private static final int BUFFER_SIZE = 8192;
|
||||
|
||||
protected FileTransfer(Jid peer, String streamID,
|
||||
FileTransferNegotiator negotiator) {
|
||||
this.peer = peer;
|
||||
this.streamID = streamID;
|
||||
this.negotiator = negotiator;
|
||||
}
|
||||
FileTransferNegotiator negotiator) {
|
||||
this.peer = peer;
|
||||
this.streamID = streamID;
|
||||
this.negotiator = negotiator;
|
||||
}
|
||||
|
||||
protected void setFileInfo(String fileName, long fileSize) {
|
||||
this.fileName = fileName;
|
||||
this.fileSize = fileSize;
|
||||
}
|
||||
protected void setFileInfo(String fileName, long fileSize) {
|
||||
this.fileName = fileName;
|
||||
this.fileSize = fileSize;
|
||||
}
|
||||
|
||||
protected void setFileInfo(String path, String fileName, long fileSize) {
|
||||
this.filePath = path;
|
||||
this.fileName = fileName;
|
||||
this.fileSize = fileSize;
|
||||
}
|
||||
protected void setFileInfo(String path, String fileName, long fileSize) {
|
||||
this.filePath = path;
|
||||
this.fileName = fileName;
|
||||
this.fileSize = fileSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of the file being transfered.
|
||||
*
|
||||
* @return Returns the size of the file being transfered.
|
||||
*/
|
||||
public long getFileSize() {
|
||||
return fileSize;
|
||||
}
|
||||
/**
|
||||
* Returns the size of the file being transfered.
|
||||
*
|
||||
* @return Returns the size of the file being transfered.
|
||||
*/
|
||||
public long getFileSize() {
|
||||
return fileSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the file being transfered.
|
||||
*
|
||||
* @return Returns the name of the file being transfered.
|
||||
*/
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
/**
|
||||
* Returns the name of the file being transfered.
|
||||
*
|
||||
* @return Returns the name of the file being transfered.
|
||||
*/
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the local path of the file.
|
||||
*
|
||||
* @return Returns the local path of the file.
|
||||
*/
|
||||
public String getFilePath() {
|
||||
return filePath;
|
||||
}
|
||||
/**
|
||||
* Returns the local path of the file.
|
||||
*
|
||||
* @return Returns the local path of the file.
|
||||
*/
|
||||
public String getFilePath() {
|
||||
return filePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the JID of the peer for this file transfer.
|
||||
*
|
||||
* @return Returns the JID of the peer for this file transfer.
|
||||
*/
|
||||
public Jid getPeer() {
|
||||
return peer;
|
||||
}
|
||||
/**
|
||||
* Returns the JID of the peer for this file transfer.
|
||||
*
|
||||
* @return Returns the JID of the peer for this file transfer.
|
||||
*/
|
||||
public Jid getPeer() {
|
||||
return peer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the progress of the file transfer as a number between 0 and 1.
|
||||
*
|
||||
* @return Returns the progress of the file transfer as a number between 0
|
||||
* and 1.
|
||||
*/
|
||||
public double getProgress() {
|
||||
/**
|
||||
* Returns the progress of the file transfer as a number between 0 and 1.
|
||||
*
|
||||
* @return Returns the progress of the file transfer as a number between 0
|
||||
* and 1.
|
||||
*/
|
||||
public double getProgress() {
|
||||
if (amountWritten <= 0 || fileSize <= 0) {
|
||||
return 0;
|
||||
}
|
||||
return (double) amountWritten / (double) fileSize;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the transfer has been cancelled, if it has stopped because
|
||||
* of a an error, or the transfer completed successfully.
|
||||
*
|
||||
* @return Returns true if the transfer has been cancelled, if it has stopped
|
||||
* because of a an error, or the transfer completed successfully.
|
||||
*/
|
||||
public boolean isDone() {
|
||||
return status == Status.cancelled || status == Status.error
|
||||
|| status == Status.complete || status == Status.refused;
|
||||
}
|
||||
/**
|
||||
* Returns true if the transfer has been cancelled, if it has stopped because
|
||||
* of a an error, or the transfer completed successfully.
|
||||
*
|
||||
* @return Returns true if the transfer has been cancelled, if it has stopped
|
||||
* because of a an error, or the transfer completed successfully.
|
||||
*/
|
||||
public boolean isDone() {
|
||||
return status == Status.cancelled || status == Status.error
|
||||
|| status == Status.complete || status == Status.refused;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current status of the file transfer.
|
||||
*
|
||||
* @return Returns the current status of the file transfer.
|
||||
*/
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
/**
|
||||
* Returns the current status of the file transfer.
|
||||
*
|
||||
* @return Returns the current status of the file transfer.
|
||||
*/
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
protected void setError(Error type) {
|
||||
this.error = type;
|
||||
}
|
||||
protected void setError(Error type) {
|
||||
this.error = type;
|
||||
}
|
||||
|
||||
/**
|
||||
* When {@link #getStatus()} returns that there was an {@link Status#error}
|
||||
* during the transfer, the type of error can be retrieved through this
|
||||
* method.
|
||||
*
|
||||
* @return Returns the type of error that occurred if one has occurred.
|
||||
*/
|
||||
public Error getError() {
|
||||
return error;
|
||||
}
|
||||
/**
|
||||
* When {@link #getStatus()} returns that there was an {@link Status#error}
|
||||
* during the transfer, the type of error can be retrieved through this
|
||||
* method.
|
||||
*
|
||||
* @return Returns the type of error that occurred if one has occurred.
|
||||
*/
|
||||
public Error getError() {
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* If an exception occurs asynchronously it will be stored for later
|
||||
* retrieval. If there is an error there maybe an exception set.
|
||||
*
|
||||
* @return The exception that occurred or null if there was no exception.
|
||||
* @see #getError()
|
||||
*/
|
||||
public Exception getException() {
|
||||
return exception;
|
||||
}
|
||||
/**
|
||||
* If an exception occurs asynchronously it will be stored for later
|
||||
* retrieval. If there is an error there maybe an exception set.
|
||||
*
|
||||
* @return The exception that occurred or null if there was no exception.
|
||||
* @see #getError()
|
||||
*/
|
||||
public Exception getException() {
|
||||
return exception;
|
||||
}
|
||||
|
||||
public String getStreamID() {
|
||||
return streamID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels the file transfer.
|
||||
*/
|
||||
public abstract void cancel();
|
||||
/**
|
||||
* Cancels the file transfer.
|
||||
*/
|
||||
public abstract void cancel();
|
||||
|
||||
protected void setException(Exception exception) {
|
||||
this.exception = exception;
|
||||
}
|
||||
protected void setException(Exception exception) {
|
||||
this.exception = exception;
|
||||
}
|
||||
|
||||
protected void setStatus(Status status) {
|
||||
protected void setStatus(Status status) {
|
||||
synchronized (statusMonitor) {
|
||||
// CHECKSTYLE:OFF
|
||||
this.status = status;
|
||||
}
|
||||
this.status = status;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
||||
|
@ -206,91 +206,91 @@ public abstract class FileTransfer {
|
|||
protected void writeToStream(final InputStream in, final OutputStream out)
|
||||
throws IOException
|
||||
{
|
||||
final byte[] b = new byte[BUFFER_SIZE];
|
||||
int count = 0;
|
||||
amountWritten = 0;
|
||||
final byte[] b = new byte[BUFFER_SIZE];
|
||||
int count = 0;
|
||||
amountWritten = 0;
|
||||
|
||||
while ((count = in.read(b)) > 0 && !getStatus().equals(Status.cancelled)) {
|
||||
out.write(b, 0, count);
|
||||
amountWritten += count;
|
||||
}
|
||||
|
||||
// the connection was likely terminated abruptly if these are not equal
|
||||
if (!getStatus().equals(Status.cancelled) && getError() == Error.none
|
||||
&& amountWritten != fileSize) {
|
||||
// the connection was likely terminated abruptly if these are not equal
|
||||
if (!getStatus().equals(Status.cancelled) && getError() == Error.none
|
||||
&& amountWritten != fileSize) {
|
||||
setStatus(Status.error);
|
||||
this.error = Error.connection;
|
||||
}
|
||||
}
|
||||
this.error = Error.connection;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A class to represent the current status of the file transfer.
|
||||
*
|
||||
* @author Alexander Wenckus
|
||||
*
|
||||
*/
|
||||
public enum Status {
|
||||
/**
|
||||
* A class to represent the current status of the file transfer.
|
||||
*
|
||||
* @author Alexander Wenckus
|
||||
*
|
||||
*/
|
||||
public enum Status {
|
||||
|
||||
/**
|
||||
* An error occurred during the transfer.
|
||||
*
|
||||
* @see FileTransfer#getError()
|
||||
*/
|
||||
error("Error"),
|
||||
/**
|
||||
* An error occurred during the transfer.
|
||||
*
|
||||
* @see FileTransfer#getError()
|
||||
*/
|
||||
error("Error"),
|
||||
|
||||
/**
|
||||
/**
|
||||
* The initial status of the file transfer.
|
||||
*/
|
||||
initial("Initial"),
|
||||
|
||||
/**
|
||||
* The file transfer is being negotiated with the peer. The party
|
||||
* Receiving the file has the option to accept or refuse a file transfer
|
||||
* request. If they accept, then the process of stream negotiation will
|
||||
* begin. If they refuse the file will not be transfered.
|
||||
*
|
||||
* @see #negotiating_stream
|
||||
*/
|
||||
negotiating_transfer("Negotiating Transfer"),
|
||||
* The file transfer is being negotiated with the peer. The party
|
||||
* Receiving the file has the option to accept or refuse a file transfer
|
||||
* request. If they accept, then the process of stream negotiation will
|
||||
* begin. If they refuse the file will not be transfered.
|
||||
*
|
||||
* @see #negotiating_stream
|
||||
*/
|
||||
negotiating_transfer("Negotiating Transfer"),
|
||||
|
||||
/**
|
||||
* The peer has refused the file transfer request halting the file
|
||||
* transfer negotiation process.
|
||||
*/
|
||||
refused("Refused"),
|
||||
/**
|
||||
* The peer has refused the file transfer request halting the file
|
||||
* transfer negotiation process.
|
||||
*/
|
||||
refused("Refused"),
|
||||
|
||||
/**
|
||||
* The stream to transfer the file is being negotiated over the chosen
|
||||
* stream type. After the stream negotiating process is complete the
|
||||
* status becomes negotiated.
|
||||
*
|
||||
* @see #negotiated
|
||||
*/
|
||||
negotiating_stream("Negotiating Stream"),
|
||||
/**
|
||||
* The stream to transfer the file is being negotiated over the chosen
|
||||
* stream type. After the stream negotiating process is complete the
|
||||
* status becomes negotiated.
|
||||
*
|
||||
* @see #negotiated
|
||||
*/
|
||||
negotiating_stream("Negotiating Stream"),
|
||||
|
||||
/**
|
||||
* After the stream negotiation has completed the intermediate state
|
||||
* between the time when the negotiation is finished and the actual
|
||||
* transfer begins.
|
||||
*/
|
||||
negotiated("Negotiated"),
|
||||
/**
|
||||
* After the stream negotiation has completed the intermediate state
|
||||
* between the time when the negotiation is finished and the actual
|
||||
* transfer begins.
|
||||
*/
|
||||
negotiated("Negotiated"),
|
||||
|
||||
/**
|
||||
* The transfer is in progress.
|
||||
*
|
||||
* @see FileTransfer#getProgress()
|
||||
*/
|
||||
in_progress("In Progress"),
|
||||
/**
|
||||
* The transfer is in progress.
|
||||
*
|
||||
* @see FileTransfer#getProgress()
|
||||
*/
|
||||
in_progress("In Progress"),
|
||||
|
||||
/**
|
||||
* The transfer has completed successfully.
|
||||
*/
|
||||
complete("Complete"),
|
||||
/**
|
||||
* The transfer has completed successfully.
|
||||
*/
|
||||
complete("Complete"),
|
||||
|
||||
/**
|
||||
* The file transfer was cancelled.
|
||||
*/
|
||||
cancelled("Cancelled");
|
||||
/**
|
||||
* The file transfer was cancelled.
|
||||
*/
|
||||
cancelled("Cancelled");
|
||||
|
||||
private String status;
|
||||
|
||||
|
@ -312,55 +312,55 @@ public abstract class FileTransfer {
|
|||
}
|
||||
|
||||
public enum Error {
|
||||
/**
|
||||
* No error.
|
||||
*/
|
||||
none("No error"),
|
||||
/**
|
||||
* No error.
|
||||
*/
|
||||
none("No error"),
|
||||
|
||||
/**
|
||||
* The peer did not find any of the provided stream mechanisms
|
||||
* acceptable.
|
||||
*/
|
||||
not_acceptable("The peer did not find any of the provided stream mechanisms acceptable."),
|
||||
/**
|
||||
* The peer did not find any of the provided stream mechanisms
|
||||
* acceptable.
|
||||
*/
|
||||
not_acceptable("The peer did not find any of the provided stream mechanisms acceptable."),
|
||||
|
||||
/**
|
||||
* The provided file to transfer does not exist or could not be read.
|
||||
*/
|
||||
bad_file("The provided file to transfer does not exist or could not be read."),
|
||||
/**
|
||||
* The provided file to transfer does not exist or could not be read.
|
||||
*/
|
||||
bad_file("The provided file to transfer does not exist or could not be read."),
|
||||
|
||||
/**
|
||||
* The remote user did not respond or the connection timed out.
|
||||
*/
|
||||
no_response("The remote user did not respond or the connection timed out."),
|
||||
/**
|
||||
* The remote user did not respond or the connection timed out.
|
||||
*/
|
||||
no_response("The remote user did not respond or the connection timed out."),
|
||||
|
||||
/**
|
||||
* An error occurred over the socket connected to send the file.
|
||||
*/
|
||||
connection("An error occured over the socket connected to send the file."),
|
||||
/**
|
||||
* An error occurred over the socket connected to send the file.
|
||||
*/
|
||||
connection("An error occured over the socket connected to send the file."),
|
||||
|
||||
/**
|
||||
* An error occurred while sending or receiving the file.
|
||||
*/
|
||||
stream("An error occured while sending or recieving the file.");
|
||||
/**
|
||||
* An error occurred while sending or receiving the file.
|
||||
*/
|
||||
stream("An error occured while sending or recieving the file.");
|
||||
|
||||
private final String msg;
|
||||
private final String msg;
|
||||
|
||||
private Error(String msg) {
|
||||
this.msg = msg;
|
||||
}
|
||||
private Error(String msg) {
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of this error.
|
||||
*
|
||||
* @return Returns a String representation of this error.
|
||||
*/
|
||||
public String getMessage() {
|
||||
return msg;
|
||||
}
|
||||
/**
|
||||
* Returns a String representation of this error.
|
||||
*
|
||||
* @return Returns a String representation of this error.
|
||||
*/
|
||||
public String getMessage() {
|
||||
return msg;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
public String toString() {
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,11 +23,11 @@ package org.jivesoftware.smackx.filetransfer;
|
|||
* @author Alexander Wenckus
|
||||
*/
|
||||
public interface FileTransferListener {
|
||||
/**
|
||||
* A request to send a file has been recieved from another user.
|
||||
*
|
||||
* @param request
|
||||
* The request from the other user.
|
||||
*/
|
||||
public void fileTransferRequest(final FileTransferRequest request);
|
||||
/**
|
||||
* A request to send a file has been recieved from another user.
|
||||
*
|
||||
* @param request
|
||||
* The request from the other user.
|
||||
*/
|
||||
public void fileTransferRequest(final FileTransferRequest request);
|
||||
}
|
||||
|
|
|
@ -56,20 +56,20 @@ public final class FileTransferManager extends Manager {
|
|||
return fileTransferManager;
|
||||
}
|
||||
|
||||
private final FileTransferNegotiator fileTransferNegotiator;
|
||||
private final FileTransferNegotiator fileTransferNegotiator;
|
||||
|
||||
private final List<FileTransferListener> listeners = new CopyOnWriteArrayList<FileTransferListener>();
|
||||
private final List<FileTransferListener> listeners = new CopyOnWriteArrayList<FileTransferListener>();
|
||||
|
||||
/**
|
||||
* Creates a file transfer manager to initiate and receive file transfers.
|
||||
*
|
||||
* @param connection
|
||||
* The XMPPConnection that the file transfers will use.
|
||||
*/
|
||||
private FileTransferManager(XMPPConnection connection) {
|
||||
super(connection);
|
||||
this.fileTransferNegotiator = FileTransferNegotiator
|
||||
.getInstanceFor(connection);
|
||||
/**
|
||||
* Creates a file transfer manager to initiate and receive file transfers.
|
||||
*
|
||||
* @param connection
|
||||
* The XMPPConnection that the file transfers will use.
|
||||
*/
|
||||
private FileTransferManager(XMPPConnection connection) {
|
||||
super(connection);
|
||||
this.fileTransferNegotiator = FileTransferNegotiator
|
||||
.getInstanceFor(connection);
|
||||
connection.registerIQRequestHandler(new AbstractIqRequestHandler(StreamInitiation.ELEMENT,
|
||||
StreamInitiation.NAMESPACE, IQ.Type.set, Mode.async) {
|
||||
@Override
|
||||
|
@ -82,42 +82,42 @@ public final class FileTransferManager extends Manager {
|
|||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a file transfer listener to listen to incoming file transfer
|
||||
* requests.
|
||||
*
|
||||
* @param li
|
||||
* The listener
|
||||
* @see #removeFileTransferListener(FileTransferListener)
|
||||
* @see FileTransferListener
|
||||
*/
|
||||
public void addFileTransferListener(final FileTransferListener li) {
|
||||
listeners.add(li);
|
||||
}
|
||||
/**
|
||||
* Add a file transfer listener to listen to incoming file transfer
|
||||
* requests.
|
||||
*
|
||||
* @param li
|
||||
* The listener
|
||||
* @see #removeFileTransferListener(FileTransferListener)
|
||||
* @see FileTransferListener
|
||||
*/
|
||||
public void addFileTransferListener(final FileTransferListener li) {
|
||||
listeners.add(li);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a file transfer listener.
|
||||
*
|
||||
* @param li
|
||||
* The file transfer listener to be removed
|
||||
* @see FileTransferListener
|
||||
*/
|
||||
public void removeFileTransferListener(final FileTransferListener li) {
|
||||
listeners.remove(li);
|
||||
}
|
||||
/**
|
||||
* Removes a file transfer listener.
|
||||
*
|
||||
* @param li
|
||||
* The file transfer listener to be removed
|
||||
* @see FileTransferListener
|
||||
*/
|
||||
public void removeFileTransferListener(final FileTransferListener li) {
|
||||
listeners.remove(li);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an OutgoingFileTransfer to send a file to another user.
|
||||
*
|
||||
* @param userID
|
||||
* The fully qualified jabber ID (i.e. full JID) with resource of the user to
|
||||
* send the file to.
|
||||
* @return The send file object on which the negotiated transfer can be run.
|
||||
* @exception IllegalArgumentException if userID is null or not a full JID
|
||||
*/
|
||||
public OutgoingFileTransfer createOutgoingFileTransfer(EntityFullJid userID) {
|
||||
/**
|
||||
* Creates an OutgoingFileTransfer to send a file to another user.
|
||||
*
|
||||
* @param userID
|
||||
* The fully qualified jabber ID (i.e. full JID) with resource of the user to
|
||||
* send the file to.
|
||||
* @return The send file object on which the negotiated transfer can be run.
|
||||
* @exception IllegalArgumentException if userID is null or not a full JID
|
||||
*/
|
||||
public OutgoingFileTransfer createOutgoingFileTransfer(EntityFullJid userID) {
|
||||
// We need to create outgoing file transfers with a full JID since this method will later
|
||||
// use XEP-0095 to negotiate the stream. This is done with IQ stanzas that need to be addressed to a full JID
|
||||
// in order to reach an client entity.
|
||||
|
@ -125,45 +125,45 @@ public final class FileTransferManager extends Manager {
|
|||
throw new IllegalArgumentException("userID was null");
|
||||
}
|
||||
|
||||
return new OutgoingFileTransfer(connection().getUser(), userID,
|
||||
FileTransferNegotiator.getNextStreamID(),
|
||||
fileTransferNegotiator);
|
||||
}
|
||||
|
||||
/**
|
||||
* When the file transfer request is acceptable, this method should be
|
||||
* invoked. It will create an IncomingFileTransfer which allows the
|
||||
* transmission of the file to procede.
|
||||
*
|
||||
* @param request
|
||||
* The remote request that is being accepted.
|
||||
* @return The IncomingFileTransfer which manages the download of the file
|
||||
* from the transfer initiator.
|
||||
*/
|
||||
protected IncomingFileTransfer createIncomingFileTransfer(
|
||||
FileTransferRequest request) {
|
||||
if (request == null) {
|
||||
throw new NullPointerException("RecieveRequest cannot be null");
|
||||
}
|
||||
|
||||
IncomingFileTransfer transfer = new IncomingFileTransfer(request,
|
||||
return new OutgoingFileTransfer(connection().getUser(), userID,
|
||||
FileTransferNegotiator.getNextStreamID(),
|
||||
fileTransferNegotiator);
|
||||
transfer.setFileInfo(request.getFileName(), request.getFileSize());
|
||||
}
|
||||
|
||||
return transfer;
|
||||
}
|
||||
/**
|
||||
* When the file transfer request is acceptable, this method should be
|
||||
* invoked. It will create an IncomingFileTransfer which allows the
|
||||
* transmission of the file to procede.
|
||||
*
|
||||
* @param request
|
||||
* The remote request that is being accepted.
|
||||
* @return The IncomingFileTransfer which manages the download of the file
|
||||
* from the transfer initiator.
|
||||
*/
|
||||
protected IncomingFileTransfer createIncomingFileTransfer(
|
||||
FileTransferRequest request) {
|
||||
if (request == null) {
|
||||
throw new NullPointerException("RecieveRequest cannot be null");
|
||||
}
|
||||
|
||||
/**
|
||||
* Reject an incoming file transfer.
|
||||
* <p>
|
||||
* Specified in XEP-95 4.2 and 3.2 Example 8
|
||||
* </p>
|
||||
* @param request
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
protected void rejectIncomingFileTransfer(FileTransferRequest request) throws NotConnectedException, InterruptedException {
|
||||
StreamInitiation initiation = request.getStreamInitiation();
|
||||
IncomingFileTransfer transfer = new IncomingFileTransfer(request,
|
||||
fileTransferNegotiator);
|
||||
transfer.setFileInfo(request.getFileName(), request.getFileSize());
|
||||
|
||||
return transfer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reject an incoming file transfer.
|
||||
* <p>
|
||||
* Specified in XEP-95 4.2 and 3.2 Example 8
|
||||
* </p>
|
||||
* @param request
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
protected void rejectIncomingFileTransfer(FileTransferRequest request) throws NotConnectedException, InterruptedException {
|
||||
StreamInitiation initiation = request.getStreamInitiation();
|
||||
|
||||
// Reject as specified in XEP-95 4.2. Note that this is not to be confused with the Socks 5
|
||||
// Bytestream rejection as specified in XEP-65 5.3.1 Example 13, which says that
|
||||
|
@ -172,5 +172,5 @@ public final class FileTransferManager extends Manager {
|
|||
IQ rejection = IQ.createErrorResponse(initiation, XMPPError.getBuilder(
|
||||
XMPPError.Condition.forbidden));
|
||||
connection().sendStanza(rejection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,113 +27,113 @@ import org.jxmpp.jid.Jid;
|
|||
*
|
||||
*/
|
||||
public class FileTransferRequest {
|
||||
private final StreamInitiation streamInitiation;
|
||||
private final StreamInitiation streamInitiation;
|
||||
|
||||
private final FileTransferManager manager;
|
||||
private final FileTransferManager manager;
|
||||
|
||||
/**
|
||||
* A recieve request is constructed from the Stream Initiation request
|
||||
* received from the initator.
|
||||
*
|
||||
* @param manager
|
||||
* The manager handling this file transfer
|
||||
*
|
||||
* @param si
|
||||
* The Stream initiaton recieved from the initiator.
|
||||
*/
|
||||
public FileTransferRequest(FileTransferManager manager, StreamInitiation si) {
|
||||
this.streamInitiation = si;
|
||||
this.manager = manager;
|
||||
}
|
||||
/**
|
||||
* A recieve request is constructed from the Stream Initiation request
|
||||
* received from the initator.
|
||||
*
|
||||
* @param manager
|
||||
* The manager handling this file transfer
|
||||
*
|
||||
* @param si
|
||||
* The Stream initiaton recieved from the initiator.
|
||||
*/
|
||||
public FileTransferRequest(FileTransferManager manager, StreamInitiation si) {
|
||||
this.streamInitiation = si;
|
||||
this.manager = manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the file.
|
||||
*
|
||||
* @return Returns the name of the file.
|
||||
*/
|
||||
public String getFileName() {
|
||||
return streamInitiation.getFile().getName();
|
||||
}
|
||||
/**
|
||||
* Returns the name of the file.
|
||||
*
|
||||
* @return Returns the name of the file.
|
||||
*/
|
||||
public String getFileName() {
|
||||
return streamInitiation.getFile().getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size in bytes of the file.
|
||||
*
|
||||
* @return Returns the size in bytes of the file.
|
||||
*/
|
||||
public long getFileSize() {
|
||||
return streamInitiation.getFile().getSize();
|
||||
}
|
||||
/**
|
||||
* Returns the size in bytes of the file.
|
||||
*
|
||||
* @return Returns the size in bytes of the file.
|
||||
*/
|
||||
public long getFileSize() {
|
||||
return streamInitiation.getFile().getSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the description of the file provided by the requestor.
|
||||
*
|
||||
* @return Returns the description of the file provided by the requestor.
|
||||
*/
|
||||
public String getDescription() {
|
||||
return streamInitiation.getFile().getDesc();
|
||||
}
|
||||
/**
|
||||
* Returns the description of the file provided by the requestor.
|
||||
*
|
||||
* @return Returns the description of the file provided by the requestor.
|
||||
*/
|
||||
public String getDescription() {
|
||||
return streamInitiation.getFile().getDesc();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the mime-type of the file.
|
||||
*
|
||||
* @return Returns the mime-type of the file.
|
||||
*/
|
||||
public String getMimeType() {
|
||||
return streamInitiation.getMimeType();
|
||||
}
|
||||
/**
|
||||
* Returns the mime-type of the file.
|
||||
*
|
||||
* @return Returns the mime-type of the file.
|
||||
*/
|
||||
public String getMimeType() {
|
||||
return streamInitiation.getMimeType();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the fully-qualified jabber ID of the user that requested this
|
||||
* file transfer.
|
||||
*
|
||||
* @return Returns the fully-qualified jabber ID of the user that requested
|
||||
* this file transfer.
|
||||
*/
|
||||
public Jid getRequestor() {
|
||||
return streamInitiation.getFrom();
|
||||
}
|
||||
/**
|
||||
* Returns the fully-qualified jabber ID of the user that requested this
|
||||
* file transfer.
|
||||
*
|
||||
* @return Returns the fully-qualified jabber ID of the user that requested
|
||||
* this file transfer.
|
||||
*/
|
||||
public Jid getRequestor() {
|
||||
return streamInitiation.getFrom();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the stream ID that uniquely identifies this file transfer.
|
||||
*
|
||||
* @return Returns the stream ID that uniquely identifies this file
|
||||
* transfer.
|
||||
*/
|
||||
public String getStreamID() {
|
||||
return streamInitiation.getSessionID();
|
||||
}
|
||||
/**
|
||||
* Returns the stream ID that uniquely identifies this file transfer.
|
||||
*
|
||||
* @return Returns the stream ID that uniquely identifies this file
|
||||
* transfer.
|
||||
*/
|
||||
public String getStreamID() {
|
||||
return streamInitiation.getSessionID();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the stream initiation stanza(/packet) that was sent by the requestor which
|
||||
* contains the parameters of the file transfer being transfer and also the
|
||||
* methods available to transfer the file.
|
||||
*
|
||||
* @return Returns the stream initiation stanza(/packet) that was sent by the
|
||||
* requestor which contains the parameters of the file transfer
|
||||
* being transfer and also the methods available to transfer the
|
||||
* file.
|
||||
*/
|
||||
protected StreamInitiation getStreamInitiation() {
|
||||
return streamInitiation;
|
||||
}
|
||||
/**
|
||||
* Returns the stream initiation stanza(/packet) that was sent by the requestor which
|
||||
* contains the parameters of the file transfer being transfer and also the
|
||||
* methods available to transfer the file.
|
||||
*
|
||||
* @return Returns the stream initiation stanza(/packet) that was sent by the
|
||||
* requestor which contains the parameters of the file transfer
|
||||
* being transfer and also the methods available to transfer the
|
||||
* file.
|
||||
*/
|
||||
protected StreamInitiation getStreamInitiation() {
|
||||
return streamInitiation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Accepts this file transfer and creates the incoming file transfer.
|
||||
*
|
||||
* @return Returns the <b><i>IncomingFileTransfer</b></i> on which the
|
||||
* file transfer can be carried out.
|
||||
*/
|
||||
public IncomingFileTransfer accept() {
|
||||
return manager.createIncomingFileTransfer(this);
|
||||
}
|
||||
/**
|
||||
* Accepts this file transfer and creates the incoming file transfer.
|
||||
*
|
||||
* @return Returns the <b><i>IncomingFileTransfer</b></i> on which the
|
||||
* file transfer can be carried out.
|
||||
*/
|
||||
public IncomingFileTransfer accept() {
|
||||
return manager.createIncomingFileTransfer(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rejects the file transfer request.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void reject() throws NotConnectedException, InterruptedException {
|
||||
manager.rejectIncomingFileTransfer(this);
|
||||
}
|
||||
/**
|
||||
* Rejects the file transfer request.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void reject() throws NotConnectedException, InterruptedException {
|
||||
manager.rejectIncomingFileTransfer(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ import org.jxmpp.jid.Jid;
|
|||
public class OutgoingFileTransfer extends FileTransfer {
|
||||
private static final Logger LOGGER = Logger.getLogger(OutgoingFileTransfer.class.getName());
|
||||
|
||||
private static int RESPONSE_TIMEOUT = 60 * 1000;
|
||||
private static int RESPONSE_TIMEOUT = 60 * 1000;
|
||||
private NegotiationProgress callback;
|
||||
|
||||
/**
|
||||
|
@ -58,349 +58,349 @@ public class OutgoingFileTransfer extends FileTransfer {
|
|||
return RESPONSE_TIMEOUT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the time in milliseconds after which the file transfer negotiation
|
||||
* process will timeout if the other user has not responded.
|
||||
*
|
||||
* @param responseTimeout
|
||||
* The timeout time in milliseconds.
|
||||
*/
|
||||
public static void setResponseTimeout(int responseTimeout) {
|
||||
RESPONSE_TIMEOUT = responseTimeout;
|
||||
}
|
||||
/**
|
||||
* Sets the time in milliseconds after which the file transfer negotiation
|
||||
* process will timeout if the other user has not responded.
|
||||
*
|
||||
* @param responseTimeout
|
||||
* The timeout time in milliseconds.
|
||||
*/
|
||||
public static void setResponseTimeout(int responseTimeout) {
|
||||
RESPONSE_TIMEOUT = responseTimeout;
|
||||
}
|
||||
|
||||
private OutputStream outputStream;
|
||||
private OutputStream outputStream;
|
||||
|
||||
private Jid initiator;
|
||||
private Jid initiator;
|
||||
|
||||
private Thread transferThread;
|
||||
private Thread transferThread;
|
||||
|
||||
protected OutgoingFileTransfer(Jid initiator, Jid target,
|
||||
String streamID, FileTransferNegotiator transferNegotiator) {
|
||||
super(target, streamID, transferNegotiator);
|
||||
this.initiator = initiator;
|
||||
}
|
||||
protected OutgoingFileTransfer(Jid initiator, Jid target,
|
||||
String streamID, FileTransferNegotiator transferNegotiator) {
|
||||
super(target, streamID, transferNegotiator);
|
||||
this.initiator = initiator;
|
||||
}
|
||||
|
||||
protected void setOutputStream(OutputStream stream) {
|
||||
if (outputStream == null) {
|
||||
this.outputStream = stream;
|
||||
}
|
||||
}
|
||||
protected void setOutputStream(OutputStream stream) {
|
||||
if (outputStream == null) {
|
||||
this.outputStream = stream;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the output stream connected to the peer to transfer the file. It
|
||||
* is only available after it has been successfully negotiated by the
|
||||
* {@link StreamNegotiator}.
|
||||
*
|
||||
* @return Returns the output stream connected to the peer to transfer the
|
||||
* file.
|
||||
*/
|
||||
protected OutputStream getOutputStream() {
|
||||
if (getStatus().equals(FileTransfer.Status.negotiated)) {
|
||||
return outputStream;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Returns the output stream connected to the peer to transfer the file. It
|
||||
* is only available after it has been successfully negotiated by the
|
||||
* {@link StreamNegotiator}.
|
||||
*
|
||||
* @return Returns the output stream connected to the peer to transfer the
|
||||
* file.
|
||||
*/
|
||||
protected OutputStream getOutputStream() {
|
||||
if (getStatus().equals(FileTransfer.Status.negotiated)) {
|
||||
return outputStream;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method handles the negotiation of the file transfer and the stream,
|
||||
* it only returns the created stream after the negotiation has been completed.
|
||||
*
|
||||
* @param fileName
|
||||
* The name of the file that will be transmitted. It is
|
||||
* preferable for this name to have an extension as it will be
|
||||
* used to determine the type of file it is.
|
||||
* @param fileSize
|
||||
* The size in bytes of the file that will be transmitted.
|
||||
* @param description
|
||||
* A description of the file that will be transmitted.
|
||||
* @return The OutputStream that is connected to the peer to transmit the
|
||||
* file.
|
||||
* @throws XMPPException
|
||||
* Thrown if an error occurs during the file transfer
|
||||
* negotiation process.
|
||||
* @throws SmackException if there was no response from the server.
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public synchronized OutputStream sendFile(String fileName, long fileSize,
|
||||
String description) throws XMPPException, SmackException, InterruptedException {
|
||||
if (isDone() || outputStream != null) {
|
||||
throw new IllegalStateException(
|
||||
"The negotation process has already"
|
||||
+ " been attempted on this file transfer");
|
||||
}
|
||||
try {
|
||||
setFileInfo(fileName, fileSize);
|
||||
this.outputStream = negotiateStream(fileName, fileSize, description);
|
||||
} catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
throw e;
|
||||
}
|
||||
return outputStream;
|
||||
}
|
||||
/**
|
||||
* This method handles the negotiation of the file transfer and the stream,
|
||||
* it only returns the created stream after the negotiation has been completed.
|
||||
*
|
||||
* @param fileName
|
||||
* The name of the file that will be transmitted. It is
|
||||
* preferable for this name to have an extension as it will be
|
||||
* used to determine the type of file it is.
|
||||
* @param fileSize
|
||||
* The size in bytes of the file that will be transmitted.
|
||||
* @param description
|
||||
* A description of the file that will be transmitted.
|
||||
* @return The OutputStream that is connected to the peer to transmit the
|
||||
* file.
|
||||
* @throws XMPPException
|
||||
* Thrown if an error occurs during the file transfer
|
||||
* negotiation process.
|
||||
* @throws SmackException if there was no response from the server.
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public synchronized OutputStream sendFile(String fileName, long fileSize,
|
||||
String description) throws XMPPException, SmackException, InterruptedException {
|
||||
if (isDone() || outputStream != null) {
|
||||
throw new IllegalStateException(
|
||||
"The negotation process has already"
|
||||
+ " been attempted on this file transfer");
|
||||
}
|
||||
try {
|
||||
setFileInfo(fileName, fileSize);
|
||||
this.outputStream = negotiateStream(fileName, fileSize, description);
|
||||
} catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
throw e;
|
||||
}
|
||||
return outputStream;
|
||||
}
|
||||
|
||||
/**
|
||||
* This methods handles the transfer and stream negotiation process. It
|
||||
* returns immediately and its progress will be updated through the
|
||||
* {@link NegotiationProgress} callback.
|
||||
*
|
||||
* @param fileName
|
||||
* The name of the file that will be transmitted. It is
|
||||
* preferable for this name to have an extension as it will be
|
||||
* used to determine the type of file it is.
|
||||
* @param fileSize
|
||||
* The size in bytes of the file that will be transmitted.
|
||||
* @param description
|
||||
* A description of the file that will be transmitted.
|
||||
* @param progress
|
||||
* A callback to monitor the progress of the file transfer
|
||||
* negotiation process and to retrieve the OutputStream when it
|
||||
* is complete.
|
||||
*/
|
||||
public synchronized void sendFile(final String fileName,
|
||||
final long fileSize, final String description,
|
||||
final NegotiationProgress progress)
|
||||
/**
|
||||
* This methods handles the transfer and stream negotiation process. It
|
||||
* returns immediately and its progress will be updated through the
|
||||
* {@link NegotiationProgress} callback.
|
||||
*
|
||||
* @param fileName
|
||||
* The name of the file that will be transmitted. It is
|
||||
* preferable for this name to have an extension as it will be
|
||||
* used to determine the type of file it is.
|
||||
* @param fileSize
|
||||
* The size in bytes of the file that will be transmitted.
|
||||
* @param description
|
||||
* A description of the file that will be transmitted.
|
||||
* @param progress
|
||||
* A callback to monitor the progress of the file transfer
|
||||
* negotiation process and to retrieve the OutputStream when it
|
||||
* is complete.
|
||||
*/
|
||||
public synchronized void sendFile(final String fileName,
|
||||
final long fileSize, final String description,
|
||||
final NegotiationProgress progress)
|
||||
{
|
||||
if(progress == null) {
|
||||
throw new IllegalArgumentException("Callback progress cannot be null.");
|
||||
}
|
||||
checkTransferThread();
|
||||
if (isDone() || outputStream != null) {
|
||||
throw new IllegalStateException(
|
||||
"The negotation process has already"
|
||||
+ " been attempted for this file transfer");
|
||||
}
|
||||
if (isDone() || outputStream != null) {
|
||||
throw new IllegalStateException(
|
||||
"The negotation process has already"
|
||||
+ " been attempted for this file transfer");
|
||||
}
|
||||
setFileInfo(fileName, fileSize);
|
||||
this.callback = progress;
|
||||
transferThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
OutgoingFileTransfer.this.outputStream = negotiateStream(
|
||||
fileName, fileSize, description);
|
||||
public void run() {
|
||||
try {
|
||||
OutgoingFileTransfer.this.outputStream = negotiateStream(
|
||||
fileName, fileSize, description);
|
||||
progress.outputStreamEstablished(OutgoingFileTransfer.this.outputStream);
|
||||
}
|
||||
catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
}
|
||||
handleXMPPException(e);
|
||||
}
|
||||
catch (Exception e) {
|
||||
setException(e);
|
||||
}
|
||||
}
|
||||
}, "File Transfer Negotiation " + streamID);
|
||||
transferThread.start();
|
||||
}
|
||||
}
|
||||
}, "File Transfer Negotiation " + streamID);
|
||||
transferThread.start();
|
||||
}
|
||||
|
||||
private void checkTransferThread() {
|
||||
if (transferThread != null && transferThread.isAlive() || isDone()) {
|
||||
throw new IllegalStateException(
|
||||
"File transfer in progress or has already completed.");
|
||||
}
|
||||
}
|
||||
private void checkTransferThread() {
|
||||
if (transferThread != null && transferThread.isAlive() || isDone()) {
|
||||
throw new IllegalStateException(
|
||||
"File transfer in progress or has already completed.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method handles the stream negotiation process and transmits the file
|
||||
* to the remote user. It returns immediately and the progress of the file
|
||||
* transfer can be monitored through several methods:
|
||||
*
|
||||
* <UL>
|
||||
* <LI>{@link FileTransfer#getStatus()}
|
||||
* <LI>{@link FileTransfer#getProgress()}
|
||||
* <LI>{@link FileTransfer#isDone()}
|
||||
* </UL>
|
||||
*
|
||||
* This method handles the stream negotiation process and transmits the file
|
||||
* to the remote user. It returns immediately and the progress of the file
|
||||
* transfer can be monitored through several methods:
|
||||
*
|
||||
* <UL>
|
||||
* <LI>{@link FileTransfer#getStatus()}
|
||||
* <LI>{@link FileTransfer#getProgress()}
|
||||
* <LI>{@link FileTransfer#isDone()}
|
||||
* </UL>
|
||||
*
|
||||
* @param file the file to transfer to the remote entity.
|
||||
* @param description a description for the file to transfer.
|
||||
* @throws SmackException
|
||||
* If there is an error during the negotiation process or the
|
||||
* sending of the file.
|
||||
*/
|
||||
public synchronized void sendFile(final File file, final String description)
|
||||
throws SmackException {
|
||||
checkTransferThread();
|
||||
if (file == null || !file.exists() || !file.canRead()) {
|
||||
throw new IllegalArgumentException("Could not read file");
|
||||
} else {
|
||||
setFileInfo(file.getAbsolutePath(), file.getName(), file.length());
|
||||
}
|
||||
* @throws SmackException
|
||||
* If there is an error during the negotiation process or the
|
||||
* sending of the file.
|
||||
*/
|
||||
public synchronized void sendFile(final File file, final String description)
|
||||
throws SmackException {
|
||||
checkTransferThread();
|
||||
if (file == null || !file.exists() || !file.canRead()) {
|
||||
throw new IllegalArgumentException("Could not read file");
|
||||
} else {
|
||||
setFileInfo(file.getAbsolutePath(), file.getName(), file.length());
|
||||
}
|
||||
|
||||
transferThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
outputStream = negotiateStream(file.getName(), file
|
||||
.length(), description);
|
||||
} catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
return;
|
||||
}
|
||||
transferThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
outputStream = negotiateStream(file.getName(), file
|
||||
.length(), description);
|
||||
} catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
return;
|
||||
}
|
||||
catch (Exception e) {
|
||||
setException(e);
|
||||
}
|
||||
if (outputStream == null) {
|
||||
return;
|
||||
}
|
||||
if (outputStream == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!updateStatus(Status.negotiated, Status.in_progress)) {
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
InputStream inputStream = null;
|
||||
try {
|
||||
inputStream = new FileInputStream(file);
|
||||
writeToStream(inputStream, outputStream);
|
||||
} catch (FileNotFoundException e) {
|
||||
setStatus(FileTransfer.Status.error);
|
||||
setError(Error.bad_file);
|
||||
setException(e);
|
||||
} catch (IOException e) {
|
||||
setStatus(FileTransfer.Status.error);
|
||||
setException(e);
|
||||
} finally {
|
||||
if (inputStream != null) {
|
||||
try {
|
||||
InputStream inputStream = null;
|
||||
try {
|
||||
inputStream = new FileInputStream(file);
|
||||
writeToStream(inputStream, outputStream);
|
||||
} catch (FileNotFoundException e) {
|
||||
setStatus(FileTransfer.Status.error);
|
||||
setError(Error.bad_file);
|
||||
setException(e);
|
||||
} catch (IOException e) {
|
||||
setStatus(FileTransfer.Status.error);
|
||||
setException(e);
|
||||
} finally {
|
||||
if (inputStream != null) {
|
||||
try {
|
||||
inputStream.close();
|
||||
} catch (IOException e) {
|
||||
LOGGER.log(Level.WARNING, "Closing input stream", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
try {
|
||||
outputStream.close();
|
||||
} catch (IOException e) {
|
||||
LOGGER.log(Level.WARNING, "Closing output stream", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
updateStatus(Status.in_progress, FileTransfer.Status.complete);
|
||||
}
|
||||
}
|
||||
|
||||
}, "File Transfer " + streamID);
|
||||
transferThread.start();
|
||||
}
|
||||
}, "File Transfer " + streamID);
|
||||
transferThread.start();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method handles the stream negotiation process and transmits the file
|
||||
* to the remote user. It returns immediately and the progress of the file
|
||||
* transfer can be monitored through several methods:
|
||||
*
|
||||
* <UL>
|
||||
* <LI>{@link FileTransfer#getStatus()}
|
||||
* <LI>{@link FileTransfer#getProgress()}
|
||||
* <LI>{@link FileTransfer#isDone()}
|
||||
* </UL>
|
||||
*
|
||||
* This method handles the stream negotiation process and transmits the file
|
||||
* to the remote user. It returns immediately and the progress of the file
|
||||
* transfer can be monitored through several methods:
|
||||
*
|
||||
* <UL>
|
||||
* <LI>{@link FileTransfer#getStatus()}
|
||||
* <LI>{@link FileTransfer#getProgress()}
|
||||
* <LI>{@link FileTransfer#isDone()}
|
||||
* </UL>
|
||||
*
|
||||
* @param in the stream to transfer to the remote entity.
|
||||
* @param fileName the name 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.
|
||||
*/
|
||||
public synchronized void sendStream(final InputStream in, final String fileName, final long fileSize, final String description){
|
||||
checkTransferThread();
|
||||
*/
|
||||
public synchronized void sendStream(final InputStream in, final String fileName, final long fileSize, final String description){
|
||||
checkTransferThread();
|
||||
|
||||
setFileInfo(fileName, fileSize);
|
||||
transferThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
setFileInfo(fileName, fileSize);
|
||||
transferThread = new Thread(new Runnable() {
|
||||
public void run() {
|
||||
//Create packet filter
|
||||
try {
|
||||
outputStream = negotiateStream(fileName, fileSize, description);
|
||||
} catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
return;
|
||||
}
|
||||
outputStream = negotiateStream(fileName, fileSize, description);
|
||||
} catch (XMPPErrorException e) {
|
||||
handleXMPPException(e);
|
||||
return;
|
||||
}
|
||||
catch (Exception e) {
|
||||
setException(e);
|
||||
}
|
||||
if (outputStream == null) {
|
||||
return;
|
||||
}
|
||||
if (outputStream == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!updateStatus(Status.negotiated, Status.in_progress)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
writeToStream(in, outputStream);
|
||||
} catch (IOException e) {
|
||||
setStatus(FileTransfer.Status.error);
|
||||
setException(e);
|
||||
} finally {
|
||||
try {
|
||||
if (in != null) {
|
||||
in.close();
|
||||
}
|
||||
return;
|
||||
}
|
||||
try {
|
||||
writeToStream(in, outputStream);
|
||||
} catch (IOException e) {
|
||||
setStatus(FileTransfer.Status.error);
|
||||
setException(e);
|
||||
} finally {
|
||||
try {
|
||||
if (in != null) {
|
||||
in.close();
|
||||
}
|
||||
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
} catch (IOException e) {
|
||||
outputStream.flush();
|
||||
outputStream.close();
|
||||
} catch (IOException e) {
|
||||
/* Do Nothing */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
updateStatus(Status.in_progress, FileTransfer.Status.complete);
|
||||
}
|
||||
}
|
||||
|
||||
}, "File Transfer " + streamID);
|
||||
transferThread.start();
|
||||
}
|
||||
}, "File Transfer " + streamID);
|
||||
transferThread.start();
|
||||
}
|
||||
|
||||
private void handleXMPPException(XMPPErrorException e) {
|
||||
XMPPError error = e.getXMPPError();
|
||||
if (error != null) {
|
||||
switch (error.getCondition()) {
|
||||
case forbidden:
|
||||
setStatus(Status.refused);
|
||||
return;
|
||||
case bad_request:
|
||||
setStatus(Status.error);
|
||||
setError(Error.not_acceptable);
|
||||
break;
|
||||
private void handleXMPPException(XMPPErrorException e) {
|
||||
XMPPError error = e.getXMPPError();
|
||||
if (error != null) {
|
||||
switch (error.getCondition()) {
|
||||
case forbidden:
|
||||
setStatus(Status.refused);
|
||||
return;
|
||||
case bad_request:
|
||||
setStatus(Status.error);
|
||||
setError(Error.not_acceptable);
|
||||
break;
|
||||
default:
|
||||
setStatus(FileTransfer.Status.error);
|
||||
}
|
||||
}
|
||||
|
||||
setException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the amount of bytes that have been sent for the file transfer. Or
|
||||
* -1 if the file transfer has not started.
|
||||
* <p>
|
||||
* Note: This method is only useful when the {@link #sendFile(File, String)}
|
||||
* method is called, as it is the only method that actually transmits the
|
||||
* file.
|
||||
*
|
||||
* @return Returns the amount of bytes that have been sent for the file
|
||||
* transfer. Or -1 if the file transfer has not started.
|
||||
*/
|
||||
public long getBytesSent() {
|
||||
return amountWritten;
|
||||
}
|
||||
/**
|
||||
* Returns the amount of bytes that have been sent for the file transfer. Or
|
||||
* -1 if the file transfer has not started.
|
||||
* <p>
|
||||
* Note: This method is only useful when the {@link #sendFile(File, String)}
|
||||
* method is called, as it is the only method that actually transmits the
|
||||
* file.
|
||||
*
|
||||
* @return Returns the amount of bytes that have been sent for the file
|
||||
* transfer. Or -1 if the file transfer has not started.
|
||||
*/
|
||||
public long getBytesSent() {
|
||||
return amountWritten;
|
||||
}
|
||||
|
||||
private OutputStream negotiateStream(String fileName, long fileSize,
|
||||
String description) throws SmackException, XMPPException, InterruptedException {
|
||||
// Negotiate the file transfer profile
|
||||
private OutputStream negotiateStream(String fileName, long fileSize,
|
||||
String description) throws SmackException, XMPPException, InterruptedException {
|
||||
// Negotiate the file transfer profile
|
||||
|
||||
if (!updateStatus(Status.initial, Status.negotiating_transfer)) {
|
||||
throw new IllegalStateChangeException();
|
||||
}
|
||||
StreamNegotiator streamNegotiator = negotiator.negotiateOutgoingTransfer(
|
||||
getPeer(), streamID, fileName, fileSize, description,
|
||||
RESPONSE_TIMEOUT);
|
||||
StreamNegotiator streamNegotiator = negotiator.negotiateOutgoingTransfer(
|
||||
getPeer(), streamID, fileName, fileSize, description,
|
||||
RESPONSE_TIMEOUT);
|
||||
|
||||
// Negotiate the stream
|
||||
if (!updateStatus(Status.negotiating_transfer, Status.negotiating_stream)) {
|
||||
throw new IllegalStateChangeException();
|
||||
}
|
||||
outputStream = streamNegotiator.createOutgoingStream(streamID,
|
||||
outputStream = streamNegotiator.createOutgoingStream(streamID,
|
||||
initiator, getPeer());
|
||||
|
||||
if (!updateStatus(Status.negotiating_stream, Status.negotiated)) {
|
||||
throw new IllegalStateChangeException();
|
||||
}
|
||||
return outputStream;
|
||||
}
|
||||
}
|
||||
return outputStream;
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
setStatus(Status.cancelled);
|
||||
}
|
||||
public void cancel() {
|
||||
setStatus(Status.cancelled);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean updateStatus(Status oldStatus, Status newStatus) {
|
||||
|
@ -429,30 +429,30 @@ public class OutgoingFileTransfer extends FileTransfer {
|
|||
}
|
||||
|
||||
/**
|
||||
* A callback class to retrieve the status of an outgoing transfer
|
||||
* negotiation process.
|
||||
*
|
||||
* @author Alexander Wenckus
|
||||
*
|
||||
*/
|
||||
public interface NegotiationProgress {
|
||||
* A callback class to retrieve the status of an outgoing transfer
|
||||
* negotiation process.
|
||||
*
|
||||
* @author Alexander Wenckus
|
||||
*
|
||||
*/
|
||||
public interface NegotiationProgress {
|
||||
|
||||
/**
|
||||
* Called when the status changes.
|
||||
/**
|
||||
* Called when the status changes.
|
||||
*
|
||||
* @param oldStatus the previous status of the file transfer.
|
||||
* @param newStatus the new status of the file transfer.
|
||||
*/
|
||||
void statusUpdated(Status oldStatus, Status newStatus);
|
||||
void statusUpdated(Status oldStatus, Status newStatus);
|
||||
|
||||
/**
|
||||
* Once the negotiation process is completed the output stream can be
|
||||
* retrieved.
|
||||
/**
|
||||
* Once the negotiation process is completed the output stream can be
|
||||
* retrieved.
|
||||
*
|
||||
* @param stream the established stream which can be used to transfer the file to the remote
|
||||
* entity
|
||||
*/
|
||||
void outputStreamEstablished(OutputStream stream);
|
||||
*/
|
||||
void outputStreamEstablished(OutputStream stream);
|
||||
|
||||
/**
|
||||
* Called when an exception occurs during the negotiation progress.
|
||||
|
|
|
@ -71,6 +71,6 @@ public class RegistrationProvider extends IQProvider<Registration> {
|
|||
Registration registration = new Registration(instruction, fields);
|
||||
registration.addExtensions(packetExtensions);
|
||||
return registration;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -31,77 +31,77 @@ import org.xmlpull.v1.XmlPullParserException;
|
|||
*/
|
||||
public class Nick implements ExtensionElement {
|
||||
|
||||
public static final String NAMESPACE = "http://jabber.org/protocol/nick";
|
||||
public static final String NAMESPACE = "http://jabber.org/protocol/nick";
|
||||
|
||||
public static final String ELEMENT_NAME = "nick";
|
||||
public static final String ELEMENT_NAME = "nick";
|
||||
|
||||
private String name = null;
|
||||
private String name = null;
|
||||
|
||||
public Nick(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
public Nick(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* The value of this nickname.
|
||||
*
|
||||
* @return the nickname
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
/**
|
||||
* The value of this nickname.
|
||||
*
|
||||
* @return the nickname
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of this nickname.
|
||||
*
|
||||
* @param name
|
||||
* the name to set
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
/**
|
||||
* Sets the value of this nickname.
|
||||
*
|
||||
* @param name
|
||||
* the name to set
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.jivesoftware.smack.packet.PacketExtension#getElementName()
|
||||
*/
|
||||
public String getElementName() {
|
||||
return ELEMENT_NAME;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.jivesoftware.smack.packet.PacketExtension#getElementName()
|
||||
*/
|
||||
public String getElementName() {
|
||||
return ELEMENT_NAME;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.jivesoftware.smack.packet.PacketExtension#getNamespace()
|
||||
*/
|
||||
public String getNamespace() {
|
||||
return NAMESPACE;
|
||||
}
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.jivesoftware.smack.packet.PacketExtension#getNamespace()
|
||||
*/
|
||||
public String getNamespace() {
|
||||
return NAMESPACE;
|
||||
}
|
||||
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.jivesoftware.smack.packet.PacketExtension#toXML()
|
||||
*/
|
||||
public String toXML() {
|
||||
final StringBuilder buf = new StringBuilder();
|
||||
/*
|
||||
* (non-Javadoc)
|
||||
*
|
||||
* @see org.jivesoftware.smack.packet.PacketExtension#toXML()
|
||||
*/
|
||||
public String toXML() {
|
||||
final StringBuilder buf = new StringBuilder();
|
||||
|
||||
buf.append('<').append(ELEMENT_NAME).append(" xmlns=\"").append(
|
||||
NAMESPACE).append("\">");
|
||||
buf.append(getName());
|
||||
buf.append("</").append(ELEMENT_NAME).append('>');
|
||||
buf.append('<').append(ELEMENT_NAME).append(" xmlns=\"").append(
|
||||
NAMESPACE).append("\">");
|
||||
buf.append(getName());
|
||||
buf.append("</").append(ELEMENT_NAME).append('>');
|
||||
|
||||
return buf.toString();
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public static class Provider extends ExtensionElementProvider<Nick> {
|
||||
public static class Provider extends ExtensionElementProvider<Nick> {
|
||||
|
||||
@Override
|
||||
public Nick parse(XmlPullParser parser, int initialDepth)
|
||||
throws XmlPullParserException, IOException {
|
||||
final String name = parser.nextText();
|
||||
final String name = parser.nextText();
|
||||
|
||||
return new Nick(name);
|
||||
}
|
||||
}
|
||||
return new Nick(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ public final class PrivacyListManager extends Manager {
|
|||
*
|
||||
* @param connection the XMPP connection.
|
||||
*/
|
||||
private PrivacyListManager(XMPPConnection connection) {
|
||||
private PrivacyListManager(XMPPConnection connection) {
|
||||
super(connection);
|
||||
|
||||
connection.registerIQRequestHandler(new AbstractIqRequestHandler(Privacy.ELEMENT, Privacy.NAMESPACE,
|
||||
|
@ -215,24 +215,24 @@ public final class PrivacyListManager extends Manager {
|
|||
return plm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the {@link Privacy} stanza(/packet) to the server in order to know some privacy content and then
|
||||
* waits for the answer.
|
||||
*
|
||||
* @param requestPrivacy is the {@link Privacy} stanza(/packet) configured properly whose XML
|
||||
/**
|
||||
* Send the {@link Privacy} stanza(/packet) to the server in order to know some privacy content and then
|
||||
* waits for the answer.
|
||||
*
|
||||
* @param requestPrivacy is the {@link Privacy} stanza(/packet) configured properly whose XML
|
||||
* will be sent to the server.
|
||||
* @return a new {@link Privacy} with the data received from the server.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
private Privacy getRequest(Privacy requestPrivacy) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request is a get iq type
|
||||
requestPrivacy.setType(Privacy.Type.get);
|
||||
* @return a new {@link Privacy} with the data received from the server.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
private Privacy getRequest(Privacy requestPrivacy) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request is a get iq type
|
||||
requestPrivacy.setType(Privacy.Type.get);
|
||||
|
||||
return connection().createStanzaCollectorAndSend(requestPrivacy).nextResultOrThrow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the {@link Privacy} stanza(/packet) to the server in order to modify the server privacy and waits
|
||||
|
@ -253,22 +253,22 @@ public final class PrivacyListManager extends Manager {
|
|||
return connection().createStanzaCollectorAndSend(requestPrivacy).nextResultOrThrow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer a privacy containing the list structure without {@link PrivacyItem}.
|
||||
*
|
||||
* @return a Privacy with the list names.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
private Privacy getPrivacyWithListNames() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an empty privacy message
|
||||
Privacy request = new Privacy();
|
||||
/**
|
||||
* Answer a privacy containing the list structure without {@link PrivacyItem}.
|
||||
*
|
||||
* @return a Privacy with the list names.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
private Privacy getPrivacyWithListNames() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an empty privacy message
|
||||
Privacy request = new Privacy();
|
||||
|
||||
// Send the package to the server and get the answer
|
||||
return getRequest(request);
|
||||
}
|
||||
// Send the package to the server and get the answer
|
||||
return getRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer the active privacy list. Returns <code>null</code> if there is no active list.
|
||||
|
@ -386,20 +386,20 @@ public final class PrivacyListManager extends Manager {
|
|||
return privacyAnswer.getPrivacyList(listName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer the privacy list items under listName with the allowed and blocked permissions.
|
||||
*
|
||||
* @param listName the name of the list to get the allowed and blocked permissions.
|
||||
* @return a privacy list under the list listName.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public PrivacyList getPrivacyList(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
/**
|
||||
* Answer the privacy list items under listName with the allowed and blocked permissions.
|
||||
*
|
||||
* @param listName the name of the list to get the allowed and blocked permissions.
|
||||
* @return a privacy list under the list listName.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public PrivacyList getPrivacyList(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
listName = StringUtils.requireNotNullOrEmpty(listName, "List name must not be null");
|
||||
return new PrivacyList(false, false, listName, getPrivacyListItems(listName));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Answer every privacy list with the allowed and blocked permissions.
|
||||
|
@ -423,87 +423,87 @@ public final class PrivacyListManager extends Manager {
|
|||
return lists;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set or change the active list to listName.
|
||||
*
|
||||
* @param listName the list name to set as the active one.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void setActiveListName(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setActiveName(listName);
|
||||
/**
|
||||
* Set or change the active list to listName.
|
||||
*
|
||||
* @param listName the list name to set as the active one.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void setActiveListName(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setActiveName(listName);
|
||||
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Client declines the use of active lists.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void declineActiveList() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setDeclineActiveList(true);
|
||||
/**
|
||||
* Client declines the use of active lists.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void declineActiveList() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setDeclineActiveList(true);
|
||||
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set or change the default list to listName.
|
||||
*
|
||||
* @param listName the list name to set as the default one.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void setDefaultListName(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setDefaultName(listName);
|
||||
/**
|
||||
* Set or change the default list to listName.
|
||||
*
|
||||
* @param listName the list name to set as the default one.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void setDefaultListName(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setDefaultName(listName);
|
||||
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Client declines the use of default lists.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void declineDefaultList() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setDeclineDefaultList(true);
|
||||
/**
|
||||
* Client declines the use of default lists.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void declineDefaultList() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setDeclineDefaultList(true);
|
||||
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* The client has created a new list. It send the new one to the server.
|
||||
*
|
||||
/**
|
||||
* The client has created a new list. It send the new one to the server.
|
||||
*
|
||||
* @param listName the list that has changed its content.
|
||||
* @param privacyItems a List with every privacy item in the list.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void createPrivacyList(String listName, List<PrivacyItem> privacyItems) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
updatePrivacyList(listName, privacyItems);
|
||||
}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void createPrivacyList(String listName, List<PrivacyItem> privacyItems) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
updatePrivacyList(listName, privacyItems);
|
||||
}
|
||||
|
||||
/**
|
||||
* The client has edited an existing list. It updates the server content with the resulting
|
||||
|
@ -526,23 +526,23 @@ public final class PrivacyListManager extends Manager {
|
|||
setRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a privacy list.
|
||||
*
|
||||
/**
|
||||
* Remove a privacy list.
|
||||
*
|
||||
* @param listName the list that has changed its content.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deletePrivacyList(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setPrivacyList(listName, new ArrayList<PrivacyItem>());
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deletePrivacyList(String listName) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
|
||||
// The request of the list is an privacy message with an empty list
|
||||
Privacy request = new Privacy();
|
||||
request.setPrivacyList(listName, new ArrayList<PrivacyItem>());
|
||||
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
// Send the package to the server
|
||||
setRequest(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a privacy list listener that will be notified of any new update in the user
|
||||
|
|
|
@ -45,17 +45,17 @@ public class Privacy extends IQ {
|
|||
public static final String ELEMENT = QUERY_ELEMENT;
|
||||
public static final String NAMESPACE = "jabber:iq:privacy";
|
||||
|
||||
/** declineActiveList is true when the user declines the use of the active list **/
|
||||
private boolean declineActiveList=false;
|
||||
/** activeName is the name associated with the active list set for the session **/
|
||||
private String activeName;
|
||||
/** declineDefaultList is true when the user declines the use of the default list **/
|
||||
private boolean declineDefaultList=false;
|
||||
/** defaultName is the name of the default list that applies to the user as a whole **/
|
||||
private String defaultName;
|
||||
/** itemLists holds the set of privacy items classified in lists. It is a map where the
|
||||
* key is the name of the list and the value a collection with privacy items. **/
|
||||
private Map<String, List<PrivacyItem>> itemLists = new HashMap<String, List<PrivacyItem>>();
|
||||
/** declineActiveList is true when the user declines the use of the active list **/
|
||||
private boolean declineActiveList=false;
|
||||
/** activeName is the name associated with the active list set for the session **/
|
||||
private String activeName;
|
||||
/** declineDefaultList is true when the user declines the use of the default list **/
|
||||
private boolean declineDefaultList=false;
|
||||
/** defaultName is the name of the default list that applies to the user as a whole **/
|
||||
private String defaultName;
|
||||
/** itemLists holds the set of privacy items classified in lists. It is a map where the
|
||||
* key is the name of the list and the value a collection with privacy items. **/
|
||||
private Map<String, List<PrivacyItem>> itemLists = new HashMap<String, List<PrivacyItem>>();
|
||||
|
||||
public Privacy() {
|
||||
super(ELEMENT, NAMESPACE);
|
||||
|
@ -94,13 +94,13 @@ public class Privacy extends IQ {
|
|||
public void deletePrivacyList(String listName) {
|
||||
// Remove the list from the cache
|
||||
// CHECKSTYLE:OFF
|
||||
this.getItemLists().remove(listName);
|
||||
this.getItemLists().remove(listName);
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
// Check if deleted list was the default list
|
||||
if (this.getDefaultName() != null && listName.equals(this.getDefaultName())) {
|
||||
// CHECKSTYLE:OFF
|
||||
this.setDefaultName(null);
|
||||
this.setDefaultName(null);
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
}
|
||||
|
@ -114,9 +114,9 @@ public class Privacy extends IQ {
|
|||
// Check if we have the default list
|
||||
// CHECKSTYLE:OFF
|
||||
if (this.getActiveName() == null) {
|
||||
return null;
|
||||
return null;
|
||||
} else {
|
||||
return this.getItemLists().get(this.getActiveName());
|
||||
return this.getItemLists().get(this.getActiveName());
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
@ -130,9 +130,9 @@ public class Privacy extends IQ {
|
|||
// Check if we have the default list
|
||||
// CHECKSTYLE:OFF
|
||||
if (this.getDefaultName() == null) {
|
||||
return null;
|
||||
return null;
|
||||
} else {
|
||||
return this.getItemLists().get(this.getDefaultName());
|
||||
return this.getItemLists().get(this.getDefaultName());
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
@ -156,15 +156,15 @@ public class Privacy extends IQ {
|
|||
*/
|
||||
public PrivacyItem getItem(String listName, int order) {
|
||||
// CHECKSTYLE:OFF
|
||||
Iterator<PrivacyItem> values = getPrivacyList(listName).iterator();
|
||||
PrivacyItem itemFound = null;
|
||||
while (itemFound == null && values.hasNext()) {
|
||||
PrivacyItem element = values.next();
|
||||
if (element.getOrder() == order) {
|
||||
itemFound = element;
|
||||
}
|
||||
}
|
||||
return itemFound;
|
||||
Iterator<PrivacyItem> values = getPrivacyList(listName).iterator();
|
||||
PrivacyItem itemFound = null;
|
||||
while (itemFound == null && values.hasNext()) {
|
||||
PrivacyItem element = values.next();
|
||||
if (element.getOrder() == order) {
|
||||
itemFound = element;
|
||||
}
|
||||
}
|
||||
return itemFound;
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
||||
|
@ -180,7 +180,7 @@ public class Privacy extends IQ {
|
|||
return true;
|
||||
} else {
|
||||
// CHECKSTYLE:OFF
|
||||
return false;
|
||||
return false;
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ public class Privacy extends IQ {
|
|||
*/
|
||||
public void deleteList(String listName) {
|
||||
// CHECKSTYLE:OFF
|
||||
this.getItemLists().remove(listName);
|
||||
this.getItemLists().remove(listName);
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
|
||||
|
@ -203,9 +203,9 @@ public class Privacy extends IQ {
|
|||
* @return the name of the active list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public String getActiveName() {
|
||||
return activeName;
|
||||
}
|
||||
public String getActiveName() {
|
||||
return activeName;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -215,9 +215,9 @@ public class Privacy extends IQ {
|
|||
* @param activeName is the name of the active list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public void setActiveName(String activeName) {
|
||||
this.activeName = activeName;
|
||||
}
|
||||
public void setActiveName(String activeName) {
|
||||
this.activeName = activeName;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -228,9 +228,9 @@ public class Privacy extends IQ {
|
|||
* @return the name of the default list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public String getDefaultName() {
|
||||
return defaultName;
|
||||
}
|
||||
public String getDefaultName() {
|
||||
return defaultName;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -243,9 +243,9 @@ public class Privacy extends IQ {
|
|||
* @param defaultName is the name of the default list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public void setDefaultName(String defaultName) {
|
||||
this.defaultName = defaultName;
|
||||
}
|
||||
public void setDefaultName(String defaultName) {
|
||||
this.defaultName = defaultName;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -257,9 +257,9 @@ public class Privacy extends IQ {
|
|||
* collection of privacy items.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public Map<String, List<PrivacyItem>> getItemLists() {
|
||||
return itemLists;
|
||||
}
|
||||
public Map<String, List<PrivacyItem>> getItemLists() {
|
||||
return itemLists;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -268,9 +268,9 @@ public class Privacy extends IQ {
|
|||
* @return the decline status of the list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public boolean isDeclineActiveList() {
|
||||
return declineActiveList;
|
||||
}
|
||||
public boolean isDeclineActiveList() {
|
||||
return declineActiveList;
|
||||
}
|
||||
// CHECKSYTLE:ON
|
||||
|
||||
/**
|
||||
|
@ -279,9 +279,9 @@ public class Privacy extends IQ {
|
|||
* @param declineActiveList indicates if the receiver declines the use of an active list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public void setDeclineActiveList(boolean declineActiveList) {
|
||||
this.declineActiveList = declineActiveList;
|
||||
}
|
||||
public void setDeclineActiveList(boolean declineActiveList) {
|
||||
this.declineActiveList = declineActiveList;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -290,9 +290,9 @@ public class Privacy extends IQ {
|
|||
* @return the decline status of the list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public boolean isDeclineDefaultList() {
|
||||
return declineDefaultList;
|
||||
}
|
||||
public boolean isDeclineDefaultList() {
|
||||
return declineDefaultList;
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
/**
|
||||
|
@ -301,18 +301,18 @@ public class Privacy extends IQ {
|
|||
* @param declineDefaultList indicates if the receiver declines the use of a default list.
|
||||
*/
|
||||
// CHECKSTYLE:OFF
|
||||
public void setDeclineDefaultList(boolean declineDefaultList) {
|
||||
this.declineDefaultList = declineDefaultList;
|
||||
}
|
||||
public void setDeclineDefaultList(boolean declineDefaultList) {
|
||||
this.declineDefaultList = declineDefaultList;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Returns all the list names the user has defined to group restrictions.
|
||||
*
|
||||
* @return a Set with Strings containing every list names.
|
||||
*/
|
||||
public Set<String> getPrivacyListNames() {
|
||||
return this.itemLists.keySet();
|
||||
}
|
||||
public Set<String> getPrivacyListNames() {
|
||||
return this.itemLists.keySet();
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
@Override
|
||||
|
@ -322,40 +322,40 @@ public class Privacy extends IQ {
|
|||
|
||||
// Add the active tag
|
||||
if (this.isDeclineActiveList()) {
|
||||
buf.append("<active/>");
|
||||
buf.append("<active/>");
|
||||
} else {
|
||||
if (this.getActiveName() != null) {
|
||||
if (this.getActiveName() != null) {
|
||||
buf.append("<active name=\"").escape(getActiveName()).append("\"/>");
|
||||
}
|
||||
}
|
||||
// Add the default tag
|
||||
if (this.isDeclineDefaultList()) {
|
||||
buf.append("<default/>");
|
||||
buf.append("<default/>");
|
||||
} else {
|
||||
if (this.getDefaultName() != null) {
|
||||
if (this.getDefaultName() != null) {
|
||||
buf.append("<default name=\"").escape(getDefaultName()).append("\"/>");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Add the list with their privacy items
|
||||
for (Map.Entry<String, List<PrivacyItem>> entry : this.getItemLists().entrySet()) {
|
||||
String listName = entry.getKey();
|
||||
List<PrivacyItem> items = entry.getValue();
|
||||
// Begin the list tag
|
||||
if (items.isEmpty()) {
|
||||
// Begin the list tag
|
||||
if (items.isEmpty()) {
|
||||
buf.append("<list name=\"").escape(listName).append("\"/>");
|
||||
} else {
|
||||
} else {
|
||||
buf.append("<list name=\"").escape(listName).append("\">");
|
||||
}
|
||||
for (PrivacyItem item : items) {
|
||||
// Append the item xml representation
|
||||
buf.append(item.toXML());
|
||||
}
|
||||
// Close the list tag
|
||||
if (!items.isEmpty()) {
|
||||
buf.append("</list>");
|
||||
}
|
||||
}
|
||||
}
|
||||
for (PrivacyItem item : items) {
|
||||
// Append the item xml representation
|
||||
buf.append(item.toXML());
|
||||
}
|
||||
// Close the list tag
|
||||
if (!items.isEmpty()) {
|
||||
buf.append("</list>");
|
||||
}
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
return buf;
|
||||
}
|
||||
|
|
|
@ -47,20 +47,20 @@ public class PrivacyProvider extends IQProvider<Privacy> {
|
|||
if (eventType == XmlPullParser.START_TAG) {
|
||||
// CHECKSTYLE:OFF
|
||||
if (parser.getName().equals("active")) {
|
||||
String activeName = parser.getAttributeValue("", "name");
|
||||
if (activeName == null) {
|
||||
privacy.setDeclineActiveList(true);
|
||||
} else {
|
||||
privacy.setActiveName(activeName);
|
||||
}
|
||||
String activeName = parser.getAttributeValue("", "name");
|
||||
if (activeName == null) {
|
||||
privacy.setDeclineActiveList(true);
|
||||
} else {
|
||||
privacy.setActiveName(activeName);
|
||||
}
|
||||
}
|
||||
else if (parser.getName().equals("default")) {
|
||||
String defaultName = parser.getAttributeValue("", "name");
|
||||
if (defaultName == null) {
|
||||
privacy.setDeclineDefaultList(true);
|
||||
} else {
|
||||
privacy.setDefaultName(defaultName);
|
||||
}
|
||||
String defaultName = parser.getAttributeValue("", "name");
|
||||
if (defaultName == null) {
|
||||
privacy.setDeclineDefaultList(true);
|
||||
} else {
|
||||
privacy.setDefaultName(defaultName);
|
||||
}
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
else if (parser.getName().equals("list")) {
|
||||
|
@ -75,10 +75,10 @@ public class PrivacyProvider extends IQProvider<Privacy> {
|
|||
}
|
||||
|
||||
return privacy;
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the list complex type
|
||||
private static void parseList(XmlPullParser parser, Privacy privacy) throws XmlPullParserException, IOException, SmackException {
|
||||
// Parse the list complex type
|
||||
private static void parseList(XmlPullParser parser, Privacy privacy) throws XmlPullParserException, IOException, SmackException {
|
||||
boolean done = false;
|
||||
String listName = parser.getAttributeValue("", "name");
|
||||
ArrayList<PrivacyItem> items = new ArrayList<PrivacyItem>();
|
||||
|
@ -87,7 +87,7 @@ public class PrivacyProvider extends IQProvider<Privacy> {
|
|||
if (eventType == XmlPullParser.START_TAG) {
|
||||
if (parser.getName().equals("item")) {
|
||||
// CHECKSTYLE:OFF
|
||||
items.add(parseItem(parser));
|
||||
items.add(parseItem(parser));
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
}
|
||||
|
@ -100,10 +100,10 @@ public class PrivacyProvider extends IQProvider<Privacy> {
|
|||
|
||||
privacy.setPrivacyList(listName, items);
|
||||
// CHECKSTYLE:OFF
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the list complex type
|
||||
private static PrivacyItem parseItem(XmlPullParser parser) throws XmlPullParserException, IOException, SmackException {
|
||||
// Parse the list complex type
|
||||
private static PrivacyItem parseItem(XmlPullParser parser) throws XmlPullParserException, IOException, SmackException {
|
||||
// CHECKSTYLE:ON
|
||||
// Retrieves the required attributes
|
||||
String actionValue = parser.getAttributeValue("", "action");
|
||||
|
@ -142,7 +142,7 @@ public class PrivacyProvider extends IQProvider<Privacy> {
|
|||
parseItemChildElements(parser, item);
|
||||
return item;
|
||||
// CHECKSTYLE:OFF
|
||||
}
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
private static void parseItemChildElements(XmlPullParser parser, PrivacyItem privacyItem) throws XmlPullParserException, IOException {
|
||||
|
|
|
@ -24,18 +24,18 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum AccessModel
|
||||
{
|
||||
/** Anyone may subscribe and retrieve items. */
|
||||
open,
|
||||
/** Anyone may subscribe and retrieve items. */
|
||||
open,
|
||||
|
||||
/** Subscription request must be approved and only subscribers may retrieve items. */
|
||||
authorize,
|
||||
/** Subscription request must be approved and only subscribers may retrieve items. */
|
||||
authorize,
|
||||
|
||||
/** Anyone with a presence subscription of both or from may subscribe and retrieve items. */
|
||||
presence,
|
||||
/** Anyone with a presence subscription of both or from may subscribe and retrieve items. */
|
||||
presence,
|
||||
|
||||
/** Anyone in the specified roster group(s) may subscribe and retrieve items. */
|
||||
roster,
|
||||
/** Anyone in the specified roster group(s) may subscribe and retrieve items. */
|
||||
roster,
|
||||
|
||||
/** Only those on a whitelist may subscribe and retrieve items. */
|
||||
whitelist;
|
||||
/** Only those on a whitelist may subscribe and retrieve items. */
|
||||
whitelist;
|
||||
}
|
||||
|
|
|
@ -42,17 +42,17 @@ public class Affiliation implements ExtensionElement
|
|||
private final Type affiliation;
|
||||
private final PubSubNamespace namespace;
|
||||
|
||||
public enum Type
|
||||
{
|
||||
member, none, outcast, owner, publisher
|
||||
}
|
||||
public enum Type
|
||||
{
|
||||
member, none, outcast, owner, publisher
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an affiliation.
|
||||
*
|
||||
* @param node The node the user is affiliated with.
|
||||
* @param affiliation the optional affiliation.
|
||||
*/
|
||||
/**
|
||||
* Constructs an affiliation.
|
||||
*
|
||||
* @param node The node the user is affiliated with.
|
||||
* @param affiliation the optional affiliation.
|
||||
*/
|
||||
public Affiliation(String node, Type affiliation) {
|
||||
this.node = StringUtils.requireNotNullOrEmpty(node, "node must not be null or empty");
|
||||
this.affiliation = affiliation;
|
||||
|
|
|
@ -30,8 +30,8 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
*/
|
||||
public class AffiliationsExtension extends NodeExtension
|
||||
{
|
||||
protected List<Affiliation> items = Collections.emptyList();
|
||||
private final String node;
|
||||
protected List<Affiliation> items = Collections.emptyList();
|
||||
private final String node;
|
||||
|
||||
public AffiliationsExtension() {
|
||||
this(null, null);
|
||||
|
@ -47,20 +47,20 @@ public class AffiliationsExtension extends NodeExtension
|
|||
this.node = node;
|
||||
}
|
||||
|
||||
public List<Affiliation> getAffiliations()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
public List<Affiliation> getAffiliations()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if ((items == null) || (items.size() == 0))
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if ((items == null) || (items.size() == 0))
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Can't use XmlStringBuilder(this), because we don't want the namespace to be included
|
||||
XmlStringBuilder xml = new XmlStringBuilder();
|
||||
xml.openElement(getElementName());
|
||||
|
@ -69,6 +69,6 @@ public class AffiliationsExtension extends NodeExtension
|
|||
xml.append(items);
|
||||
xml.closeElement(this);
|
||||
return xml;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,12 +24,12 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum ChildrenAssociationPolicy
|
||||
{
|
||||
/** Anyone may associate leaf nodes with the collection. */
|
||||
all,
|
||||
/** Anyone may associate leaf nodes with the collection. */
|
||||
all,
|
||||
|
||||
/** Only collection node owners may associate leaf nodes with the collection. */
|
||||
owners,
|
||||
/** Only collection node owners may associate leaf nodes with the collection. */
|
||||
owners,
|
||||
|
||||
/** Only those on a whitelist may associate leaf nodes with the collection. */
|
||||
whitelist;
|
||||
/** Only those on a whitelist may associate leaf nodes with the collection. */
|
||||
whitelist;
|
||||
}
|
||||
|
|
|
@ -18,9 +18,9 @@ package org.jivesoftware.smackx.pubsub;
|
|||
|
||||
public class CollectionNode extends Node
|
||||
{
|
||||
CollectionNode(PubSubManager pubSubManager, String nodeId)
|
||||
{
|
||||
super(pubSubManager, nodeId);
|
||||
}
|
||||
CollectionNode(PubSubManager pubSubManager, String nodeId)
|
||||
{
|
||||
super(pubSubManager, nodeId);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -31,29 +31,29 @@ import org.jivesoftware.smack.packet.ExtensionElement;
|
|||
*/
|
||||
public class ConfigurationEvent extends NodeExtension implements EmbeddedPacketExtension
|
||||
{
|
||||
private ConfigureForm form;
|
||||
private ConfigureForm form;
|
||||
|
||||
public ConfigurationEvent(String nodeId)
|
||||
{
|
||||
super(PubSubElementType.CONFIGURATION, nodeId);
|
||||
}
|
||||
public ConfigurationEvent(String nodeId)
|
||||
{
|
||||
super(PubSubElementType.CONFIGURATION, nodeId);
|
||||
}
|
||||
|
||||
public ConfigurationEvent(String nodeId, ConfigureForm configForm)
|
||||
{
|
||||
super(PubSubElementType.CONFIGURATION, nodeId);
|
||||
form = configForm;
|
||||
}
|
||||
public ConfigurationEvent(String nodeId, ConfigureForm configForm)
|
||||
{
|
||||
super(PubSubElementType.CONFIGURATION, nodeId);
|
||||
form = configForm;
|
||||
}
|
||||
|
||||
public ConfigureForm getConfiguration()
|
||||
{
|
||||
return form;
|
||||
}
|
||||
public ConfigureForm getConfiguration()
|
||||
{
|
||||
return form;
|
||||
}
|
||||
|
||||
public List<ExtensionElement> getExtensions()
|
||||
{
|
||||
if (getConfiguration() == null)
|
||||
return Collections.emptyList();
|
||||
else
|
||||
return Arrays.asList(((ExtensionElement)getConfiguration().getDataFormToSend()));
|
||||
}
|
||||
public List<ExtensionElement> getExtensions()
|
||||
{
|
||||
if (getConfiguration() == null)
|
||||
return Collections.emptyList();
|
||||
else
|
||||
return Arrays.asList(((ExtensionElement)getConfiguration().getDataFormToSend()));
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -29,193 +29,193 @@ import org.jivesoftware.smackx.xdata.Form;
|
|||
*/
|
||||
public enum ConfigureNodeFields
|
||||
{
|
||||
/**
|
||||
* Determines who may subscribe and retrieve items.
|
||||
*
|
||||
* <p><b>Value: {@link AccessModel}</b></p>
|
||||
*/
|
||||
access_model,
|
||||
/**
|
||||
* Determines who may subscribe and retrieve items.
|
||||
*
|
||||
* <p><b>Value: {@link AccessModel}</b></p>
|
||||
*/
|
||||
access_model,
|
||||
|
||||
/**
|
||||
* The URL of an XSL transformation which can be applied to
|
||||
* payloads in order to generate an appropriate message
|
||||
* body element.
|
||||
*
|
||||
* <p><b>Value: {@link URL}</b></p>
|
||||
*/
|
||||
body_xslt,
|
||||
/**
|
||||
* The URL of an XSL transformation which can be applied to
|
||||
* payloads in order to generate an appropriate message
|
||||
* body element.
|
||||
*
|
||||
* <p><b>Value: {@link URL}</b></p>
|
||||
*/
|
||||
body_xslt,
|
||||
|
||||
/**
|
||||
* The collection with which a node is affiliated.
|
||||
*
|
||||
* <p><b>Value: String</b></p>
|
||||
*/
|
||||
collection,
|
||||
/**
|
||||
* The collection with which a node is affiliated.
|
||||
*
|
||||
* <p><b>Value: String</b></p>
|
||||
*/
|
||||
collection,
|
||||
|
||||
/**
|
||||
* The URL of an XSL transformation which can be applied to
|
||||
* payload format in order to generate a valid Data Forms result
|
||||
* that the client could display using a generic Data Forms
|
||||
* rendering engine body element.
|
||||
*
|
||||
* <p><b>Value: {@link URL}</b></p>
|
||||
*/
|
||||
dataform_xslt,
|
||||
/**
|
||||
* The URL of an XSL transformation which can be applied to
|
||||
* payload format in order to generate a valid Data Forms result
|
||||
* that the client could display using a generic Data Forms
|
||||
* rendering engine body element.
|
||||
*
|
||||
* <p><b>Value: {@link URL}</b></p>
|
||||
*/
|
||||
dataform_xslt,
|
||||
|
||||
/**
|
||||
* Whether to deliver payloads with event notifications.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
deliver_payloads,
|
||||
/**
|
||||
* Whether to deliver payloads with event notifications.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
deliver_payloads,
|
||||
|
||||
/**
|
||||
* Whether owners or publisher should receive replies to items.
|
||||
*
|
||||
* <p><b>Value: {@link ItemReply}</b></p>
|
||||
*/
|
||||
itemreply,
|
||||
/**
|
||||
* Whether owners or publisher should receive replies to items.
|
||||
*
|
||||
* <p><b>Value: {@link ItemReply}</b></p>
|
||||
*/
|
||||
itemreply,
|
||||
|
||||
/**
|
||||
* Who may associate leaf nodes with a collection.
|
||||
*
|
||||
* <p><b>Value: {@link ChildrenAssociationPolicy}</b></p>
|
||||
*/
|
||||
children_association_policy,
|
||||
/**
|
||||
* Who may associate leaf nodes with a collection.
|
||||
*
|
||||
* <p><b>Value: {@link ChildrenAssociationPolicy}</b></p>
|
||||
*/
|
||||
children_association_policy,
|
||||
|
||||
/**
|
||||
* The list of JIDs that may associate leaf nodes with a
|
||||
* collection.
|
||||
*
|
||||
* <p><b>Value: List of JIDs as Strings</b></p>
|
||||
*/
|
||||
children_association_whitelist,
|
||||
/**
|
||||
* The list of JIDs that may associate leaf nodes with a
|
||||
* collection.
|
||||
*
|
||||
* <p><b>Value: List of JIDs as Strings</b></p>
|
||||
*/
|
||||
children_association_whitelist,
|
||||
|
||||
/**
|
||||
* The child nodes (leaf or collection) associated with a collection.
|
||||
*
|
||||
* <p><b>Value: List of Strings</b></p>
|
||||
*/
|
||||
children,
|
||||
/**
|
||||
* The child nodes (leaf or collection) associated with a collection.
|
||||
*
|
||||
* <p><b>Value: List of Strings</b></p>
|
||||
*/
|
||||
children,
|
||||
|
||||
/**
|
||||
* The maximum number of child nodes that can be associated with a
|
||||
* collection.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
children_max,
|
||||
/**
|
||||
* The maximum number of child nodes that can be associated with a
|
||||
* collection.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
children_max,
|
||||
|
||||
/**
|
||||
* The maximum number of items to persist.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
max_items,
|
||||
/**
|
||||
* The maximum number of items to persist.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
max_items,
|
||||
|
||||
/**
|
||||
* The maximum payload size in bytes.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
max_payload_size,
|
||||
/**
|
||||
* The maximum payload size in bytes.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
max_payload_size,
|
||||
|
||||
/**
|
||||
* Whether the node is a leaf (default) or collection.
|
||||
*
|
||||
* <p><b>Value: {@link NodeType}</b></p>
|
||||
*/
|
||||
node_type,
|
||||
/**
|
||||
* Whether the node is a leaf (default) or collection.
|
||||
*
|
||||
* <p><b>Value: {@link NodeType}</b></p>
|
||||
*/
|
||||
node_type,
|
||||
|
||||
/**
|
||||
* Whether to notify subscribers when the node configuration changes.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
notify_config,
|
||||
/**
|
||||
* Whether to notify subscribers when the node configuration changes.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
notify_config,
|
||||
|
||||
/**
|
||||
* Whether to notify subscribers when the node is deleted.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
notify_delete,
|
||||
/**
|
||||
* Whether to notify subscribers when the node is deleted.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
notify_delete,
|
||||
|
||||
/**
|
||||
* Whether to notify subscribers when items are removed from the node.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
notify_retract,
|
||||
/**
|
||||
* Whether to notify subscribers when items are removed from the node.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
notify_retract,
|
||||
|
||||
/**
|
||||
* Whether to persist items to storage. This is required to have. multiple
|
||||
* items in the node.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
persist_items,
|
||||
/**
|
||||
* Whether to persist items to storage. This is required to have. multiple
|
||||
* items in the node.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
persist_items,
|
||||
|
||||
/**
|
||||
* Whether to deliver notifications to available users only.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
presence_based_delivery,
|
||||
/**
|
||||
* Whether to deliver notifications to available users only.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
presence_based_delivery,
|
||||
|
||||
/**
|
||||
* Defines who can publish to the node.
|
||||
*
|
||||
* <p><b>Value: {@link PublishModel}</b></p>
|
||||
*/
|
||||
publish_model,
|
||||
/**
|
||||
* Defines who can publish to the node.
|
||||
*
|
||||
* <p><b>Value: {@link PublishModel}</b></p>
|
||||
*/
|
||||
publish_model,
|
||||
|
||||
/**
|
||||
* The specific multi-user chat rooms to specify for replyroom.
|
||||
*
|
||||
* <p><b>Value: List of JIDs as Strings</b></p>
|
||||
*/
|
||||
replyroom,
|
||||
/**
|
||||
* The specific multi-user chat rooms to specify for replyroom.
|
||||
*
|
||||
* <p><b>Value: List of JIDs as Strings</b></p>
|
||||
*/
|
||||
replyroom,
|
||||
|
||||
/**
|
||||
* The specific JID(s) to specify for replyto.
|
||||
*
|
||||
* <p><b>Value: List of JIDs as Strings</b></p>
|
||||
*/
|
||||
replyto,
|
||||
/**
|
||||
* The specific JID(s) to specify for replyto.
|
||||
*
|
||||
* <p><b>Value: List of JIDs as Strings</b></p>
|
||||
*/
|
||||
replyto,
|
||||
|
||||
/**
|
||||
* The roster group(s) allowed to subscribe and retrieve items.
|
||||
*
|
||||
* <p><b>Value: List of strings</b></p>
|
||||
*/
|
||||
roster_groups_allowed,
|
||||
/**
|
||||
* The roster group(s) allowed to subscribe and retrieve items.
|
||||
*
|
||||
* <p><b>Value: List of strings</b></p>
|
||||
*/
|
||||
roster_groups_allowed,
|
||||
|
||||
/**
|
||||
* Whether to allow subscriptions.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
subscribe,
|
||||
/**
|
||||
* Whether to allow subscriptions.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
subscribe,
|
||||
|
||||
/**
|
||||
* A friendly name for the node.
|
||||
*
|
||||
* <p><b>Value: String</b></p>
|
||||
*/
|
||||
title,
|
||||
/**
|
||||
* A friendly name for the node.
|
||||
*
|
||||
* <p><b>Value: String</b></p>
|
||||
*/
|
||||
title,
|
||||
|
||||
/**
|
||||
* The type of node data, ussually specified by the namespace
|
||||
* of the payload(if any);MAY be a list-single rather than a
|
||||
* text single.
|
||||
*
|
||||
* <p><b>Value: String</b></p>
|
||||
*/
|
||||
type;
|
||||
/**
|
||||
* The type of node data, ussually specified by the namespace
|
||||
* of the payload(if any);MAY be a list-single rather than a
|
||||
* text single.
|
||||
*
|
||||
* <p><b>Value: String</b></p>
|
||||
*/
|
||||
type;
|
||||
|
||||
public String getFieldName()
|
||||
{
|
||||
return "pubsub#" + toString();
|
||||
}
|
||||
public String getFieldName()
|
||||
{
|
||||
return "pubsub#" + toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,10 +39,10 @@ import org.jivesoftware.smack.util.PacketParserUtils;
|
|||
*/
|
||||
public interface EmbeddedPacketExtension extends ExtensionElement
|
||||
{
|
||||
/**
|
||||
* Get the list of embedded {@link ExtensionElement} objects.
|
||||
*
|
||||
* @return List of embedded {@link ExtensionElement}
|
||||
*/
|
||||
List<ExtensionElement> getExtensions();
|
||||
/**
|
||||
* Get the list of embedded {@link ExtensionElement} objects.
|
||||
*
|
||||
* @return List of embedded {@link ExtensionElement}
|
||||
*/
|
||||
List<ExtensionElement> getExtensions();
|
||||
}
|
||||
|
|
|
@ -44,39 +44,39 @@ public class EventElement implements EmbeddedPacketExtension
|
|||
*/
|
||||
public static final String NAMESPACE = PubSubNamespace.EVENT.getXmlns();
|
||||
|
||||
private EventElementType type;
|
||||
private NodeExtension ext;
|
||||
private EventElementType type;
|
||||
private NodeExtension ext;
|
||||
|
||||
public EventElement(EventElementType eventType, NodeExtension eventExt)
|
||||
{
|
||||
type = eventType;
|
||||
ext = eventExt;
|
||||
}
|
||||
public EventElement(EventElementType eventType, NodeExtension eventExt)
|
||||
{
|
||||
type = eventType;
|
||||
ext = eventExt;
|
||||
}
|
||||
|
||||
public EventElementType getEventType()
|
||||
{
|
||||
return type;
|
||||
}
|
||||
public EventElementType getEventType()
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
public List<ExtensionElement> getExtensions()
|
||||
{
|
||||
return Arrays.asList(new ExtensionElement[]{getEvent()});
|
||||
}
|
||||
public List<ExtensionElement> getExtensions()
|
||||
{
|
||||
return Arrays.asList(new ExtensionElement[]{getEvent()});
|
||||
}
|
||||
|
||||
public NodeExtension getEvent()
|
||||
{
|
||||
return ext;
|
||||
}
|
||||
public NodeExtension getEvent()
|
||||
{
|
||||
return ext;
|
||||
}
|
||||
|
||||
public String getElementName()
|
||||
{
|
||||
return "event";
|
||||
}
|
||||
public String getElementName()
|
||||
{
|
||||
return "event";
|
||||
}
|
||||
|
||||
public String getNamespace()
|
||||
{
|
||||
return PubSubNamespace.EVENT.getXmlns();
|
||||
}
|
||||
public String getNamespace()
|
||||
{
|
||||
return PubSubNamespace.EVENT.getXmlns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public XmlStringBuilder toXML() {
|
||||
|
|
|
@ -24,21 +24,21 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum EventElementType
|
||||
{
|
||||
/** A node has been associated or dissassociated with a collection node. */
|
||||
collection,
|
||||
/** A node has been associated or dissassociated with a collection node. */
|
||||
collection,
|
||||
|
||||
/** A node has had its configuration changed. */
|
||||
configuration,
|
||||
/** A node has had its configuration changed. */
|
||||
configuration,
|
||||
|
||||
/** A node has been deleted. */
|
||||
delete,
|
||||
/** A node has been deleted. */
|
||||
delete,
|
||||
|
||||
/** Items have been published to a node. */
|
||||
items,
|
||||
/** Items have been published to a node. */
|
||||
items,
|
||||
|
||||
/** All items have been purged from a node. */
|
||||
purge,
|
||||
/** All items have been purged from a node. */
|
||||
purge,
|
||||
|
||||
/** A node has been subscribed to. */
|
||||
subscription
|
||||
/** A node has been subscribed to. */
|
||||
subscription
|
||||
}
|
||||
|
|
|
@ -28,75 +28,75 @@ import org.jivesoftware.smackx.xdata.Form;
|
|||
*/
|
||||
public class FormNode extends NodeExtension
|
||||
{
|
||||
private Form configForm;
|
||||
private Form configForm;
|
||||
|
||||
/**
|
||||
* Create a {@link FormNode} which contains the specified form.
|
||||
*
|
||||
* @param formType The type of form being sent
|
||||
* @param submitForm The form
|
||||
*/
|
||||
public FormNode(FormNodeType formType, Form submitForm)
|
||||
{
|
||||
super(formType.getNodeElement());
|
||||
/**
|
||||
* Create a {@link FormNode} which contains the specified form.
|
||||
*
|
||||
* @param formType The type of form being sent
|
||||
* @param submitForm The form
|
||||
*/
|
||||
public FormNode(FormNodeType formType, Form submitForm)
|
||||
{
|
||||
super(formType.getNodeElement());
|
||||
|
||||
if (submitForm == null)
|
||||
throw new IllegalArgumentException("Submit form cannot be null");
|
||||
configForm = submitForm;
|
||||
}
|
||||
if (submitForm == null)
|
||||
throw new IllegalArgumentException("Submit form cannot be null");
|
||||
configForm = submitForm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a {@link FormNode} which contains the specified form, which is
|
||||
* associated with the specified node.
|
||||
*
|
||||
* @param formType The type of form being sent
|
||||
* @param nodeId The node the form is associated with
|
||||
* @param submitForm The form
|
||||
*/
|
||||
public FormNode(FormNodeType formType, String nodeId, Form submitForm)
|
||||
{
|
||||
super(formType.getNodeElement(), nodeId);
|
||||
/**
|
||||
* Create a {@link FormNode} which contains the specified form, which is
|
||||
* associated with the specified node.
|
||||
*
|
||||
* @param formType The type of form being sent
|
||||
* @param nodeId The node the form is associated with
|
||||
* @param submitForm The form
|
||||
*/
|
||||
public FormNode(FormNodeType formType, String nodeId, Form submitForm)
|
||||
{
|
||||
super(formType.getNodeElement(), nodeId);
|
||||
|
||||
if (submitForm == null)
|
||||
throw new IllegalArgumentException("Submit form cannot be null");
|
||||
configForm = submitForm;
|
||||
}
|
||||
if (submitForm == null)
|
||||
throw new IllegalArgumentException("Submit form cannot be null");
|
||||
configForm = submitForm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Form that is to be sent, or was retrieved from the server.
|
||||
*
|
||||
* @return The form
|
||||
*/
|
||||
public Form getForm()
|
||||
{
|
||||
return configForm;
|
||||
}
|
||||
/**
|
||||
* Get the Form that is to be sent, or was retrieved from the server.
|
||||
*
|
||||
* @return The form
|
||||
*/
|
||||
public Form getForm()
|
||||
{
|
||||
return configForm;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if (configForm == null)
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if (configForm == null)
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
|
||||
if (getNode() != null)
|
||||
{
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append("'>");
|
||||
}
|
||||
else
|
||||
builder.append('>');
|
||||
builder.append(configForm.getDataFormToSend().toXML());
|
||||
builder.append("</");
|
||||
builder.append(getElementName() + '>');
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
if (getNode() != null)
|
||||
{
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append("'>");
|
||||
}
|
||||
else
|
||||
builder.append('>');
|
||||
builder.append(configForm.getDataFormToSend().toXML());
|
||||
builder.append("</");
|
||||
builder.append(getElementName() + '>');
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -27,29 +27,29 @@ import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace;
|
|||
*/
|
||||
public enum FormNodeType
|
||||
{
|
||||
/** Form for configuring an existing node. */
|
||||
CONFIGURE_OWNER,
|
||||
/** Form for configuring an existing node. */
|
||||
CONFIGURE_OWNER,
|
||||
|
||||
/** Form for configuring a node during creation. */
|
||||
CONFIGURE,
|
||||
/** Form for configuring a node during creation. */
|
||||
CONFIGURE,
|
||||
|
||||
/** Form for configuring subscription options. */
|
||||
OPTIONS,
|
||||
/** Form for configuring subscription options. */
|
||||
OPTIONS,
|
||||
|
||||
/** Form which represents the default node configuration options. */
|
||||
DEFAULT;
|
||||
/** Form which represents the default node configuration options. */
|
||||
DEFAULT;
|
||||
|
||||
public PubSubElementType getNodeElement()
|
||||
{
|
||||
return PubSubElementType.valueOf(toString());
|
||||
}
|
||||
public PubSubElementType getNodeElement()
|
||||
{
|
||||
return PubSubElementType.valueOf(toString());
|
||||
}
|
||||
|
||||
public static FormNodeType valueOfFromElementName(String elem, String configNamespace)
|
||||
{
|
||||
if ("configure".equals(elem) && PubSubNamespace.OWNER.getXmlns().equals(configNamespace))
|
||||
{
|
||||
return CONFIGURE_OWNER;
|
||||
}
|
||||
return valueOf(elem.toUpperCase(Locale.US));
|
||||
}
|
||||
public static FormNodeType valueOfFromElementName(String elem, String configNamespace)
|
||||
{
|
||||
if ("configure".equals(elem) && PubSubNamespace.OWNER.getXmlns().equals(configNamespace))
|
||||
{
|
||||
return CONFIGURE_OWNER;
|
||||
}
|
||||
return valueOf(elem.toUpperCase(Locale.US));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,42 +25,42 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
*/
|
||||
public class GetItemsRequest extends NodeExtension
|
||||
{
|
||||
protected final String subId;
|
||||
protected final int maxItems;
|
||||
protected final String subId;
|
||||
protected final int maxItems;
|
||||
|
||||
public GetItemsRequest(String nodeId)
|
||||
{
|
||||
this(nodeId, null, -1);
|
||||
}
|
||||
public GetItemsRequest(String nodeId)
|
||||
{
|
||||
this(nodeId, null, -1);
|
||||
}
|
||||
|
||||
public GetItemsRequest(String nodeId, String subscriptionId)
|
||||
{
|
||||
public GetItemsRequest(String nodeId, String subscriptionId)
|
||||
{
|
||||
this(nodeId, subscriptionId, -1);
|
||||
}
|
||||
}
|
||||
|
||||
public GetItemsRequest(String nodeId, int maxItemsToReturn)
|
||||
{
|
||||
public GetItemsRequest(String nodeId, int maxItemsToReturn)
|
||||
{
|
||||
this(nodeId, null, maxItemsToReturn);
|
||||
}
|
||||
}
|
||||
|
||||
public GetItemsRequest(String nodeId, String subscriptionId, int maxItemsToReturn)
|
||||
{
|
||||
public GetItemsRequest(String nodeId, String subscriptionId, int maxItemsToReturn)
|
||||
{
|
||||
super(PubSubElementType.ITEMS, nodeId);
|
||||
maxItems = maxItemsToReturn;
|
||||
subId = subscriptionId;
|
||||
}
|
||||
subId = subscriptionId;
|
||||
}
|
||||
|
||||
public String getSubscriptionId()
|
||||
{
|
||||
return subId;
|
||||
}
|
||||
public String getSubscriptionId()
|
||||
{
|
||||
return subId;
|
||||
}
|
||||
|
||||
public int getMaxItems()
|
||||
{
|
||||
return maxItems;
|
||||
}
|
||||
public int getMaxItems()
|
||||
{
|
||||
return maxItems;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public XmlStringBuilder toXML() {
|
||||
XmlStringBuilder xml = new XmlStringBuilder();
|
||||
xml.halfOpenElement(getElementName());
|
||||
|
|
|
@ -50,94 +50,92 @@ import org.jivesoftware.smackx.pubsub.provider.ItemProvider;
|
|||
*/
|
||||
public class Item extends NodeExtension
|
||||
{
|
||||
private String id;
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* Create an empty <tt>Item</tt> with no id. This is a valid item for nodes which are configured
|
||||
* so that {@link ConfigureForm#isDeliverPayloads()} is false. In most cases an id will be generated by the server.
|
||||
* For nodes configured with {@link ConfigureForm#isDeliverPayloads()} and {@link ConfigureForm#isPersistItems()}
|
||||
* set to false, no <tt>Item</tt> is sent to the node, you have to use {@link LeafNode#send()} or {@link LeafNode#publish()}
|
||||
* methods in this case.
|
||||
*/
|
||||
public Item()
|
||||
{
|
||||
super(PubSubElementType.ITEM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id but no payload. This is a valid item for nodes which are configured
|
||||
* so that {@link ConfigureForm#isDeliverPayloads()} is false.
|
||||
*
|
||||
* @param itemId The id if the item. It must be unique within the node unless overwriting and existing item.
|
||||
* Passing null is the equivalent of calling {@link #Item()}.
|
||||
*/
|
||||
public Item(String itemId)
|
||||
{
|
||||
// The element type is actually irrelevant since we override getNamespace() to return null
|
||||
super(PubSubElementType.ITEM);
|
||||
id = itemId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id and a node id.
|
||||
* <p>
|
||||
* <b>Note:</b> This is not valid for publishing an item to a node, only receiving from
|
||||
* one as part of {@link Message}. If used to create an Item to publish
|
||||
* (via {@link LeafNode#publish(Item)}, the server <i>may</i> return an
|
||||
* error for an invalid packet.
|
||||
*
|
||||
* @param itemId The id of the item.
|
||||
* @param nodeId The id of the node which the item was published to.
|
||||
*/
|
||||
public Item(String itemId, String nodeId)
|
||||
/**
|
||||
* Create an empty <tt>Item</tt> with no id. This is a valid item for nodes which are configured
|
||||
* so that {@link ConfigureForm#isDeliverPayloads()} is false. In most cases an id will be generated by the server.
|
||||
* For nodes configured with {@link ConfigureForm#isDeliverPayloads()} and {@link ConfigureForm#isPersistItems()}
|
||||
* set to false, no <tt>Item</tt> is sent to the node, you have to use {@link LeafNode#send()} or {@link LeafNode#publish()}
|
||||
* methods in this case.
|
||||
*/
|
||||
public Item()
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
super(PubSubElementType.ITEM_EVENT, nodeId);
|
||||
// CHECKSTYLE:ON
|
||||
super(PubSubElementType.ITEM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id but no payload. This is a valid item for nodes which are configured
|
||||
* so that {@link ConfigureForm#isDeliverPayloads()} is false.
|
||||
*
|
||||
* @param itemId The id if the item. It must be unique within the node unless overwriting and existing item.
|
||||
* Passing null is the equivalent of calling {@link #Item()}.
|
||||
*/
|
||||
public Item(String itemId)
|
||||
{
|
||||
// The element type is actually irrelevant since we override getNamespace() to return null
|
||||
super(PubSubElementType.ITEM);
|
||||
id = itemId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the item id. Unique to the node it is associated with.
|
||||
*
|
||||
* @return The id
|
||||
*/
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id and a node id.
|
||||
* <p>
|
||||
* <b>Note:</b> This is not valid for publishing an item to a node, only receiving from
|
||||
* one as part of {@link Message}. If used to create an Item to publish
|
||||
* (via {@link LeafNode#publish(Item)}, the server <i>may</i> return an
|
||||
* error for an invalid packet.
|
||||
*
|
||||
* @param itemId The id of the item.
|
||||
* @param nodeId The id of the node which the item was published to.
|
||||
*/
|
||||
public Item(String itemId, String nodeId)
|
||||
{
|
||||
super(PubSubElementType.ITEM_EVENT, nodeId);
|
||||
id = itemId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getNamespace()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
/**
|
||||
* Get the item id. Unique to the node it is associated with.
|
||||
*
|
||||
* @return The id
|
||||
*/
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<item");
|
||||
@Override
|
||||
public String getNamespace()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (id != null)
|
||||
{
|
||||
builder.append(" id='");
|
||||
builder.append(id);
|
||||
builder.append('\'');
|
||||
}
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<item");
|
||||
|
||||
if (id != null)
|
||||
{
|
||||
builder.append(" id='");
|
||||
builder.append(id);
|
||||
builder.append('\'');
|
||||
}
|
||||
|
||||
if (getNode() != null) {
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append('\'');
|
||||
}
|
||||
builder.append("/>");
|
||||
builder.append("/>");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " | Content [" + toXML() + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " | Content [" + toXML() + "]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,40 +26,40 @@ import java.util.List;
|
|||
*/
|
||||
public class ItemDeleteEvent extends SubscriptionEvent
|
||||
{
|
||||
private List<String> itemIds = Collections.emptyList();
|
||||
private List<String> itemIds = Collections.emptyList();
|
||||
|
||||
/**
|
||||
* Constructs an <tt>ItemDeleteEvent</tt> that indicates the the supplied
|
||||
* items (by id) have been deleted, and that the event matches the listed
|
||||
* subscriptions. The subscriptions would have been created by calling
|
||||
* {@link LeafNode#subscribe(String)}.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param deletedItemIds The item ids of the items that were deleted.
|
||||
* @param subscriptionIds The subscriptions that match the event.
|
||||
*/
|
||||
public ItemDeleteEvent(String nodeId, List<String> deletedItemIds, List<String> subscriptionIds)
|
||||
{
|
||||
super(nodeId, subscriptionIds);
|
||||
/**
|
||||
* Constructs an <tt>ItemDeleteEvent</tt> that indicates the the supplied
|
||||
* items (by id) have been deleted, and that the event matches the listed
|
||||
* subscriptions. The subscriptions would have been created by calling
|
||||
* {@link LeafNode#subscribe(String)}.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param deletedItemIds The item ids of the items that were deleted.
|
||||
* @param subscriptionIds The subscriptions that match the event.
|
||||
*/
|
||||
public ItemDeleteEvent(String nodeId, List<String> deletedItemIds, List<String> subscriptionIds)
|
||||
{
|
||||
super(nodeId, subscriptionIds);
|
||||
|
||||
if (deletedItemIds == null)
|
||||
throw new IllegalArgumentException("deletedItemIds cannot be null");
|
||||
itemIds = deletedItemIds;
|
||||
}
|
||||
if (deletedItemIds == null)
|
||||
throw new IllegalArgumentException("deletedItemIds cannot be null");
|
||||
itemIds = deletedItemIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the item id's of the items that have been deleted.
|
||||
*
|
||||
* @return List of item id's
|
||||
*/
|
||||
public List<String> getItemIds()
|
||||
{
|
||||
return Collections.unmodifiableList(itemIds);
|
||||
}
|
||||
/**
|
||||
* Get the item id's of the items that have been deleted.
|
||||
*
|
||||
* @return List of item id's
|
||||
*/
|
||||
public List<String> getItemIds()
|
||||
{
|
||||
return Collections.unmodifiableList(itemIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " [subscriptions: " + getSubscriptions() + "], [Deleted Items: " + itemIds + ']';
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " [subscriptions: " + getSubscriptions() + "], [Deleted Items: " + itemIds + ']';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,98 +27,98 @@ import java.util.List;
|
|||
*/
|
||||
public class ItemPublishEvent<T extends Item> extends SubscriptionEvent
|
||||
{
|
||||
private List<T> items;
|
||||
private Date originalDate;
|
||||
private List<T> items;
|
||||
private Date originalDate;
|
||||
|
||||
/**
|
||||
* Constructs an <tt>ItemPublishEvent</tt> with the provided list
|
||||
* of {@link Item} that were published.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param eventItems The list of {@link Item} that were published
|
||||
*/
|
||||
public ItemPublishEvent(String nodeId, List<T> eventItems)
|
||||
{
|
||||
super(nodeId);
|
||||
items = eventItems;
|
||||
}
|
||||
/**
|
||||
* Constructs an <tt>ItemPublishEvent</tt> with the provided list
|
||||
* of {@link Item} that were published.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param eventItems The list of {@link Item} that were published
|
||||
*/
|
||||
public ItemPublishEvent(String nodeId, List<T> eventItems)
|
||||
{
|
||||
super(nodeId);
|
||||
items = eventItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an <tt>ItemPublishEvent</tt> with the provided list
|
||||
* of {@link Item} that were published. The list of subscription ids
|
||||
* represents the subscriptions that matched the event, in the case
|
||||
* of the user having multiple subscriptions.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param eventItems The list of {@link Item} that were published
|
||||
* @param subscriptionIds The list of subscriptionIds
|
||||
*/
|
||||
public ItemPublishEvent(String nodeId, List<T> eventItems, List<String> subscriptionIds)
|
||||
{
|
||||
super(nodeId, subscriptionIds);
|
||||
items = eventItems;
|
||||
}
|
||||
/**
|
||||
* Constructs an <tt>ItemPublishEvent</tt> with the provided list
|
||||
* of {@link Item} that were published. The list of subscription ids
|
||||
* represents the subscriptions that matched the event, in the case
|
||||
* of the user having multiple subscriptions.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param eventItems The list of {@link Item} that were published
|
||||
* @param subscriptionIds The list of subscriptionIds
|
||||
*/
|
||||
public ItemPublishEvent(String nodeId, List<T> eventItems, List<String> subscriptionIds)
|
||||
{
|
||||
super(nodeId, subscriptionIds);
|
||||
items = eventItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an <tt>ItemPublishEvent</tt> with the provided list
|
||||
* of {@link Item} that were published in the past. The published
|
||||
* date signifies that this is delayed event. The list of subscription ids
|
||||
* represents the subscriptions that matched the event, in the case
|
||||
* of the user having multiple subscriptions.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param eventItems The list of {@link Item} that were published
|
||||
* @param subscriptionIds The list of subscriptionIds
|
||||
*/
|
||||
public ItemPublishEvent(String nodeId, List<T> eventItems, List<String> subscriptionIds, Date publishedDate)
|
||||
{
|
||||
super(nodeId, subscriptionIds);
|
||||
items = eventItems;
|
||||
/**
|
||||
* Constructs an <tt>ItemPublishEvent</tt> with the provided list
|
||||
* of {@link Item} that were published in the past. The published
|
||||
* date signifies that this is delayed event. The list of subscription ids
|
||||
* represents the subscriptions that matched the event, in the case
|
||||
* of the user having multiple subscriptions.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param eventItems The list of {@link Item} that were published
|
||||
* @param subscriptionIds The list of subscriptionIds
|
||||
*/
|
||||
public ItemPublishEvent(String nodeId, List<T> eventItems, List<String> subscriptionIds, Date publishedDate)
|
||||
{
|
||||
super(nodeId, subscriptionIds);
|
||||
items = eventItems;
|
||||
|
||||
if (publishedDate != null)
|
||||
originalDate = publishedDate;
|
||||
}
|
||||
if (publishedDate != null)
|
||||
originalDate = publishedDate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of {@link Item} that were published.
|
||||
*
|
||||
* @return The list of published {@link Item}
|
||||
*/
|
||||
public List<T> getItems()
|
||||
{
|
||||
return Collections.unmodifiableList(items);
|
||||
}
|
||||
/**
|
||||
* Get the list of {@link Item} that were published.
|
||||
*
|
||||
* @return The list of published {@link Item}
|
||||
*/
|
||||
public List<T> getItems()
|
||||
{
|
||||
return Collections.unmodifiableList(items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether this event was delayed. That is, the items
|
||||
* were published to the node at some time in the past. This will
|
||||
* typically happen if there is an item already published to the node
|
||||
* before a user subscribes to it. In this case, when the user
|
||||
* subscribes, the server may send the last item published to the node
|
||||
* with a delay date showing its time of original publication.
|
||||
*
|
||||
* @return true if the items are delayed, false otherwise.
|
||||
*/
|
||||
public boolean isDelayed()
|
||||
{
|
||||
return (originalDate != null);
|
||||
}
|
||||
/**
|
||||
* Indicates whether this event was delayed. That is, the items
|
||||
* were published to the node at some time in the past. This will
|
||||
* typically happen if there is an item already published to the node
|
||||
* before a user subscribes to it. In this case, when the user
|
||||
* subscribes, the server may send the last item published to the node
|
||||
* with a delay date showing its time of original publication.
|
||||
*
|
||||
* @return true if the items are delayed, false otherwise.
|
||||
*/
|
||||
public boolean isDelayed()
|
||||
{
|
||||
return (originalDate != null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the original date the items were published. This is only
|
||||
* valid if {@link #isDelayed()} is true.
|
||||
*
|
||||
*/
|
||||
public Date getPublishedDate()
|
||||
{
|
||||
return originalDate;
|
||||
}
|
||||
/**
|
||||
* Gets the original date the items were published. This is only
|
||||
* valid if {@link #isDelayed()} is true.
|
||||
*
|
||||
*/
|
||||
public Date getPublishedDate()
|
||||
{
|
||||
return originalDate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " [subscriptions: " + getSubscriptions() + "], [Delayed: " +
|
||||
(isDelayed() ? originalDate.toString() : "false") + ']';
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " [subscriptions: " + getSubscriptions() + "], [Delayed: " +
|
||||
(isDelayed() ? originalDate.toString() : "false") + ']';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,9 +24,9 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum ItemReply
|
||||
{
|
||||
/** The node owner. */
|
||||
owner,
|
||||
/** The node owner. */
|
||||
owner,
|
||||
|
||||
/** The item publisher. */
|
||||
publisher;
|
||||
/** The item publisher. */
|
||||
publisher;
|
||||
}
|
||||
|
|
|
@ -36,168 +36,168 @@ import org.jivesoftware.smack.packet.ExtensionElement;
|
|||
*/
|
||||
public class ItemsExtension extends NodeExtension implements EmbeddedPacketExtension
|
||||
{
|
||||
protected ItemsElementType type;
|
||||
protected Boolean notify;
|
||||
protected List<? extends ExtensionElement> items;
|
||||
protected ItemsElementType type;
|
||||
protected Boolean notify;
|
||||
protected List<? extends ExtensionElement> items;
|
||||
|
||||
public enum ItemsElementType
|
||||
{
|
||||
/** An items element, which has an optional <b>max_items</b> attribute when requesting items. */
|
||||
items(PubSubElementType.ITEMS, "max_items"),
|
||||
public enum ItemsElementType
|
||||
{
|
||||
/** An items element, which has an optional <b>max_items</b> attribute when requesting items. */
|
||||
items(PubSubElementType.ITEMS, "max_items"),
|
||||
|
||||
/** A retract element, which has an optional <b>notify</b> attribute when publishing deletions. */
|
||||
retract(PubSubElementType.RETRACT, "notify");
|
||||
/** A retract element, which has an optional <b>notify</b> attribute when publishing deletions. */
|
||||
retract(PubSubElementType.RETRACT, "notify");
|
||||
|
||||
private PubSubElementType elem;
|
||||
private String att;
|
||||
private PubSubElementType elem;
|
||||
private String att;
|
||||
|
||||
private ItemsElementType(PubSubElementType nodeElement, String attribute)
|
||||
{
|
||||
elem = nodeElement;
|
||||
att = attribute;
|
||||
}
|
||||
private ItemsElementType(PubSubElementType nodeElement, String attribute)
|
||||
{
|
||||
elem = nodeElement;
|
||||
att = attribute;
|
||||
}
|
||||
|
||||
public PubSubElementType getNodeElement()
|
||||
{
|
||||
return elem;
|
||||
}
|
||||
public PubSubElementType getNodeElement()
|
||||
{
|
||||
return elem;
|
||||
}
|
||||
|
||||
public String getElementAttribute()
|
||||
{
|
||||
return att;
|
||||
}
|
||||
}
|
||||
public String getElementAttribute()
|
||||
{
|
||||
return att;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an instance with a list representing items that have been published or deleted.
|
||||
*
|
||||
* <p>Valid scenarios are:</p>
|
||||
* <ul>
|
||||
* <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an
|
||||
* optional value for the <b>max_items</b> attribute.
|
||||
* <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing
|
||||
* only id's and an optional value for the <b>notify</b> attribute.
|
||||
* <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and
|
||||
* attributeValue = <code>null</code>
|
||||
* <li>Items deleted event - itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and
|
||||
* attributeValue = <code>null</code>
|
||||
* </ul>
|
||||
*
|
||||
* @param itemsType Type of representation
|
||||
* @param nodeId The node to which the items are being sent or deleted
|
||||
* @param items The list of {@link Item} or {@link RetractItem}
|
||||
*/
|
||||
public ItemsExtension(ItemsElementType itemsType, String nodeId, List<? extends ExtensionElement> items)
|
||||
{
|
||||
super(itemsType.getNodeElement(), nodeId);
|
||||
type = itemsType;
|
||||
this.items = items;
|
||||
}
|
||||
/**
|
||||
* Construct an instance with a list representing items that have been published or deleted.
|
||||
*
|
||||
* <p>Valid scenarios are:</p>
|
||||
* <ul>
|
||||
* <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an
|
||||
* optional value for the <b>max_items</b> attribute.
|
||||
* <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing
|
||||
* only id's and an optional value for the <b>notify</b> attribute.
|
||||
* <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and
|
||||
* attributeValue = <code>null</code>
|
||||
* <li>Items deleted event - itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and
|
||||
* attributeValue = <code>null</code>
|
||||
* </ul>
|
||||
*
|
||||
* @param itemsType Type of representation
|
||||
* @param nodeId The node to which the items are being sent or deleted
|
||||
* @param items The list of {@link Item} or {@link RetractItem}
|
||||
*/
|
||||
public ItemsExtension(ItemsElementType itemsType, String nodeId, List<? extends ExtensionElement> items)
|
||||
{
|
||||
super(itemsType.getNodeElement(), nodeId);
|
||||
type = itemsType;
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an instance with a list representing items that have been published or deleted.
|
||||
*
|
||||
* <p>Valid scenarios are:</p>
|
||||
* <ul>
|
||||
* <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an
|
||||
* optional value for the <b>max_items</b> attribute.
|
||||
* <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing
|
||||
* only id's and an optional value for the <b>notify</b> attribute.
|
||||
* <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and
|
||||
* attributeValue = <code>null</code>
|
||||
* <li>Items deleted event - itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and
|
||||
* attributeValue = <code>null</code>
|
||||
* </ul>
|
||||
*
|
||||
* @param nodeId The node to which the items are being sent or deleted
|
||||
* @param items The list of {@link Item} or {@link RetractItem}
|
||||
*/
|
||||
public ItemsExtension(String nodeId, List<? extends ExtensionElement> items, boolean notify)
|
||||
{
|
||||
super(ItemsElementType.retract.getNodeElement(), nodeId);
|
||||
type = ItemsElementType.retract;
|
||||
this.items = items;
|
||||
this.notify = notify;
|
||||
}
|
||||
/**
|
||||
* Construct an instance with a list representing items that have been published or deleted.
|
||||
*
|
||||
* <p>Valid scenarios are:</p>
|
||||
* <ul>
|
||||
* <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an
|
||||
* optional value for the <b>max_items</b> attribute.
|
||||
* <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing
|
||||
* only id's and an optional value for the <b>notify</b> attribute.
|
||||
* <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and
|
||||
* attributeValue = <code>null</code>
|
||||
* <li>Items deleted event - itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and
|
||||
* attributeValue = <code>null</code>
|
||||
* </ul>
|
||||
*
|
||||
* @param nodeId The node to which the items are being sent or deleted
|
||||
* @param items The list of {@link Item} or {@link RetractItem}
|
||||
*/
|
||||
public ItemsExtension(String nodeId, List<? extends ExtensionElement> items, boolean notify)
|
||||
{
|
||||
super(ItemsElementType.retract.getNodeElement(), nodeId);
|
||||
type = ItemsElementType.retract;
|
||||
this.items = items;
|
||||
this.notify = notify;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type of element.
|
||||
*
|
||||
* @return The element type
|
||||
*/
|
||||
public ItemsElementType getItemsElementType()
|
||||
{
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
* Get the type of element.
|
||||
*
|
||||
* @return The element type
|
||||
*/
|
||||
public ItemsElementType getItemsElementType()
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<ExtensionElement> getExtensions()
|
||||
{
|
||||
return (List<ExtensionElement>)getItems();
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
public List<ExtensionElement> getExtensions()
|
||||
{
|
||||
return (List<ExtensionElement>)getItems();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the items related to the type of request or event.
|
||||
*
|
||||
* return List of {@link Item}, {@link RetractItem}, or null
|
||||
*/
|
||||
public List<? extends ExtensionElement> getItems()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
/**
|
||||
* Gets the items related to the type of request or event.
|
||||
*
|
||||
* return List of {@link Item}, {@link RetractItem}, or null
|
||||
*/
|
||||
public List<? extends ExtensionElement> getItems()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of the optional attribute related to the {@link ItemsElementType}.
|
||||
*
|
||||
* @return The attribute value
|
||||
*/
|
||||
public boolean getNotify()
|
||||
{
|
||||
return notify;
|
||||
}
|
||||
/**
|
||||
* Gets the value of the optional attribute related to the {@link ItemsElementType}.
|
||||
*
|
||||
* @return The attribute value
|
||||
*/
|
||||
public boolean getNotify()
|
||||
{
|
||||
return notify;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if ((items == null) || (items.size() == 0))
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if ((items == null) || (items.size() == 0))
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
|
||||
if (notify != null)
|
||||
{
|
||||
builder.append("' ");
|
||||
builder.append(type.getElementAttribute());
|
||||
builder.append("='");
|
||||
builder.append(notify.equals(Boolean.TRUE) ? 1 : 0);
|
||||
builder.append("'>");
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.append("'>");
|
||||
for (ExtensionElement item : items)
|
||||
{
|
||||
builder.append(item.toXML());
|
||||
}
|
||||
}
|
||||
if (notify != null)
|
||||
{
|
||||
builder.append("' ");
|
||||
builder.append(type.getElementAttribute());
|
||||
builder.append("='");
|
||||
builder.append(notify.equals(Boolean.TRUE) ? 1 : 0);
|
||||
builder.append("'>");
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.append("'>");
|
||||
for (ExtensionElement item : items)
|
||||
{
|
||||
builder.append(item.toXML());
|
||||
}
|
||||
}
|
||||
|
||||
builder.append("</");
|
||||
builder.append(getElementName());
|
||||
builder.append('>');
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
builder.append("</");
|
||||
builder.append(getElementName());
|
||||
builder.append('>');
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + "Content [" + toXML() + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + "Content [" + toXML() + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -38,125 +38,125 @@ import org.jivesoftware.smackx.pubsub.packet.PubSub;
|
|||
*/
|
||||
public class LeafNode extends Node
|
||||
{
|
||||
LeafNode(PubSubManager pubSubManager, String nodeId)
|
||||
{
|
||||
super(pubSubManager, nodeId);
|
||||
}
|
||||
LeafNode(PubSubManager pubSubManager, String nodeId)
|
||||
{
|
||||
super(pubSubManager, nodeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get information on the items in the node in standard
|
||||
* {@link DiscoverItems} format.
|
||||
*
|
||||
* @return The item details in {@link DiscoverItems} format
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverItems discoverItems() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
DiscoverItems items = new DiscoverItems();
|
||||
items.setTo(pubSubManager.getServiceJid());
|
||||
items.setNode(getId());
|
||||
/**
|
||||
* Get information on the items in the node in standard
|
||||
* {@link DiscoverItems} format.
|
||||
*
|
||||
* @return The item details in {@link DiscoverItems} format
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverItems discoverItems() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
DiscoverItems items = new DiscoverItems();
|
||||
items.setTo(pubSubManager.getServiceJid());
|
||||
items.setNode(getId());
|
||||
return pubSubManager.getConnection().createStanzaCollectorAndSend(items).nextResultOrThrow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current items stored in the node.
|
||||
*
|
||||
* @return List of {@link Item} in the node
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
/**
|
||||
* Get the current items stored in the node.
|
||||
*
|
||||
* @return List of {@link Item} in the node
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return getItems((List<ExtensionElement>) null, (List<ExtensionElement>) null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current items stored in the node based
|
||||
* on the subscription associated with the provided
|
||||
* subscription id.
|
||||
*
|
||||
* @param subscriptionId - The subscription id for the
|
||||
* associated subscription.
|
||||
* @return List of {@link Item} in the node
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.get, new GetItemsRequest(getId(), subscriptionId));
|
||||
/**
|
||||
* Get the current items stored in the node based
|
||||
* on the subscription associated with the provided
|
||||
* subscription id.
|
||||
*
|
||||
* @param subscriptionId - The subscription id for the
|
||||
* associated subscription.
|
||||
* @return List of {@link Item} in the node
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.get, new GetItemsRequest(getId(), subscriptionId));
|
||||
return getItems(request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the items specified from the node. This would typically be
|
||||
* used when the server does not return the payload due to size
|
||||
* constraints. The user would be required to retrieve the payload
|
||||
* after the items have been retrieved via {@link #getItems()} or an
|
||||
* event, that did not include the payload.
|
||||
*
|
||||
* @param ids Item ids of the items to retrieve
|
||||
*
|
||||
* @return The list of {@link Item} with payload
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(Collection<String> ids) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
List<Item> itemList = new ArrayList<Item>(ids.size());
|
||||
/**
|
||||
* Get the items specified from the node. This would typically be
|
||||
* used when the server does not return the payload due to size
|
||||
* constraints. The user would be required to retrieve the payload
|
||||
* after the items have been retrieved via {@link #getItems()} or an
|
||||
* event, that did not include the payload.
|
||||
*
|
||||
* @param ids Item ids of the items to retrieve
|
||||
*
|
||||
* @return The list of {@link Item} with payload
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(Collection<String> ids) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
List<Item> itemList = new ArrayList<Item>(ids.size());
|
||||
|
||||
for (String id : ids)
|
||||
{
|
||||
itemList.add(new Item(id));
|
||||
}
|
||||
PubSub request = createPubsubPacket(Type.get, new ItemsExtension(ItemsExtension.ItemsElementType.items, getId(), itemList));
|
||||
for (String id : ids)
|
||||
{
|
||||
itemList.add(new Item(id));
|
||||
}
|
||||
PubSub request = createPubsubPacket(Type.get, new ItemsExtension(ItemsExtension.ItemsElementType.items, getId(), itemList));
|
||||
return getItems(request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get items persisted on the node, limited to the specified number.
|
||||
*
|
||||
* @param maxItems Maximum number of items to return
|
||||
*
|
||||
* @return List of {@link Item}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(int maxItems) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.get, new GetItemsRequest(getId(), maxItems));
|
||||
/**
|
||||
* Get items persisted on the node, limited to the specified number.
|
||||
*
|
||||
* @param maxItems Maximum number of items to return
|
||||
*
|
||||
* @return List of {@link Item}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(int maxItems) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.get, new GetItemsRequest(getId(), maxItems));
|
||||
return getItems(request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get items persisted on the node, limited to the specified number
|
||||
* based on the subscription associated with the provided subscriptionId.
|
||||
*
|
||||
* @param maxItems Maximum number of items to return
|
||||
* @param subscriptionId The subscription which the retrieval is based
|
||||
* on.
|
||||
*
|
||||
* @return List of {@link Item}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(int maxItems, String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.get, new GetItemsRequest(getId(), subscriptionId, maxItems));
|
||||
/**
|
||||
* Get items persisted on the node, limited to the specified number
|
||||
* based on the subscription associated with the provided subscriptionId.
|
||||
*
|
||||
* @param maxItems Maximum number of items to return
|
||||
* @param subscriptionId The subscription which the retrieval is based
|
||||
* on.
|
||||
*
|
||||
* @return List of {@link Item}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> List<T> getItems(int maxItems, String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.get, new GetItemsRequest(getId(), subscriptionId, maxItems));
|
||||
return getItems(request);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get items persisted on the node.
|
||||
|
@ -200,206 +200,206 @@ public class LeafNode extends Node
|
|||
return (List<T>) itemsElem.getItems();
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes an event to the node. This is an empty event
|
||||
* with no item.
|
||||
*
|
||||
* This is only acceptable for nodes with {@link ConfigureForm#isPersistItems()}=false
|
||||
* and {@link ConfigureForm#isDeliverPayloads()}=false.
|
||||
*
|
||||
* This is an asynchronous call which returns as soon as the
|
||||
* stanza(/packet) has been sent.
|
||||
*
|
||||
* For synchronous calls use {@link #send() send()}.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void publish() throws NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new NodeExtension(PubSubElementType.PUBLISH, getId()));
|
||||
/**
|
||||
* Publishes an event to the node. This is an empty event
|
||||
* with no item.
|
||||
*
|
||||
* This is only acceptable for nodes with {@link ConfigureForm#isPersistItems()}=false
|
||||
* and {@link ConfigureForm#isDeliverPayloads()}=false.
|
||||
*
|
||||
* This is an asynchronous call which returns as soon as the
|
||||
* stanza(/packet) has been sent.
|
||||
*
|
||||
* For synchronous calls use {@link #send() send()}.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void publish() throws NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new NodeExtension(PubSubElementType.PUBLISH, getId()));
|
||||
|
||||
pubSubManager.getConnection().sendStanza(packet);
|
||||
}
|
||||
pubSubManager.getConnection().sendStanza(packet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes an event to the node. This is a simple item
|
||||
* with no payload.
|
||||
*
|
||||
* If the id is null, an empty item (one without an id) will be sent.
|
||||
* Please note that this is not the same as {@link #send()}, which
|
||||
* publishes an event with NO item.
|
||||
*
|
||||
* This is an asynchronous call which returns as soon as the
|
||||
* stanza(/packet) has been sent.
|
||||
*
|
||||
* For synchronous calls use {@link #send(Item) send(Item))}.
|
||||
*
|
||||
* @param item - The item being sent
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Item> void publish(T item) throws NotConnectedException, InterruptedException
|
||||
{
|
||||
Collection<T> items = new ArrayList<T>(1);
|
||||
items.add((T)(item == null ? new Item() : item));
|
||||
publish(items);
|
||||
}
|
||||
/**
|
||||
* Publishes an event to the node. This is a simple item
|
||||
* with no payload.
|
||||
*
|
||||
* If the id is null, an empty item (one without an id) will be sent.
|
||||
* Please note that this is not the same as {@link #send()}, which
|
||||
* publishes an event with NO item.
|
||||
*
|
||||
* This is an asynchronous call which returns as soon as the
|
||||
* stanza(/packet) has been sent.
|
||||
*
|
||||
* For synchronous calls use {@link #send(Item) send(Item))}.
|
||||
*
|
||||
* @param item - The item being sent
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Item> void publish(T item) throws NotConnectedException, InterruptedException
|
||||
{
|
||||
Collection<T> items = new ArrayList<T>(1);
|
||||
items.add((T)(item == null ? new Item() : item));
|
||||
publish(items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes multiple events to the node. Same rules apply as in {@link #publish(Item)}.
|
||||
*
|
||||
* In addition, if {@link ConfigureForm#isPersistItems()}=false, only the last item in the input
|
||||
* list will get stored on the node, assuming it stores the last sent item.
|
||||
*
|
||||
* This is an asynchronous call which returns as soon as the
|
||||
* stanza(/packet) has been sent.
|
||||
*
|
||||
* For synchronous calls use {@link #send(Collection) send(Collection))}.
|
||||
*
|
||||
* @param items - The collection of items being sent
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> void publish(Collection<T> items) throws NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new PublishItem<T>(getId(), items));
|
||||
/**
|
||||
* Publishes multiple events to the node. Same rules apply as in {@link #publish(Item)}.
|
||||
*
|
||||
* In addition, if {@link ConfigureForm#isPersistItems()}=false, only the last item in the input
|
||||
* list will get stored on the node, assuming it stores the last sent item.
|
||||
*
|
||||
* This is an asynchronous call which returns as soon as the
|
||||
* stanza(/packet) has been sent.
|
||||
*
|
||||
* For synchronous calls use {@link #send(Collection) send(Collection))}.
|
||||
*
|
||||
* @param items - The collection of items being sent
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Item> void publish(Collection<T> items) throws NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new PublishItem<T>(getId(), items));
|
||||
|
||||
pubSubManager.getConnection().sendStanza(packet);
|
||||
}
|
||||
pubSubManager.getConnection().sendStanza(packet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes an event to the node. This is an empty event
|
||||
* with no item.
|
||||
*
|
||||
* This is only acceptable for nodes with {@link ConfigureForm#isPersistItems()}=false
|
||||
* and {@link ConfigureForm#isDeliverPayloads()}=false.
|
||||
*
|
||||
* This is a synchronous call which will throw an exception
|
||||
* on failure.
|
||||
*
|
||||
* For asynchronous calls, use {@link #publish() publish()}.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public void send() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new NodeExtension(PubSubElementType.PUBLISH, getId()));
|
||||
/**
|
||||
* Publishes an event to the node. This is an empty event
|
||||
* with no item.
|
||||
*
|
||||
* This is only acceptable for nodes with {@link ConfigureForm#isPersistItems()}=false
|
||||
* and {@link ConfigureForm#isDeliverPayloads()}=false.
|
||||
*
|
||||
* This is a synchronous call which will throw an exception
|
||||
* on failure.
|
||||
*
|
||||
* For asynchronous calls, use {@link #publish() publish()}.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public void send() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new NodeExtension(PubSubElementType.PUBLISH, getId()));
|
||||
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(packet).nextResultOrThrow();
|
||||
}
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(packet).nextResultOrThrow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes an event to the node. This can be either a simple item
|
||||
* with no payload, or one with it. This is determined by the Node
|
||||
* configuration.
|
||||
*
|
||||
* If the node has <b>deliver_payload=false</b>, the Item must not
|
||||
* have a payload.
|
||||
*
|
||||
* If the id is null, an empty item (one without an id) will be sent.
|
||||
* Please note that this is not the same as {@link #send()}, which
|
||||
* publishes an event with NO item.
|
||||
*
|
||||
* This is a synchronous call which will throw an exception
|
||||
* on failure.
|
||||
*
|
||||
* For asynchronous calls, use {@link #publish(Item) publish(Item)}.
|
||||
*
|
||||
* @param item - The item being sent
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Item> void send(T item) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Collection<T> items = new ArrayList<T>(1);
|
||||
items.add((item == null ? (T)new Item() : item));
|
||||
send(items);
|
||||
}
|
||||
/**
|
||||
* Publishes an event to the node. This can be either a simple item
|
||||
* with no payload, or one with it. This is determined by the Node
|
||||
* configuration.
|
||||
*
|
||||
* If the node has <b>deliver_payload=false</b>, the Item must not
|
||||
* have a payload.
|
||||
*
|
||||
* If the id is null, an empty item (one without an id) will be sent.
|
||||
* Please note that this is not the same as {@link #send()}, which
|
||||
* publishes an event with NO item.
|
||||
*
|
||||
* This is a synchronous call which will throw an exception
|
||||
* on failure.
|
||||
*
|
||||
* For asynchronous calls, use {@link #publish(Item) publish(Item)}.
|
||||
*
|
||||
* @param item - The item being sent
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T extends Item> void send(T item) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Collection<T> items = new ArrayList<T>(1);
|
||||
items.add((item == null ? (T)new Item() : item));
|
||||
send(items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Publishes multiple events to the node. Same rules apply as in {@link #send(Item)}.
|
||||
*
|
||||
* In addition, if {@link ConfigureForm#isPersistItems()}=false, only the last item in the input
|
||||
* list will get stored on the node, assuming it stores the last sent item.
|
||||
*
|
||||
* This is a synchronous call which will throw an exception
|
||||
* on failure.
|
||||
*
|
||||
* For asynchronous calls, use {@link #publish(Collection) publish(Collection))}.
|
||||
*
|
||||
* @param items - The collection of {@link Item} objects being sent
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public <T extends Item> void send(Collection<T> items) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new PublishItem<T>(getId(), items));
|
||||
/**
|
||||
* Publishes multiple events to the node. Same rules apply as in {@link #send(Item)}.
|
||||
*
|
||||
* In addition, if {@link ConfigureForm#isPersistItems()}=false, only the last item in the input
|
||||
* list will get stored on the node, assuming it stores the last sent item.
|
||||
*
|
||||
* This is a synchronous call which will throw an exception
|
||||
* on failure.
|
||||
*
|
||||
* For asynchronous calls, use {@link #publish(Collection) publish(Collection))}.
|
||||
*
|
||||
* @param items - The collection of {@link Item} objects being sent
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public <T extends Item> void send(Collection<T> items) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new PublishItem<T>(getId(), items));
|
||||
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(packet).nextResultOrThrow();
|
||||
}
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(packet).nextResultOrThrow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Purges the node of all items.
|
||||
*
|
||||
* <p>Note: Some implementations may keep the last item
|
||||
* sent.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteAllItems() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.set, new NodeExtension(PubSubElementType.PURGE_OWNER, getId()), PubSubElementType.PURGE_OWNER.getNamespace());
|
||||
/**
|
||||
* Purges the node of all items.
|
||||
*
|
||||
* <p>Note: Some implementations may keep the last item
|
||||
* sent.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteAllItems() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.set, new NodeExtension(PubSubElementType.PURGE_OWNER, getId()), PubSubElementType.PURGE_OWNER.getNamespace());
|
||||
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(request).nextResultOrThrow();
|
||||
}
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(request).nextResultOrThrow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the item with the specified id from the node.
|
||||
*
|
||||
* @param itemId The id of the item
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteItem(String itemId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Collection<String> items = new ArrayList<String>(1);
|
||||
items.add(itemId);
|
||||
deleteItem(items);
|
||||
}
|
||||
/**
|
||||
* Delete the item with the specified id from the node.
|
||||
*
|
||||
* @param itemId The id of the item
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteItem(String itemId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Collection<String> items = new ArrayList<String>(1);
|
||||
items.add(itemId);
|
||||
deleteItem(items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the items with the specified id's from the node.
|
||||
*
|
||||
* @param itemIds The list of id's of items to delete
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteItem(Collection<String> itemIds) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
List<Item> items = new ArrayList<Item>(itemIds.size());
|
||||
/**
|
||||
* Delete the items with the specified id's from the node.
|
||||
*
|
||||
* @param itemIds The list of id's of items to delete
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteItem(Collection<String> itemIds) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
List<Item> items = new ArrayList<Item>(itemIds.size());
|
||||
|
||||
for (String id : itemIds)
|
||||
{
|
||||
items.add(new Item(id));
|
||||
}
|
||||
PubSub request = createPubsubPacket(Type.set, new ItemsExtension(ItemsExtension.ItemsElementType.retract, getId(), items));
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(request).nextResultOrThrow();
|
||||
}
|
||||
for (String id : itemIds)
|
||||
{
|
||||
items.add(new Item(id));
|
||||
}
|
||||
PubSub request = createPubsubPacket(Type.set, new ItemsExtension(ItemsExtension.ItemsElementType.retract, getId(), items));
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(request).nextResultOrThrow();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -48,97 +48,97 @@ abstract public class Node
|
|||
protected final PubSubManager pubSubManager;
|
||||
protected final String id;
|
||||
|
||||
protected ConcurrentHashMap<ItemEventListener<Item>, StanzaListener> itemEventToListenerMap = new ConcurrentHashMap<ItemEventListener<Item>, StanzaListener>();
|
||||
protected ConcurrentHashMap<ItemDeleteListener, StanzaListener> itemDeleteToListenerMap = new ConcurrentHashMap<ItemDeleteListener, StanzaListener>();
|
||||
protected ConcurrentHashMap<NodeConfigListener, StanzaListener> configEventToListenerMap = new ConcurrentHashMap<NodeConfigListener, StanzaListener>();
|
||||
protected ConcurrentHashMap<ItemEventListener<Item>, StanzaListener> itemEventToListenerMap = new ConcurrentHashMap<ItemEventListener<Item>, StanzaListener>();
|
||||
protected ConcurrentHashMap<ItemDeleteListener, StanzaListener> itemDeleteToListenerMap = new ConcurrentHashMap<ItemDeleteListener, StanzaListener>();
|
||||
protected ConcurrentHashMap<NodeConfigListener, StanzaListener> configEventToListenerMap = new ConcurrentHashMap<NodeConfigListener, StanzaListener>();
|
||||
|
||||
/**
|
||||
* Construct a node associated to the supplied connection with the specified
|
||||
* node id.
|
||||
*
|
||||
* @param connection The connection the node is associated with
|
||||
* @param nodeName The node id
|
||||
*/
|
||||
Node(PubSubManager pubSubManager, String nodeId)
|
||||
{
|
||||
this.pubSubManager = pubSubManager;
|
||||
id = nodeId;
|
||||
}
|
||||
/**
|
||||
* Construct a node associated to the supplied connection with the specified
|
||||
* node id.
|
||||
*
|
||||
* @param connection The connection the node is associated with
|
||||
* @param nodeName The node id
|
||||
*/
|
||||
Node(PubSubManager pubSubManager, String nodeId)
|
||||
{
|
||||
this.pubSubManager = pubSubManager;
|
||||
id = nodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the NodeId.
|
||||
*
|
||||
* @return the node id
|
||||
*/
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
/**
|
||||
* Returns a configuration form, from which you can create an answer form to be submitted
|
||||
* via the {@link #sendConfigurationForm(Form)}.
|
||||
*
|
||||
* @return the configuration form
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public ConfigureForm getNodeConfiguration() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
/**
|
||||
* Get the NodeId.
|
||||
*
|
||||
* @return the node id
|
||||
*/
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
/**
|
||||
* Returns a configuration form, from which you can create an answer form to be submitted
|
||||
* via the {@link #sendConfigurationForm(Form)}.
|
||||
*
|
||||
* @return the configuration form
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public ConfigureForm getNodeConfiguration() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub pubSub = createPubsubPacket(Type.get, new NodeExtension(
|
||||
PubSubElementType.CONFIGURE_OWNER, getId()), PubSubNamespace.OWNER);
|
||||
Stanza reply = sendPubsubPacket(pubSub);
|
||||
return NodeUtils.getFormFromPacket(reply, PubSubElementType.CONFIGURE_OWNER);
|
||||
}
|
||||
Stanza reply = sendPubsubPacket(pubSub);
|
||||
return NodeUtils.getFormFromPacket(reply, PubSubElementType.CONFIGURE_OWNER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the configuration with the contents of the new {@link Form}.
|
||||
*
|
||||
* @param submitForm
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void sendConfigurationForm(Form submitForm) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
/**
|
||||
* Update the configuration with the contents of the new {@link Form}.
|
||||
*
|
||||
* @param submitForm
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void sendConfigurationForm(Form submitForm) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = createPubsubPacket(Type.set, new FormNode(FormNodeType.CONFIGURE_OWNER,
|
||||
getId(), submitForm), PubSubNamespace.OWNER);
|
||||
pubSubManager.getConnection().createStanzaCollectorAndSend(packet).nextResultOrThrow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Discover node information in standard {@link DiscoverInfo} format.
|
||||
*
|
||||
* @return The discovery information about the node.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverInfo discoverInfo() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
info.setTo(pubSubManager.getServiceJid());
|
||||
info.setNode(getId());
|
||||
return pubSubManager.getConnection().createStanzaCollectorAndSend(info).nextResultOrThrow();
|
||||
}
|
||||
/**
|
||||
* Discover node information in standard {@link DiscoverInfo} format.
|
||||
*
|
||||
* @return The discovery information about the node.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverInfo discoverInfo() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
info.setTo(pubSubManager.getServiceJid());
|
||||
info.setNode(getId());
|
||||
return pubSubManager.getConnection().createStanzaCollectorAndSend(info).nextResultOrThrow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the subscriptions currently associated with this node.
|
||||
*
|
||||
* @return List of {@link Subscription}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public List<Subscription> getSubscriptions() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
/**
|
||||
* Get the subscriptions currently associated with this node.
|
||||
*
|
||||
* @return List of {@link Subscription}
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public List<Subscription> getSubscriptions() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return getSubscriptions(null, null);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the subscriptions currently associated with this node.
|
||||
|
@ -223,15 +223,15 @@ abstract public class Node
|
|||
return subElem.getSubscriptions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the affiliations of this node.
|
||||
*
|
||||
* @return List of {@link Affiliation}
|
||||
* @throws NoResponseException
|
||||
* @throws XMPPErrorException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
/**
|
||||
* Get the affiliations of this node.
|
||||
*
|
||||
* @return List of {@link Affiliation}
|
||||
* @throws NoResponseException
|
||||
* @throws XMPPErrorException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public List<Affiliation> getAffiliations() throws NoResponseException, XMPPErrorException,
|
||||
NotConnectedException, InterruptedException {
|
||||
return getAffiliations(null, null);
|
||||
|
@ -346,398 +346,394 @@ abstract public class Node
|
|||
return sendPubsubPacket(pubSub);
|
||||
}
|
||||
|
||||
/**
|
||||
* The user subscribes to the node using the supplied jid. The
|
||||
* bare jid portion of this one must match the jid for the connection.
|
||||
*
|
||||
* Please note that the {@link Subscription.State} should be checked
|
||||
* on return since more actions may be required by the caller.
|
||||
* {@link Subscription.State#pending} - The owner must approve the subscription
|
||||
* request before messages will be received.
|
||||
* {@link Subscription.State#unconfigured} - If the {@link Subscription#isConfigRequired()} is true,
|
||||
* the caller must configure the subscription before messages will be received. If it is false
|
||||
* the caller can configure it but is not required to do so.
|
||||
* @param jid The jid to subscribe as.
|
||||
* @return The subscription
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public Subscription subscribe(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
PubSub pubSub = createPubsubPacket(Type.set, new SubscribeExtension(jid, getId()));
|
||||
// CHECKSTYLE:ON
|
||||
PubSub reply = sendPubsubPacket(pubSub);
|
||||
return reply.getExtension(PubSubElementType.SUBSCRIPTION);
|
||||
}
|
||||
/**
|
||||
* The user subscribes to the node using the supplied jid. The
|
||||
* bare jid portion of this one must match the jid for the connection.
|
||||
*
|
||||
* Please note that the {@link Subscription.State} should be checked
|
||||
* on return since more actions may be required by the caller.
|
||||
* {@link Subscription.State#pending} - The owner must approve the subscription
|
||||
* request before messages will be received.
|
||||
* {@link Subscription.State#unconfigured} - If the {@link Subscription#isConfigRequired()} is true,
|
||||
* the caller must configure the subscription before messages will be received. If it is false
|
||||
* the caller can configure it but is not required to do so.
|
||||
* @param jid The jid to subscribe as.
|
||||
* @return The subscription
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public Subscription subscribe(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub pubSub = createPubsubPacket(Type.set, new SubscribeExtension(jid, getId()));
|
||||
PubSub reply = sendPubsubPacket(pubSub);
|
||||
return reply.getExtension(PubSubElementType.SUBSCRIPTION);
|
||||
}
|
||||
|
||||
/**
|
||||
* The user subscribes to the node using the supplied jid and subscription
|
||||
* options. The bare jid portion of this one must match the jid for the
|
||||
* connection.
|
||||
*
|
||||
* Please note that the {@link Subscription.State} should be checked
|
||||
* on return since more actions may be required by the caller.
|
||||
* {@link Subscription.State#pending} - The owner must approve the subscription
|
||||
* request before messages will be received.
|
||||
* {@link Subscription.State#unconfigured} - If the {@link Subscription#isConfigRequired()} is true,
|
||||
* the caller must configure the subscription before messages will be received. If it is false
|
||||
* the caller can configure it but is not required to do so.
|
||||
* @param jid The jid to subscribe as.
|
||||
* @return The subscription
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public Subscription subscribe(String jid, SubscribeForm subForm) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
PubSub request = createPubsubPacket(Type.set, new SubscribeExtension(jid, getId()));
|
||||
// CHECKSTYLE:ON
|
||||
request.addExtension(new FormNode(FormNodeType.OPTIONS, subForm));
|
||||
PubSub reply = sendPubsubPacket(request);
|
||||
return reply.getExtension(PubSubElementType.SUBSCRIPTION);
|
||||
}
|
||||
/**
|
||||
* The user subscribes to the node using the supplied jid and subscription
|
||||
* options. The bare jid portion of this one must match the jid for the
|
||||
* connection.
|
||||
*
|
||||
* Please note that the {@link Subscription.State} should be checked
|
||||
* on return since more actions may be required by the caller.
|
||||
* {@link Subscription.State#pending} - The owner must approve the subscription
|
||||
* request before messages will be received.
|
||||
* {@link Subscription.State#unconfigured} - If the {@link Subscription#isConfigRequired()} is true,
|
||||
* the caller must configure the subscription before messages will be received. If it is false
|
||||
* the caller can configure it but is not required to do so.
|
||||
* @param jid The jid to subscribe as.
|
||||
* @return The subscription
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public Subscription subscribe(String jid, SubscribeForm subForm) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = createPubsubPacket(Type.set, new SubscribeExtension(jid, getId()));
|
||||
request.addExtension(new FormNode(FormNodeType.OPTIONS, subForm));
|
||||
PubSub reply = sendPubsubPacket(request);
|
||||
return reply.getExtension(PubSubElementType.SUBSCRIPTION);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the subscription related to the specified JID. This will only
|
||||
* work if there is only 1 subscription. If there are multiple subscriptions,
|
||||
* use {@link #unsubscribe(String, String)}.
|
||||
*
|
||||
* @param jid The JID used to subscribe to the node
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public void unsubscribe(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
unsubscribe(jid, null);
|
||||
}
|
||||
/**
|
||||
* Remove the subscription related to the specified JID. This will only
|
||||
* work if there is only 1 subscription. If there are multiple subscriptions,
|
||||
* use {@link #unsubscribe(String, String)}.
|
||||
*
|
||||
* @param jid The JID used to subscribe to the node
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public void unsubscribe(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
unsubscribe(jid, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specific subscription related to the specified JID.
|
||||
*
|
||||
* @param jid The JID used to subscribe to the node
|
||||
* @param subscriptionId The id of the subscription being removed
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void unsubscribe(String jid, String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
sendPubsubPacket(createPubsubPacket(Type.set, new UnsubscribeExtension(jid, getId(), subscriptionId)));
|
||||
}
|
||||
/**
|
||||
* Remove the specific subscription related to the specified JID.
|
||||
*
|
||||
* @param jid The JID used to subscribe to the node
|
||||
* @param subscriptionId The id of the subscription being removed
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void unsubscribe(String jid, String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
sendPubsubPacket(createPubsubPacket(Type.set, new UnsubscribeExtension(jid, getId(), subscriptionId)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a SubscribeForm for subscriptions, from which you can create an answer form to be submitted
|
||||
* via the {@link #sendConfigurationForm(Form)}.
|
||||
*
|
||||
* @return A subscription options form
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public SubscribeForm getSubscriptionOptions(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return getSubscriptionOptions(jid, null);
|
||||
}
|
||||
/**
|
||||
* Returns a SubscribeForm for subscriptions, from which you can create an answer form to be submitted
|
||||
* via the {@link #sendConfigurationForm(Form)}.
|
||||
*
|
||||
* @return A subscription options form
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public SubscribeForm getSubscriptionOptions(String jid) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return getSubscriptionOptions(jid, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the options for configuring the specified subscription.
|
||||
*
|
||||
* @param jid JID the subscription is registered under
|
||||
* @param subscriptionId The subscription id
|
||||
*
|
||||
* @return The subscription option form
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public SubscribeForm getSubscriptionOptions(String jid, String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = sendPubsubPacket(createPubsubPacket(Type.get, new OptionsExtension(jid, getId(), subscriptionId)));
|
||||
FormNode ext = packet.getExtension(PubSubElementType.OPTIONS);
|
||||
return new SubscribeForm(ext.getForm());
|
||||
}
|
||||
/**
|
||||
* Get the options for configuring the specified subscription.
|
||||
*
|
||||
* @param jid JID the subscription is registered under
|
||||
* @param subscriptionId The subscription id
|
||||
*
|
||||
* @return The subscription option form
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public SubscribeForm getSubscriptionOptions(String jid, String subscriptionId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub packet = sendPubsubPacket(createPubsubPacket(Type.get, new OptionsExtension(jid, getId(), subscriptionId)));
|
||||
FormNode ext = packet.getExtension(PubSubElementType.OPTIONS);
|
||||
return new SubscribeForm(ext.getForm());
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a listener for item publication events. This
|
||||
* listener will get called whenever an item is published to
|
||||
* this node.
|
||||
*
|
||||
* @param listener The handler for the event
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
/**
|
||||
* Register a listener for item publication events. This
|
||||
* listener will get called whenever an item is published to
|
||||
* this node.
|
||||
*
|
||||
* @param listener The handler for the event
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public void addItemEventListener(@SuppressWarnings("rawtypes") ItemEventListener listener)
|
||||
{
|
||||
StanzaListener conListener = new ItemEventTranslator(listener);
|
||||
itemEventToListenerMap.put(listener, conListener);
|
||||
pubSubManager.getConnection().addSyncStanzaListener(conListener, new EventContentFilter(EventElementType.items.toString(), "item"));
|
||||
}
|
||||
{
|
||||
StanzaListener conListener = new ItemEventTranslator(listener);
|
||||
itemEventToListenerMap.put(listener, conListener);
|
||||
pubSubManager.getConnection().addSyncStanzaListener(conListener, new EventContentFilter(EventElementType.items.toString(), "item"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a listener for publication events.
|
||||
*
|
||||
* @param listener The handler to unregister
|
||||
*/
|
||||
public void removeItemEventListener(@SuppressWarnings("rawtypes") ItemEventListener listener)
|
||||
{
|
||||
StanzaListener conListener = itemEventToListenerMap.remove(listener);
|
||||
/**
|
||||
* Unregister a listener for publication events.
|
||||
*
|
||||
* @param listener The handler to unregister
|
||||
*/
|
||||
public void removeItemEventListener(@SuppressWarnings("rawtypes") ItemEventListener listener)
|
||||
{
|
||||
StanzaListener conListener = itemEventToListenerMap.remove(listener);
|
||||
|
||||
if (conListener != null)
|
||||
pubSubManager.getConnection().removeSyncStanzaListener(conListener);
|
||||
}
|
||||
if (conListener != null)
|
||||
pubSubManager.getConnection().removeSyncStanzaListener(conListener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a listener for configuration events. This listener
|
||||
* will get called whenever the node's configuration changes.
|
||||
*
|
||||
* @param listener The handler for the event
|
||||
*/
|
||||
public void addConfigurationListener(NodeConfigListener listener)
|
||||
{
|
||||
StanzaListener conListener = new NodeConfigTranslator(listener);
|
||||
configEventToListenerMap.put(listener, conListener);
|
||||
pubSubManager.getConnection().addSyncStanzaListener(conListener, new EventContentFilter(EventElementType.configuration.toString()));
|
||||
}
|
||||
/**
|
||||
* Register a listener for configuration events. This listener
|
||||
* will get called whenever the node's configuration changes.
|
||||
*
|
||||
* @param listener The handler for the event
|
||||
*/
|
||||
public void addConfigurationListener(NodeConfigListener listener)
|
||||
{
|
||||
StanzaListener conListener = new NodeConfigTranslator(listener);
|
||||
configEventToListenerMap.put(listener, conListener);
|
||||
pubSubManager.getConnection().addSyncStanzaListener(conListener, new EventContentFilter(EventElementType.configuration.toString()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a listener for configuration events.
|
||||
*
|
||||
* @param listener The handler to unregister
|
||||
*/
|
||||
public void removeConfigurationListener(NodeConfigListener listener)
|
||||
{
|
||||
StanzaListener conListener = configEventToListenerMap .remove(listener);
|
||||
/**
|
||||
* Unregister a listener for configuration events.
|
||||
*
|
||||
* @param listener The handler to unregister
|
||||
*/
|
||||
public void removeConfigurationListener(NodeConfigListener listener)
|
||||
{
|
||||
StanzaListener conListener = configEventToListenerMap .remove(listener);
|
||||
|
||||
if (conListener != null)
|
||||
pubSubManager.getConnection().removeSyncStanzaListener(conListener);
|
||||
}
|
||||
if (conListener != null)
|
||||
pubSubManager.getConnection().removeSyncStanzaListener(conListener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register an listener for item delete events. This listener
|
||||
* gets called whenever an item is deleted from the node.
|
||||
*
|
||||
* @param listener The handler for the event
|
||||
*/
|
||||
public void addItemDeleteListener(ItemDeleteListener listener)
|
||||
{
|
||||
StanzaListener delListener = new ItemDeleteTranslator(listener);
|
||||
itemDeleteToListenerMap.put(listener, delListener);
|
||||
EventContentFilter deleteItem = new EventContentFilter(EventElementType.items.toString(), "retract");
|
||||
EventContentFilter purge = new EventContentFilter(EventElementType.purge.toString());
|
||||
/**
|
||||
* Register an listener for item delete events. This listener
|
||||
* gets called whenever an item is deleted from the node.
|
||||
*
|
||||
* @param listener The handler for the event
|
||||
*/
|
||||
public void addItemDeleteListener(ItemDeleteListener listener)
|
||||
{
|
||||
StanzaListener delListener = new ItemDeleteTranslator(listener);
|
||||
itemDeleteToListenerMap.put(listener, delListener);
|
||||
EventContentFilter deleteItem = new EventContentFilter(EventElementType.items.toString(), "retract");
|
||||
EventContentFilter purge = new EventContentFilter(EventElementType.purge.toString());
|
||||
|
||||
pubSubManager.getConnection().addSyncStanzaListener(delListener, new OrFilter(deleteItem, purge));
|
||||
}
|
||||
pubSubManager.getConnection().addSyncStanzaListener(delListener, new OrFilter(deleteItem, purge));
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a listener for item delete events.
|
||||
*
|
||||
* @param listener The handler to unregister
|
||||
*/
|
||||
public void removeItemDeleteListener(ItemDeleteListener listener)
|
||||
{
|
||||
StanzaListener conListener = itemDeleteToListenerMap .remove(listener);
|
||||
/**
|
||||
* Unregister a listener for item delete events.
|
||||
*
|
||||
* @param listener The handler to unregister
|
||||
*/
|
||||
public void removeItemDeleteListener(ItemDeleteListener listener)
|
||||
{
|
||||
StanzaListener conListener = itemDeleteToListenerMap .remove(listener);
|
||||
|
||||
if (conListener != null)
|
||||
pubSubManager.getConnection().removeSyncStanzaListener(conListener);
|
||||
}
|
||||
if (conListener != null)
|
||||
pubSubManager.getConnection().removeSyncStanzaListener(conListener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return super.toString() + " " + getClass().getName() + " id: " + id;
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return super.toString() + " " + getClass().getName() + " id: " + id;
|
||||
}
|
||||
|
||||
protected PubSub createPubsubPacket(Type type, ExtensionElement ext)
|
||||
{
|
||||
return createPubsubPacket(type, ext, null);
|
||||
}
|
||||
protected PubSub createPubsubPacket(Type type, ExtensionElement ext)
|
||||
{
|
||||
return createPubsubPacket(type, ext, null);
|
||||
}
|
||||
|
||||
protected PubSub createPubsubPacket(Type type, ExtensionElement ext, PubSubNamespace ns)
|
||||
{
|
||||
protected PubSub createPubsubPacket(Type type, ExtensionElement ext, PubSubNamespace ns)
|
||||
{
|
||||
return PubSub.createPubsubPacket(pubSubManager.getServiceJid(), type, ext, ns);
|
||||
}
|
||||
}
|
||||
|
||||
protected PubSub sendPubsubPacket(PubSub packet) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return pubSubManager.sendPubsubPacket(packet);
|
||||
}
|
||||
protected PubSub sendPubsubPacket(PubSub packet) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return pubSubManager.sendPubsubPacket(packet);
|
||||
}
|
||||
|
||||
|
||||
private static List<String> getSubscriptionIds(Stanza packet)
|
||||
{
|
||||
HeadersExtension headers = (HeadersExtension)packet.getExtension("headers", "http://jabber.org/protocol/shim");
|
||||
List<String> values = null;
|
||||
private static List<String> getSubscriptionIds(Stanza packet)
|
||||
{
|
||||
HeadersExtension headers = (HeadersExtension)packet.getExtension("headers", "http://jabber.org/protocol/shim");
|
||||
List<String> values = null;
|
||||
|
||||
if (headers != null)
|
||||
{
|
||||
values = new ArrayList<String>(headers.getHeaders().size());
|
||||
if (headers != null)
|
||||
{
|
||||
values = new ArrayList<String>(headers.getHeaders().size());
|
||||
|
||||
for (Header header : headers.getHeaders())
|
||||
{
|
||||
values.add(header.getValue());
|
||||
}
|
||||
}
|
||||
return values;
|
||||
}
|
||||
for (Header header : headers.getHeaders())
|
||||
{
|
||||
values.add(header.getValue());
|
||||
}
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
/**
|
||||
* This class translates low level item publication events into api level objects for
|
||||
* user consumption.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
public class ItemEventTranslator implements StanzaListener
|
||||
{
|
||||
@SuppressWarnings("rawtypes")
|
||||
/**
|
||||
* This class translates low level item publication events into api level objects for
|
||||
* user consumption.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
public class ItemEventTranslator implements StanzaListener
|
||||
{
|
||||
@SuppressWarnings("rawtypes")
|
||||
private ItemEventListener listener;
|
||||
|
||||
public ItemEventTranslator(@SuppressWarnings("rawtypes") ItemEventListener eventListener)
|
||||
{
|
||||
listener = eventListener;
|
||||
}
|
||||
public ItemEventTranslator(@SuppressWarnings("rawtypes") ItemEventListener eventListener)
|
||||
{
|
||||
listener = eventListener;
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public void processStanza(Stanza packet)
|
||||
{
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
EventElement event = (EventElement)packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
|
||||
EventElement event = (EventElement)packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
|
||||
// CHECKSTYLE:ON
|
||||
ItemsExtension itemsElem = (ItemsExtension)event.getEvent();
|
||||
ItemsExtension itemsElem = (ItemsExtension)event.getEvent();
|
||||
ItemPublishEvent eventItems = new ItemPublishEvent(itemsElem.getNode(), itemsElem.getItems(), getSubscriptionIds(packet), DelayInformationManager.getDelayTimestamp(packet));
|
||||
listener.handlePublishedItems(eventItems);
|
||||
}
|
||||
}
|
||||
listener.handlePublishedItems(eventItems);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This class translates low level item deletion events into api level objects for
|
||||
* user consumption.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
public class ItemDeleteTranslator implements StanzaListener
|
||||
{
|
||||
private ItemDeleteListener listener;
|
||||
/**
|
||||
* This class translates low level item deletion events into api level objects for
|
||||
* user consumption.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
public class ItemDeleteTranslator implements StanzaListener
|
||||
{
|
||||
private ItemDeleteListener listener;
|
||||
|
||||
public ItemDeleteTranslator(ItemDeleteListener eventListener)
|
||||
{
|
||||
listener = eventListener;
|
||||
}
|
||||
public ItemDeleteTranslator(ItemDeleteListener eventListener)
|
||||
{
|
||||
listener = eventListener;
|
||||
}
|
||||
|
||||
public void processStanza(Stanza packet)
|
||||
{
|
||||
public void processStanza(Stanza packet)
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
EventElement event = (EventElement)packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
|
||||
EventElement event = (EventElement)packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
|
||||
|
||||
List<ExtensionElement> extList = event.getExtensions();
|
||||
List<ExtensionElement> extList = event.getExtensions();
|
||||
|
||||
if (extList.get(0).getElementName().equals(PubSubElementType.PURGE_EVENT.getElementName()))
|
||||
{
|
||||
listener.handlePurge();
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemsExtension itemsElem = (ItemsExtension)event.getEvent();
|
||||
@SuppressWarnings("unchecked")
|
||||
if (extList.get(0).getElementName().equals(PubSubElementType.PURGE_EVENT.getElementName()))
|
||||
{
|
||||
listener.handlePurge();
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemsExtension itemsElem = (ItemsExtension)event.getEvent();
|
||||
@SuppressWarnings("unchecked")
|
||||
Collection<RetractItem> pubItems = (Collection<RetractItem>) itemsElem.getItems();
|
||||
List<String> items = new ArrayList<String>(pubItems.size());
|
||||
List<String> items = new ArrayList<String>(pubItems.size());
|
||||
|
||||
for (RetractItem item : pubItems)
|
||||
{
|
||||
items.add(item.getId());
|
||||
}
|
||||
for (RetractItem item : pubItems)
|
||||
{
|
||||
items.add(item.getId());
|
||||
}
|
||||
|
||||
ItemDeleteEvent eventItems = new ItemDeleteEvent(itemsElem.getNode(), items, getSubscriptionIds(packet));
|
||||
listener.handleDeletedItems(eventItems);
|
||||
}
|
||||
ItemDeleteEvent eventItems = new ItemDeleteEvent(itemsElem.getNode(), items, getSubscriptionIds(packet));
|
||||
listener.handleDeletedItems(eventItems);
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This class translates low level node configuration events into api level objects for
|
||||
* user consumption.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
public class NodeConfigTranslator implements StanzaListener
|
||||
{
|
||||
private NodeConfigListener listener;
|
||||
/**
|
||||
* This class translates low level node configuration events into api level objects for
|
||||
* user consumption.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
public class NodeConfigTranslator implements StanzaListener
|
||||
{
|
||||
private NodeConfigListener listener;
|
||||
|
||||
public NodeConfigTranslator(NodeConfigListener eventListener)
|
||||
{
|
||||
listener = eventListener;
|
||||
}
|
||||
public NodeConfigTranslator(NodeConfigListener eventListener)
|
||||
{
|
||||
listener = eventListener;
|
||||
}
|
||||
|
||||
public void processStanza(Stanza packet)
|
||||
{
|
||||
public void processStanza(Stanza packet)
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
EventElement event = (EventElement)packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
|
||||
ConfigurationEvent config = (ConfigurationEvent)event.getEvent();
|
||||
EventElement event = (EventElement)packet.getExtension("event", PubSubNamespace.EVENT.getXmlns());
|
||||
ConfigurationEvent config = (ConfigurationEvent)event.getEvent();
|
||||
// CHECKSTYLE:ON
|
||||
|
||||
listener.handleNodeConfiguration(config);
|
||||
}
|
||||
}
|
||||
listener.handleNodeConfiguration(config);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter for {@link StanzaListener} to filter out events not specific to the
|
||||
* event type expected for this node.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
class EventContentFilter extends FlexibleStanzaTypeFilter<Message>
|
||||
{
|
||||
/**
|
||||
* Filter for {@link StanzaListener} to filter out events not specific to the
|
||||
* event type expected for this node.
|
||||
*
|
||||
* @author Robin Collier
|
||||
*/
|
||||
class EventContentFilter extends FlexibleStanzaTypeFilter<Message>
|
||||
{
|
||||
private final String firstElement;
|
||||
private final String secondElement;
|
||||
private final boolean allowEmpty;
|
||||
|
||||
EventContentFilter(String elementName)
|
||||
{
|
||||
EventContentFilter(String elementName)
|
||||
{
|
||||
this(elementName, null);
|
||||
}
|
||||
}
|
||||
|
||||
EventContentFilter(String firstLevelEelement, String secondLevelElement)
|
||||
{
|
||||
firstElement = firstLevelEelement;
|
||||
secondElement = secondLevelElement;
|
||||
EventContentFilter(String firstLevelEelement, String secondLevelElement)
|
||||
{
|
||||
firstElement = firstLevelEelement;
|
||||
secondElement = secondLevelElement;
|
||||
allowEmpty = firstElement.equals(EventElementType.items.toString())
|
||||
&& "item".equals(secondLevelElement);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean acceptSpecific(Message message) {
|
||||
EventElement event = EventElement.from(message);
|
||||
|
||||
if (event == null)
|
||||
return false;
|
||||
if (event == null)
|
||||
return false;
|
||||
|
||||
NodeExtension embedEvent = event.getEvent();
|
||||
NodeExtension embedEvent = event.getEvent();
|
||||
|
||||
if (embedEvent == null)
|
||||
return false;
|
||||
if (embedEvent == null)
|
||||
return false;
|
||||
|
||||
if (embedEvent.getElementName().equals(firstElement))
|
||||
{
|
||||
if (!embedEvent.getNode().equals(getId()))
|
||||
return false;
|
||||
if (embedEvent.getElementName().equals(firstElement))
|
||||
{
|
||||
if (!embedEvent.getNode().equals(getId()))
|
||||
return false;
|
||||
|
||||
if (secondElement == null)
|
||||
return true;
|
||||
if (secondElement == null)
|
||||
return true;
|
||||
|
||||
if (embedEvent instanceof EmbeddedPacketExtension)
|
||||
{
|
||||
List<ExtensionElement> secondLevelList = ((EmbeddedPacketExtension)embedEvent).getExtensions();
|
||||
if (embedEvent instanceof EmbeddedPacketExtension)
|
||||
{
|
||||
List<ExtensionElement> secondLevelList = ((EmbeddedPacketExtension)embedEvent).getExtensions();
|
||||
|
||||
// XEP-0060 allows no elements on second level for notifications. See schema or
|
||||
// for example § 4.3:
|
||||
|
@ -746,11 +742,11 @@ abstract public class Node
|
|||
return true;
|
||||
}
|
||||
|
||||
if (secondLevelList.size() > 0 && secondLevelList.get(0).getElementName().equals(secondElement))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (secondLevelList.size() > 0 && secondLevelList.get(0).getElementName().equals(secondElement))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,15 +18,15 @@ package org.jivesoftware.smackx.pubsub;
|
|||
|
||||
abstract public class NodeEvent
|
||||
{
|
||||
private String nodeId;
|
||||
private String nodeId;
|
||||
|
||||
protected NodeEvent(String id)
|
||||
{
|
||||
nodeId = id;
|
||||
}
|
||||
protected NodeEvent(String id)
|
||||
{
|
||||
nodeId = id;
|
||||
}
|
||||
|
||||
public String getNodeId()
|
||||
{
|
||||
return nodeId;
|
||||
}
|
||||
public String getNodeId()
|
||||
{
|
||||
return nodeId;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,61 +28,61 @@ import org.jivesoftware.smack.packet.ExtensionElement;
|
|||
*/
|
||||
public class NodeExtension implements ExtensionElement
|
||||
{
|
||||
private final PubSubElementType element;
|
||||
private final String node;
|
||||
private final PubSubElementType element;
|
||||
private final String node;
|
||||
|
||||
/**
|
||||
* Constructs a <tt>NodeExtension</tt> with an element name specified
|
||||
* by {@link PubSubElementType} and the specified node id.
|
||||
*
|
||||
* @param elem Defines the element name and namespace
|
||||
* @param nodeId Specifies the id of the node
|
||||
*/
|
||||
public NodeExtension(PubSubElementType elem, String nodeId)
|
||||
{
|
||||
element = elem;
|
||||
this.node = nodeId;
|
||||
}
|
||||
/**
|
||||
* Constructs a <tt>NodeExtension</tt> with an element name specified
|
||||
* by {@link PubSubElementType} and the specified node id.
|
||||
*
|
||||
* @param elem Defines the element name and namespace
|
||||
* @param nodeId Specifies the id of the node
|
||||
*/
|
||||
public NodeExtension(PubSubElementType elem, String nodeId)
|
||||
{
|
||||
element = elem;
|
||||
this.node = nodeId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <tt>NodeExtension</tt> with an element name specified
|
||||
* by {@link PubSubElementType}.
|
||||
*
|
||||
* @param elem Defines the element name and namespace
|
||||
*/
|
||||
public NodeExtension(PubSubElementType elem)
|
||||
{
|
||||
this(elem, null);
|
||||
}
|
||||
/**
|
||||
* Constructs a <tt>NodeExtension</tt> with an element name specified
|
||||
* by {@link PubSubElementType}.
|
||||
*
|
||||
* @param elem Defines the element name and namespace
|
||||
*/
|
||||
public NodeExtension(PubSubElementType elem)
|
||||
{
|
||||
this(elem, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the node id.
|
||||
*
|
||||
* @return The node id
|
||||
*/
|
||||
public String getNode()
|
||||
{
|
||||
return node;
|
||||
}
|
||||
/**
|
||||
* Gets the node id.
|
||||
*
|
||||
* @return The node id
|
||||
*/
|
||||
public String getNode()
|
||||
{
|
||||
return node;
|
||||
}
|
||||
|
||||
public String getElementName()
|
||||
{
|
||||
return element.getElementName();
|
||||
}
|
||||
public String getElementName()
|
||||
{
|
||||
return element.getElementName();
|
||||
}
|
||||
|
||||
public String getNamespace()
|
||||
{
|
||||
return element.getNamespace().getXmlns();
|
||||
}
|
||||
public String getNamespace()
|
||||
{
|
||||
return element.getNamespace().getXmlns();
|
||||
}
|
||||
|
||||
public CharSequence toXML()
|
||||
{
|
||||
return '<' + getElementName() + (node == null ? "" : " node='" + node + '\'') + "/>";
|
||||
}
|
||||
public CharSequence toXML()
|
||||
{
|
||||
return '<' + getElementName() + (node == null ? "" : " node='" + node + '\'') + "/>";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " - content [" + toXML() + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " - content [" + toXML() + "]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,6 +23,6 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum NodeType
|
||||
{
|
||||
leaf,
|
||||
collection;
|
||||
leaf,
|
||||
collection;
|
||||
}
|
||||
|
|
|
@ -25,35 +25,35 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
*/
|
||||
public class OptionsExtension extends NodeExtension
|
||||
{
|
||||
protected String jid;
|
||||
protected String id;
|
||||
protected String jid;
|
||||
protected String id;
|
||||
|
||||
public OptionsExtension(String subscriptionJid)
|
||||
{
|
||||
this(subscriptionJid, null, null);
|
||||
}
|
||||
public OptionsExtension(String subscriptionJid)
|
||||
{
|
||||
this(subscriptionJid, null, null);
|
||||
}
|
||||
|
||||
public OptionsExtension(String subscriptionJid, String nodeId)
|
||||
{
|
||||
this(subscriptionJid, nodeId, null);
|
||||
}
|
||||
public OptionsExtension(String subscriptionJid, String nodeId)
|
||||
{
|
||||
this(subscriptionJid, nodeId, null);
|
||||
}
|
||||
|
||||
public OptionsExtension(String jid, String nodeId, String subscriptionId)
|
||||
{
|
||||
super(PubSubElementType.OPTIONS, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
}
|
||||
public OptionsExtension(String jid, String nodeId, String subscriptionId)
|
||||
{
|
||||
super(PubSubElementType.OPTIONS, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
}
|
||||
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XmlStringBuilder toXML() {
|
||||
|
|
|
@ -49,98 +49,98 @@ import org.jivesoftware.smackx.pubsub.provider.ItemProvider;
|
|||
*/
|
||||
public class PayloadItem<E extends ExtensionElement> extends Item
|
||||
{
|
||||
private E payload;
|
||||
private E payload;
|
||||
|
||||
/**
|
||||
* Create an <tt>Item</tt> with no id and a payload The id will be set by the server.
|
||||
*
|
||||
* @param payloadExt A {@link ExtensionElement} which represents the payload data.
|
||||
*/
|
||||
public PayloadItem(E payloadExt)
|
||||
{
|
||||
super();
|
||||
/**
|
||||
* Create an <tt>Item</tt> with no id and a payload The id will be set by the server.
|
||||
*
|
||||
* @param payloadExt A {@link ExtensionElement} which represents the payload data.
|
||||
*/
|
||||
public PayloadItem(E payloadExt)
|
||||
{
|
||||
super();
|
||||
|
||||
if (payloadExt == null)
|
||||
throw new IllegalArgumentException("payload cannot be 'null'");
|
||||
payload = payloadExt;
|
||||
}
|
||||
if (payloadExt == null)
|
||||
throw new IllegalArgumentException("payload cannot be 'null'");
|
||||
payload = payloadExt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id and payload.
|
||||
*
|
||||
* @param itemId The id of this item. It can be null if we want the server to set the id.
|
||||
* @param payloadExt A {@link ExtensionElement} which represents the payload data.
|
||||
*/
|
||||
public PayloadItem(String itemId, E payloadExt)
|
||||
{
|
||||
super(itemId);
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id and payload.
|
||||
*
|
||||
* @param itemId The id of this item. It can be null if we want the server to set the id.
|
||||
* @param payloadExt A {@link ExtensionElement} which represents the payload data.
|
||||
*/
|
||||
public PayloadItem(String itemId, E payloadExt)
|
||||
{
|
||||
super(itemId);
|
||||
|
||||
if (payloadExt == null)
|
||||
throw new IllegalArgumentException("payload cannot be 'null'");
|
||||
payload = payloadExt;
|
||||
}
|
||||
if (payloadExt == null)
|
||||
throw new IllegalArgumentException("payload cannot be 'null'");
|
||||
payload = payloadExt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id, node id and payload.
|
||||
*
|
||||
* <p>
|
||||
* <b>Note:</b> This is not valid for publishing an item to a node, only receiving from
|
||||
* one as part of {@link Message}. If used to create an Item to publish
|
||||
* (via {@link LeafNode#publish(Item)}, the server <i>may</i> return an
|
||||
* error for an invalid packet.
|
||||
* </p>
|
||||
*
|
||||
* @param itemId The id of this item.
|
||||
* @param nodeId The id of the node the item was published to.
|
||||
* @param payloadExt A {@link ExtensionElement} which represents the payload data.
|
||||
*/
|
||||
public PayloadItem(String itemId, String nodeId, E payloadExt)
|
||||
{
|
||||
super(itemId, nodeId);
|
||||
/**
|
||||
* Create an <tt>Item</tt> with an id, node id and payload.
|
||||
*
|
||||
* <p>
|
||||
* <b>Note:</b> This is not valid for publishing an item to a node, only receiving from
|
||||
* one as part of {@link Message}. If used to create an Item to publish
|
||||
* (via {@link LeafNode#publish(Item)}, the server <i>may</i> return an
|
||||
* error for an invalid packet.
|
||||
* </p>
|
||||
*
|
||||
* @param itemId The id of this item.
|
||||
* @param nodeId The id of the node the item was published to.
|
||||
* @param payloadExt A {@link ExtensionElement} which represents the payload data.
|
||||
*/
|
||||
public PayloadItem(String itemId, String nodeId, E payloadExt)
|
||||
{
|
||||
super(itemId, nodeId);
|
||||
|
||||
if (payloadExt == null)
|
||||
throw new IllegalArgumentException("payload cannot be 'null'");
|
||||
payload = payloadExt;
|
||||
}
|
||||
if (payloadExt == null)
|
||||
throw new IllegalArgumentException("payload cannot be 'null'");
|
||||
payload = payloadExt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the payload associated with this <tt>Item</tt>. Customising the payload
|
||||
* parsing from the server can be accomplished as described in {@link ItemProvider}.
|
||||
*
|
||||
* @return The payload as a {@link ExtensionElement}.
|
||||
*/
|
||||
public E getPayload()
|
||||
{
|
||||
return payload;
|
||||
}
|
||||
/**
|
||||
* Get the payload associated with this <tt>Item</tt>. Customising the payload
|
||||
* parsing from the server can be accomplished as described in {@link ItemProvider}.
|
||||
*
|
||||
* @return The payload as a {@link ExtensionElement}.
|
||||
*/
|
||||
public E getPayload()
|
||||
{
|
||||
return payload;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<item");
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<item");
|
||||
|
||||
if (getId() != null)
|
||||
{
|
||||
builder.append(" id='");
|
||||
builder.append(getId());
|
||||
builder.append('\'');
|
||||
}
|
||||
if (getId() != null)
|
||||
{
|
||||
builder.append(" id='");
|
||||
builder.append(getId());
|
||||
builder.append('\'');
|
||||
}
|
||||
|
||||
if (getNode() != null) {
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append('\'');
|
||||
}
|
||||
builder.append('>');
|
||||
builder.append(payload.toXML());
|
||||
builder.append("</item>");
|
||||
builder.append('>');
|
||||
builder.append(payload.toXML());
|
||||
builder.append("</item>");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " | Content [" + toXML() + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + " | Content [" + toXML() + "]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,5 +24,5 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum PresenceState
|
||||
{
|
||||
chat, online, away, xa, dnd
|
||||
chat, online, away, xa, dnd
|
||||
}
|
||||
|
|
|
@ -28,58 +28,58 @@ import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace;
|
|||
*/
|
||||
public enum PubSubElementType
|
||||
{
|
||||
CREATE("create", PubSubNamespace.BASIC),
|
||||
DELETE("delete", PubSubNamespace.OWNER),
|
||||
DELETE_EVENT("delete", PubSubNamespace.EVENT),
|
||||
CONFIGURE("configure", PubSubNamespace.BASIC),
|
||||
CONFIGURE_OWNER("configure", PubSubNamespace.OWNER),
|
||||
CONFIGURATION("configuration", PubSubNamespace.EVENT),
|
||||
OPTIONS("options", PubSubNamespace.BASIC),
|
||||
DEFAULT("default", PubSubNamespace.OWNER),
|
||||
ITEMS("items", PubSubNamespace.BASIC),
|
||||
ITEMS_EVENT("items", PubSubNamespace.EVENT),
|
||||
ITEM("item", PubSubNamespace.BASIC),
|
||||
ITEM_EVENT("item", PubSubNamespace.EVENT),
|
||||
PUBLISH("publish", PubSubNamespace.BASIC),
|
||||
PUBLISH_OPTIONS("publish-options", PubSubNamespace.BASIC),
|
||||
PURGE_OWNER("purge", PubSubNamespace.OWNER),
|
||||
PURGE_EVENT("purge", PubSubNamespace.EVENT),
|
||||
RETRACT("retract", PubSubNamespace.BASIC),
|
||||
AFFILIATIONS("affiliations", PubSubNamespace.BASIC),
|
||||
SUBSCRIBE("subscribe", PubSubNamespace.BASIC),
|
||||
SUBSCRIPTION("subscription", PubSubNamespace.BASIC),
|
||||
SUBSCRIPTIONS("subscriptions", PubSubNamespace.BASIC),
|
||||
UNSUBSCRIBE("unsubscribe", PubSubNamespace.BASIC);
|
||||
CREATE("create", PubSubNamespace.BASIC),
|
||||
DELETE("delete", PubSubNamespace.OWNER),
|
||||
DELETE_EVENT("delete", PubSubNamespace.EVENT),
|
||||
CONFIGURE("configure", PubSubNamespace.BASIC),
|
||||
CONFIGURE_OWNER("configure", PubSubNamespace.OWNER),
|
||||
CONFIGURATION("configuration", PubSubNamespace.EVENT),
|
||||
OPTIONS("options", PubSubNamespace.BASIC),
|
||||
DEFAULT("default", PubSubNamespace.OWNER),
|
||||
ITEMS("items", PubSubNamespace.BASIC),
|
||||
ITEMS_EVENT("items", PubSubNamespace.EVENT),
|
||||
ITEM("item", PubSubNamespace.BASIC),
|
||||
ITEM_EVENT("item", PubSubNamespace.EVENT),
|
||||
PUBLISH("publish", PubSubNamespace.BASIC),
|
||||
PUBLISH_OPTIONS("publish-options", PubSubNamespace.BASIC),
|
||||
PURGE_OWNER("purge", PubSubNamespace.OWNER),
|
||||
PURGE_EVENT("purge", PubSubNamespace.EVENT),
|
||||
RETRACT("retract", PubSubNamespace.BASIC),
|
||||
AFFILIATIONS("affiliations", PubSubNamespace.BASIC),
|
||||
SUBSCRIBE("subscribe", PubSubNamespace.BASIC),
|
||||
SUBSCRIPTION("subscription", PubSubNamespace.BASIC),
|
||||
SUBSCRIPTIONS("subscriptions", PubSubNamespace.BASIC),
|
||||
UNSUBSCRIBE("unsubscribe", PubSubNamespace.BASIC);
|
||||
|
||||
private String eName;
|
||||
private PubSubNamespace nSpace;
|
||||
private String eName;
|
||||
private PubSubNamespace nSpace;
|
||||
|
||||
private PubSubElementType(String elemName, PubSubNamespace ns)
|
||||
{
|
||||
eName = elemName;
|
||||
nSpace = ns;
|
||||
}
|
||||
private PubSubElementType(String elemName, PubSubNamespace ns)
|
||||
{
|
||||
eName = elemName;
|
||||
nSpace = ns;
|
||||
}
|
||||
|
||||
public PubSubNamespace getNamespace()
|
||||
{
|
||||
return nSpace;
|
||||
}
|
||||
public PubSubNamespace getNamespace()
|
||||
{
|
||||
return nSpace;
|
||||
}
|
||||
|
||||
public String getElementName()
|
||||
{
|
||||
return eName;
|
||||
}
|
||||
public String getElementName()
|
||||
{
|
||||
return eName;
|
||||
}
|
||||
|
||||
public static PubSubElementType valueOfFromElemName(String elemName, String namespace)
|
||||
{
|
||||
int index = namespace.lastIndexOf('#');
|
||||
String fragment = (index == -1 ? null : namespace.substring(index+1));
|
||||
public static PubSubElementType valueOfFromElemName(String elemName, String namespace)
|
||||
{
|
||||
int index = namespace.lastIndexOf('#');
|
||||
String fragment = (index == -1 ? null : namespace.substring(index+1));
|
||||
|
||||
if (fragment != null)
|
||||
{
|
||||
return valueOf((elemName + '_' + fragment).toUpperCase(Locale.US));
|
||||
}
|
||||
return valueOf(elemName.toUpperCase(Locale.US).replace('-', '_'));
|
||||
}
|
||||
if (fragment != null)
|
||||
{
|
||||
return valueOf((elemName + '_' + fragment).toUpperCase(Locale.US));
|
||||
}
|
||||
return valueOf(elemName.toUpperCase(Locale.US).replace('-', '_'));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -127,114 +127,114 @@ public final class PubSubManager extends Manager {
|
|||
return pubSubManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a pubsub manager associated to the specified connection where
|
||||
* the pubsub requests require a specific to address for packets.
|
||||
*
|
||||
* @param connection The XMPP connection
|
||||
* @param toAddress The pubsub specific to address (required for some servers)
|
||||
*/
|
||||
PubSubManager(XMPPConnection connection, BareJid toAddress)
|
||||
{
|
||||
super(connection);
|
||||
pubSubService = toAddress;
|
||||
}
|
||||
/**
|
||||
* Create a pubsub manager associated to the specified connection where
|
||||
* the pubsub requests require a specific to address for packets.
|
||||
*
|
||||
* @param connection The XMPP connection
|
||||
* @param toAddress The pubsub specific to address (required for some servers)
|
||||
*/
|
||||
PubSubManager(XMPPConnection connection, BareJid toAddress)
|
||||
{
|
||||
super(connection);
|
||||
pubSubService = toAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an instant node, if supported.
|
||||
*
|
||||
* @return The node that was created
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public LeafNode createNode() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub reply = sendPubsubPacket(Type.set, new NodeExtension(PubSubElementType.CREATE), null);
|
||||
NodeExtension elem = reply.getExtension("create", PubSubNamespace.BASIC.getXmlns());
|
||||
/**
|
||||
* Creates an instant node, if supported.
|
||||
*
|
||||
* @return The node that was created
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public LeafNode createNode() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub reply = sendPubsubPacket(Type.set, new NodeExtension(PubSubElementType.CREATE), null);
|
||||
NodeExtension elem = reply.getExtension("create", PubSubNamespace.BASIC.getXmlns());
|
||||
|
||||
LeafNode newNode = new LeafNode(this, elem.getNode());
|
||||
nodeMap.put(newNode.getId(), newNode);
|
||||
LeafNode newNode = new LeafNode(this, elem.getNode());
|
||||
nodeMap.put(newNode.getId(), newNode);
|
||||
|
||||
return newNode;
|
||||
}
|
||||
return newNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a node with default configuration.
|
||||
*
|
||||
* @param nodeId The id of the node, which must be unique within the
|
||||
* pubsub service
|
||||
* @return The node that was created
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public LeafNode createNode(String nodeId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return (LeafNode) createNode(nodeId, null);
|
||||
}
|
||||
/**
|
||||
* Creates a node with default configuration.
|
||||
*
|
||||
* @param nodeId The id of the node, which must be unique within the
|
||||
* pubsub service
|
||||
* @return The node that was created
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public LeafNode createNode(String nodeId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
return (LeafNode) createNode(nodeId, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a node with specified configuration.
|
||||
*
|
||||
* Note: This is the only way to create a collection node.
|
||||
*
|
||||
* @param nodeId The name of the node, which must be unique within the
|
||||
* pubsub service
|
||||
* @param config The configuration for the node
|
||||
* @return The node that was created
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public Node createNode(String nodeId, Form config) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = PubSub.createPubsubPacket(pubSubService, Type.set, new NodeExtension(PubSubElementType.CREATE, nodeId), null);
|
||||
boolean isLeafNode = true;
|
||||
/**
|
||||
* Creates a node with specified configuration.
|
||||
*
|
||||
* Note: This is the only way to create a collection node.
|
||||
*
|
||||
* @param nodeId The name of the node, which must be unique within the
|
||||
* pubsub service
|
||||
* @param config The configuration for the node
|
||||
* @return The node that was created
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public Node createNode(String nodeId, Form config) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub request = PubSub.createPubsubPacket(pubSubService, Type.set, new NodeExtension(PubSubElementType.CREATE, nodeId), null);
|
||||
boolean isLeafNode = true;
|
||||
|
||||
if (config != null)
|
||||
{
|
||||
request.addExtension(new FormNode(FormNodeType.CONFIGURE, config));
|
||||
FormField nodeTypeField = config.getField(ConfigureNodeFields.node_type.getFieldName());
|
||||
if (config != null)
|
||||
{
|
||||
request.addExtension(new FormNode(FormNodeType.CONFIGURE, config));
|
||||
FormField nodeTypeField = config.getField(ConfigureNodeFields.node_type.getFieldName());
|
||||
|
||||
if (nodeTypeField != null)
|
||||
isLeafNode = nodeTypeField.getValues().get(0).equals(NodeType.leaf.toString());
|
||||
}
|
||||
if (nodeTypeField != null)
|
||||
isLeafNode = nodeTypeField.getValues().get(0).equals(NodeType.leaf.toString());
|
||||
}
|
||||
|
||||
// Errors will cause exceptions in getReply, so it only returns
|
||||
// on success.
|
||||
sendPubsubPacket(request);
|
||||
Node newNode = isLeafNode ? new LeafNode(this, nodeId) : new CollectionNode(this, nodeId);
|
||||
nodeMap.put(newNode.getId(), newNode);
|
||||
// Errors will cause exceptions in getReply, so it only returns
|
||||
// on success.
|
||||
sendPubsubPacket(request);
|
||||
Node newNode = isLeafNode ? new LeafNode(this, nodeId) : new CollectionNode(this, nodeId);
|
||||
nodeMap.put(newNode.getId(), newNode);
|
||||
|
||||
return newNode;
|
||||
}
|
||||
return newNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the requested node, if it exists. It will throw an
|
||||
* exception if it does not.
|
||||
*
|
||||
* @param id - The unique id of the node
|
||||
* @return the node
|
||||
* @throws XMPPErrorException The node does not exist
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
/**
|
||||
* Retrieves the requested node, if it exists. It will throw an
|
||||
* exception if it does not.
|
||||
*
|
||||
* @param id - The unique id of the node
|
||||
* @return the node
|
||||
* @throws XMPPErrorException The node does not exist
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public <T extends Node> T getNode(String id) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Node node = nodeMap.get(id);
|
||||
{
|
||||
Node node = nodeMap.get(id);
|
||||
|
||||
if (node == null)
|
||||
{
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
info.setTo(pubSubService);
|
||||
info.setNode(id);
|
||||
if (node == null)
|
||||
{
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
info.setTo(pubSubService);
|
||||
info.setNode(id);
|
||||
|
||||
DiscoverInfo infoReply = connection().createStanzaCollectorAndSend(info).nextResultOrThrow();
|
||||
DiscoverInfo infoReply = connection().createStanzaCollectorAndSend(info).nextResultOrThrow();
|
||||
|
||||
if (infoReply.hasIdentity(PubSub.ELEMENT, "leaf")) {
|
||||
node = new LeafNode(this, id);
|
||||
|
@ -253,104 +253,104 @@ public final class PubSubManager extends Manager {
|
|||
+ id
|
||||
+ "', but it did not contain an Identity of type 'leaf' or 'collection' (and category 'pubsub'), which is not allowed according to XEP-60 5.3.");
|
||||
}
|
||||
nodeMap.put(id, node);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
T res = (T) node;
|
||||
return res;
|
||||
}
|
||||
nodeMap.put(id, node);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
T res = (T) node;
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the nodes that currently exist as a child of the specified
|
||||
* collection node. If the service does not support collection nodes
|
||||
* then all nodes will be returned.
|
||||
*
|
||||
* To retrieve contents of the root collection node (if it exists),
|
||||
* or there is no root collection node, pass null as the nodeId.
|
||||
*
|
||||
* @param nodeId - The id of the collection node for which the child
|
||||
* nodes will be returned.
|
||||
* @return {@link DiscoverItems} representing the existing nodes
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverItems discoverNodes(String nodeId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
DiscoverItems items = new DiscoverItems();
|
||||
/**
|
||||
* Get all the nodes that currently exist as a child of the specified
|
||||
* collection node. If the service does not support collection nodes
|
||||
* then all nodes will be returned.
|
||||
*
|
||||
* To retrieve contents of the root collection node (if it exists),
|
||||
* or there is no root collection node, pass null as the nodeId.
|
||||
*
|
||||
* @param nodeId - The id of the collection node for which the child
|
||||
* nodes will be returned.
|
||||
* @return {@link DiscoverItems} representing the existing nodes
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException if there was no response from the server.
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverItems discoverNodes(String nodeId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
DiscoverItems items = new DiscoverItems();
|
||||
|
||||
if (nodeId != null)
|
||||
items.setNode(nodeId);
|
||||
items.setTo(pubSubService);
|
||||
DiscoverItems nodeItems = connection().createStanzaCollectorAndSend(items).nextResultOrThrow();
|
||||
return nodeItems;
|
||||
}
|
||||
if (nodeId != null)
|
||||
items.setNode(nodeId);
|
||||
items.setTo(pubSubService);
|
||||
DiscoverItems nodeItems = connection().createStanzaCollectorAndSend(items).nextResultOrThrow();
|
||||
return nodeItems;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the subscriptions on the root node.
|
||||
*
|
||||
* @return List of exceptions
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public List<Subscription> getSubscriptions() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Stanza reply = sendPubsubPacket(Type.get, new NodeExtension(PubSubElementType.SUBSCRIPTIONS), null);
|
||||
SubscriptionsExtension subElem = reply.getExtension(PubSubElementType.SUBSCRIPTIONS.getElementName(), PubSubElementType.SUBSCRIPTIONS.getNamespace().getXmlns());
|
||||
return subElem.getSubscriptions();
|
||||
}
|
||||
/**
|
||||
* Gets the subscriptions on the root node.
|
||||
*
|
||||
* @return List of exceptions
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public List<Subscription> getSubscriptions() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
Stanza reply = sendPubsubPacket(Type.get, new NodeExtension(PubSubElementType.SUBSCRIPTIONS), null);
|
||||
SubscriptionsExtension subElem = reply.getExtension(PubSubElementType.SUBSCRIPTIONS.getElementName(), PubSubElementType.SUBSCRIPTIONS.getNamespace().getXmlns());
|
||||
return subElem.getSubscriptions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the affiliations on the root node.
|
||||
*
|
||||
* @return List of affiliations
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public List<Affiliation> getAffiliations() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub reply = sendPubsubPacket(Type.get, new NodeExtension(PubSubElementType.AFFILIATIONS), null);
|
||||
AffiliationsExtension listElem = reply.getExtension(PubSubElementType.AFFILIATIONS);
|
||||
return listElem.getAffiliations();
|
||||
}
|
||||
/**
|
||||
* Gets the affiliations on the root node.
|
||||
*
|
||||
* @return List of affiliations
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*
|
||||
*/
|
||||
public List<Affiliation> getAffiliations() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
PubSub reply = sendPubsubPacket(Type.get, new NodeExtension(PubSubElementType.AFFILIATIONS), null);
|
||||
AffiliationsExtension listElem = reply.getExtension(PubSubElementType.AFFILIATIONS);
|
||||
return listElem.getAffiliations();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the specified node.
|
||||
*
|
||||
* @param nodeId
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteNode(String nodeId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
sendPubsubPacket(Type.set, new NodeExtension(PubSubElementType.DELETE, nodeId), PubSubElementType.DELETE.getNamespace());
|
||||
nodeMap.remove(nodeId);
|
||||
}
|
||||
/**
|
||||
* Delete the specified node.
|
||||
*
|
||||
* @param nodeId
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public void deleteNode(String nodeId) throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
sendPubsubPacket(Type.set, new NodeExtension(PubSubElementType.DELETE, nodeId), PubSubElementType.DELETE.getNamespace());
|
||||
nodeMap.remove(nodeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default settings for Node configuration.
|
||||
*
|
||||
* @return configuration form containing the default settings.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public ConfigureForm getDefaultConfiguration() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
// Errors will cause exceptions in getReply, so it only returns
|
||||
// on success.
|
||||
PubSub reply = sendPubsubPacket(Type.get, new NodeExtension(PubSubElementType.DEFAULT), PubSubElementType.DEFAULT.getNamespace());
|
||||
return NodeUtils.getFormFromPacket(reply, PubSubElementType.DEFAULT);
|
||||
}
|
||||
/**
|
||||
* Returns the default settings for Node configuration.
|
||||
*
|
||||
* @return configuration form containing the default settings.
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public ConfigureForm getDefaultConfiguration() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
// Errors will cause exceptions in getReply, so it only returns
|
||||
// on success.
|
||||
PubSub reply = sendPubsubPacket(Type.get, new NodeExtension(PubSubElementType.DEFAULT), PubSubElementType.DEFAULT.getNamespace());
|
||||
return NodeUtils.getFormFromPacket(reply, PubSubElementType.DEFAULT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the JID of the PubSub service managed by this manager.
|
||||
|
@ -361,21 +361,21 @@ public final class PubSubManager extends Manager {
|
|||
return pubSubService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the supported features of the servers pubsub implementation
|
||||
* as a standard {@link DiscoverInfo} instance.
|
||||
*
|
||||
* @return The supported features
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverInfo getSupportedFeatures() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
ServiceDiscoveryManager mgr = ServiceDiscoveryManager.getInstanceFor(connection());
|
||||
return mgr.discoverInfo(pubSubService);
|
||||
}
|
||||
/**
|
||||
* Gets the supported features of the servers pubsub implementation
|
||||
* as a standard {@link DiscoverInfo} instance.
|
||||
*
|
||||
* @return The supported features
|
||||
* @throws XMPPErrorException
|
||||
* @throws NoResponseException
|
||||
* @throws NotConnectedException
|
||||
* @throws InterruptedException
|
||||
*/
|
||||
public DiscoverInfo getSupportedFeatures() throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException
|
||||
{
|
||||
ServiceDiscoveryManager mgr = ServiceDiscoveryManager.getInstanceFor(connection());
|
||||
return mgr.discoverInfo(pubSubService);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if it is possible to create PubSub nodes on this service. It could be possible that the
|
||||
|
@ -424,13 +424,13 @@ public final class PubSubManager extends Manager {
|
|||
throws NoResponseException, XMPPErrorException, NotConnectedException,
|
||||
InterruptedException {
|
||||
// CHECKSTYLE:OFF
|
||||
PubSub pubSub = new PubSub(to, type, ns);
|
||||
for (ExtensionElement pe : extList) {
|
||||
pubSub.addExtension(pe);
|
||||
}
|
||||
PubSub pubSub = new PubSub(to, type, ns);
|
||||
for (ExtensionElement pe : extList) {
|
||||
pubSub.addExtension(pe);
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
return sendPubsubPacket(pubSub);
|
||||
}
|
||||
}
|
||||
|
||||
PubSub sendPubsubPacket(PubSub packet) throws NoResponseException, XMPPErrorException,
|
||||
NotConnectedException, InterruptedException {
|
||||
|
@ -439,7 +439,7 @@ public final class PubSubManager extends Manager {
|
|||
return null;
|
||||
}
|
||||
return (PubSub) resultIQ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the "default" PubSub service for a given XMPP connection. The default PubSub service is
|
||||
|
|
|
@ -26,48 +26,48 @@ import java.util.Collection;
|
|||
*/
|
||||
public class PublishItem<T extends Item> extends NodeExtension
|
||||
{
|
||||
protected Collection<T> items;
|
||||
protected Collection<T> items;
|
||||
|
||||
/**
|
||||
* Construct a request to publish an item to a node.
|
||||
*
|
||||
* @param nodeId The node to publish to
|
||||
* @param toPublish The {@link Item} to publish
|
||||
*/
|
||||
public PublishItem(String nodeId, T toPublish)
|
||||
{
|
||||
super(PubSubElementType.PUBLISH, nodeId);
|
||||
items = new ArrayList<T>(1);
|
||||
items.add(toPublish);
|
||||
}
|
||||
/**
|
||||
* Construct a request to publish an item to a node.
|
||||
*
|
||||
* @param nodeId The node to publish to
|
||||
* @param toPublish The {@link Item} to publish
|
||||
*/
|
||||
public PublishItem(String nodeId, T toPublish)
|
||||
{
|
||||
super(PubSubElementType.PUBLISH, nodeId);
|
||||
items = new ArrayList<T>(1);
|
||||
items.add(toPublish);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a request to publish multiple items to a node.
|
||||
*
|
||||
* @param nodeId The node to publish to
|
||||
* @param toPublish The list of {@link Item} to publish
|
||||
*/
|
||||
public PublishItem(String nodeId, Collection<T> toPublish)
|
||||
{
|
||||
super(PubSubElementType.PUBLISH, nodeId);
|
||||
items = toPublish;
|
||||
}
|
||||
/**
|
||||
* Construct a request to publish multiple items to a node.
|
||||
*
|
||||
* @param nodeId The node to publish to
|
||||
* @param toPublish The list of {@link Item} to publish
|
||||
*/
|
||||
public PublishItem(String nodeId, Collection<T> toPublish)
|
||||
{
|
||||
super(PubSubElementType.PUBLISH, nodeId);
|
||||
items = toPublish;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append("'>");
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append("'>");
|
||||
|
||||
for (Item item : items)
|
||||
{
|
||||
builder.append(item.toXML());
|
||||
}
|
||||
builder.append("</publish>");
|
||||
for (Item item : items)
|
||||
{
|
||||
builder.append(item.toXML());
|
||||
}
|
||||
builder.append("</publish>");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,12 +24,12 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public enum PublishModel
|
||||
{
|
||||
/** Only publishers may publish. */
|
||||
publishers,
|
||||
/** Only publishers may publish. */
|
||||
publishers,
|
||||
|
||||
/** Only subscribers may publish. */
|
||||
subscribers,
|
||||
/** Only subscribers may publish. */
|
||||
subscribers,
|
||||
|
||||
/** Anyone may publish. */
|
||||
open;
|
||||
/** Anyone may publish. */
|
||||
open;
|
||||
}
|
||||
|
|
|
@ -26,37 +26,37 @@ import org.jivesoftware.smackx.pubsub.packet.PubSubNamespace;
|
|||
*/
|
||||
public class RetractItem implements ExtensionElement
|
||||
{
|
||||
private String id;
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* Construct a <tt>RetractItem</tt> with the specified id.
|
||||
*
|
||||
* @param itemId The id if the item deleted
|
||||
*/
|
||||
public RetractItem(String itemId)
|
||||
{
|
||||
if (itemId == null)
|
||||
throw new IllegalArgumentException("itemId must not be 'null'");
|
||||
id = itemId;
|
||||
}
|
||||
/**
|
||||
* Construct a <tt>RetractItem</tt> with the specified id.
|
||||
*
|
||||
* @param itemId The id if the item deleted
|
||||
*/
|
||||
public RetractItem(String itemId)
|
||||
{
|
||||
if (itemId == null)
|
||||
throw new IllegalArgumentException("itemId must not be 'null'");
|
||||
id = itemId;
|
||||
}
|
||||
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getElementName()
|
||||
{
|
||||
return "retract";
|
||||
}
|
||||
public String getElementName()
|
||||
{
|
||||
return "retract";
|
||||
}
|
||||
|
||||
public String getNamespace()
|
||||
{
|
||||
return PubSubNamespace.EVENT.getXmlns();
|
||||
}
|
||||
public String getNamespace()
|
||||
{
|
||||
return PubSubNamespace.EVENT.getXmlns();
|
||||
}
|
||||
|
||||
public String toXML()
|
||||
{
|
||||
return "<retract id='" + id + "'/>";
|
||||
}
|
||||
public String toXML()
|
||||
{
|
||||
return "<retract id='" + id + "'/>";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,44 +26,44 @@ import org.jivesoftware.smack.packet.ExtensionElement;
|
|||
*/
|
||||
public class SimplePayload implements ExtensionElement
|
||||
{
|
||||
private final String elemName;
|
||||
private final String ns;
|
||||
private final CharSequence payload;
|
||||
private final String elemName;
|
||||
private final String ns;
|
||||
private final CharSequence payload;
|
||||
|
||||
/**
|
||||
* Construct a <tt>SimplePayload</tt> object with the specified element name,
|
||||
* namespace and content. The content must be well formed XML.
|
||||
*
|
||||
* @param elementName The root element name (of the payload)
|
||||
* @param namespace The namespace of the payload, null if there is none
|
||||
* @param xmlPayload The payload data
|
||||
*/
|
||||
public SimplePayload(String elementName, String namespace, CharSequence xmlPayload)
|
||||
{
|
||||
elemName = elementName;
|
||||
payload = xmlPayload;
|
||||
ns = namespace;
|
||||
}
|
||||
/**
|
||||
* Construct a <tt>SimplePayload</tt> object with the specified element name,
|
||||
* namespace and content. The content must be well formed XML.
|
||||
*
|
||||
* @param elementName The root element name (of the payload)
|
||||
* @param namespace The namespace of the payload, null if there is none
|
||||
* @param xmlPayload The payload data
|
||||
*/
|
||||
public SimplePayload(String elementName, String namespace, CharSequence xmlPayload)
|
||||
{
|
||||
elemName = elementName;
|
||||
payload = xmlPayload;
|
||||
ns = namespace;
|
||||
}
|
||||
|
||||
public String getElementName()
|
||||
{
|
||||
return elemName;
|
||||
}
|
||||
public String getElementName()
|
||||
{
|
||||
return elemName;
|
||||
}
|
||||
|
||||
public String getNamespace()
|
||||
{
|
||||
return ns;
|
||||
}
|
||||
public String getNamespace()
|
||||
{
|
||||
return ns;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
return payload;
|
||||
}
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
return payload;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + "payload [" + toXML() + "]";
|
||||
}
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return getClass().getName() + "payload [" + toXML() + "]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,41 +23,41 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public class SubscribeExtension extends NodeExtension
|
||||
{
|
||||
protected String jid;
|
||||
protected String jid;
|
||||
|
||||
public SubscribeExtension(String subscribeJid)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIBE);
|
||||
jid = subscribeJid;
|
||||
}
|
||||
public SubscribeExtension(String subscribeJid)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIBE);
|
||||
jid = subscribeJid;
|
||||
}
|
||||
|
||||
public SubscribeExtension(String subscribeJid, String nodeId)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIBE, nodeId);
|
||||
jid = subscribeJid;
|
||||
}
|
||||
public SubscribeExtension(String subscribeJid, String nodeId)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIBE, nodeId);
|
||||
jid = subscribeJid;
|
||||
}
|
||||
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
@Override
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
|
||||
if (getNode() != null)
|
||||
{
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append('\'');
|
||||
}
|
||||
builder.append(" jid='");
|
||||
builder.append(getJid());
|
||||
builder.append("'/>");
|
||||
if (getNode() != null)
|
||||
{
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append('\'');
|
||||
}
|
||||
builder.append(" jid='");
|
||||
builder.append(getJid());
|
||||
builder.append("'/>");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,202 +40,202 @@ import org.jivesoftware.smackx.xdata.packet.DataForm;
|
|||
*/
|
||||
public class SubscribeForm extends Form
|
||||
{
|
||||
public SubscribeForm(DataForm configDataForm)
|
||||
{
|
||||
super(configDataForm);
|
||||
}
|
||||
public SubscribeForm(DataForm configDataForm)
|
||||
{
|
||||
super(configDataForm);
|
||||
}
|
||||
|
||||
public SubscribeForm(Form subscribeOptionsForm)
|
||||
{
|
||||
super(subscribeOptionsForm.getDataFormToSend());
|
||||
}
|
||||
public SubscribeForm(Form subscribeOptionsForm)
|
||||
{
|
||||
super(subscribeOptionsForm.getDataFormToSend());
|
||||
}
|
||||
|
||||
public SubscribeForm(DataForm.Type formType)
|
||||
{
|
||||
super(formType);
|
||||
}
|
||||
public SubscribeForm(DataForm.Type formType)
|
||||
{
|
||||
super(formType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if an entity wants to receive notifications.
|
||||
*
|
||||
* @return true if want to receive, false otherwise
|
||||
*/
|
||||
public boolean isDeliverOn()
|
||||
{
|
||||
return parseBoolean(getFieldValue(SubscribeOptionFields.deliver));
|
||||
}
|
||||
/**
|
||||
* Determines if an entity wants to receive notifications.
|
||||
*
|
||||
* @return true if want to receive, false otherwise
|
||||
*/
|
||||
public boolean isDeliverOn()
|
||||
{
|
||||
return parseBoolean(getFieldValue(SubscribeOptionFields.deliver));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether an entity wants to receive notifications.
|
||||
*
|
||||
* @param deliverNotifications
|
||||
*/
|
||||
public void setDeliverOn(boolean deliverNotifications)
|
||||
{
|
||||
addField(SubscribeOptionFields.deliver, FormField.Type.bool);
|
||||
setAnswer(SubscribeOptionFields.deliver.getFieldName(), deliverNotifications);
|
||||
}
|
||||
/**
|
||||
* Sets whether an entity wants to receive notifications.
|
||||
*
|
||||
* @param deliverNotifications
|
||||
*/
|
||||
public void setDeliverOn(boolean deliverNotifications)
|
||||
{
|
||||
addField(SubscribeOptionFields.deliver, FormField.Type.bool);
|
||||
setAnswer(SubscribeOptionFields.deliver.getFieldName(), deliverNotifications);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if notifications should be delivered as aggregations or not.
|
||||
*
|
||||
* @return true to aggregate, false otherwise
|
||||
*/
|
||||
public boolean isDigestOn()
|
||||
{
|
||||
return parseBoolean(getFieldValue(SubscribeOptionFields.digest));
|
||||
}
|
||||
/**
|
||||
* Determines if notifications should be delivered as aggregations or not.
|
||||
*
|
||||
* @return true to aggregate, false otherwise
|
||||
*/
|
||||
public boolean isDigestOn()
|
||||
{
|
||||
return parseBoolean(getFieldValue(SubscribeOptionFields.digest));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether notifications should be delivered as aggregations or not.
|
||||
*
|
||||
* @param digestOn true to aggregate, false otherwise
|
||||
*/
|
||||
public void setDigestOn(boolean digestOn)
|
||||
{
|
||||
addField(SubscribeOptionFields.deliver, FormField.Type.bool);
|
||||
setAnswer(SubscribeOptionFields.deliver.getFieldName(), digestOn);
|
||||
}
|
||||
/**
|
||||
* Sets whether notifications should be delivered as aggregations or not.
|
||||
*
|
||||
* @param digestOn true to aggregate, false otherwise
|
||||
*/
|
||||
public void setDigestOn(boolean digestOn)
|
||||
{
|
||||
addField(SubscribeOptionFields.deliver, FormField.Type.bool);
|
||||
setAnswer(SubscribeOptionFields.deliver.getFieldName(), digestOn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the minimum number of milliseconds between sending notification digests.
|
||||
*
|
||||
* @return The frequency in milliseconds
|
||||
*/
|
||||
public int getDigestFrequency()
|
||||
{
|
||||
return Integer.parseInt(getFieldValue(SubscribeOptionFields.digest_frequency));
|
||||
}
|
||||
/**
|
||||
* Gets the minimum number of milliseconds between sending notification digests.
|
||||
*
|
||||
* @return The frequency in milliseconds
|
||||
*/
|
||||
public int getDigestFrequency()
|
||||
{
|
||||
return Integer.parseInt(getFieldValue(SubscribeOptionFields.digest_frequency));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the minimum number of milliseconds between sending notification digests.
|
||||
*
|
||||
* @param frequency The frequency in milliseconds
|
||||
*/
|
||||
public void setDigestFrequency(int frequency)
|
||||
{
|
||||
addField(SubscribeOptionFields.digest_frequency, FormField.Type.text_single);
|
||||
setAnswer(SubscribeOptionFields.digest_frequency.getFieldName(), frequency);
|
||||
}
|
||||
/**
|
||||
* Sets the minimum number of milliseconds between sending notification digests.
|
||||
*
|
||||
* @param frequency The frequency in milliseconds
|
||||
*/
|
||||
public void setDigestFrequency(int frequency)
|
||||
{
|
||||
addField(SubscribeOptionFields.digest_frequency, FormField.Type.text_single);
|
||||
setAnswer(SubscribeOptionFields.digest_frequency.getFieldName(), frequency);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the time at which the leased subscription will expire, or has expired.
|
||||
*
|
||||
* @return The expiry date
|
||||
*/
|
||||
public Date getExpiry()
|
||||
{
|
||||
String dateTime = getFieldValue(SubscribeOptionFields.expire);
|
||||
try
|
||||
{
|
||||
return XmppDateTime.parseDate(dateTime);
|
||||
}
|
||||
catch (ParseException e)
|
||||
{
|
||||
UnknownFormatConversionException exc = new UnknownFormatConversionException(dateTime);
|
||||
exc.initCause(e);
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Get the time at which the leased subscription will expire, or has expired.
|
||||
*
|
||||
* @return The expiry date
|
||||
*/
|
||||
public Date getExpiry()
|
||||
{
|
||||
String dateTime = getFieldValue(SubscribeOptionFields.expire);
|
||||
try
|
||||
{
|
||||
return XmppDateTime.parseDate(dateTime);
|
||||
}
|
||||
catch (ParseException e)
|
||||
{
|
||||
UnknownFormatConversionException exc = new UnknownFormatConversionException(dateTime);
|
||||
exc.initCause(e);
|
||||
throw exc;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the time at which the leased subscription will expire, or has expired.
|
||||
*
|
||||
* @param expire The expiry date
|
||||
*/
|
||||
public void setExpiry(Date expire)
|
||||
{
|
||||
addField(SubscribeOptionFields.expire, FormField.Type.text_single);
|
||||
setAnswer(SubscribeOptionFields.expire.getFieldName(), XmppDateTime.formatXEP0082Date(expire));
|
||||
}
|
||||
/**
|
||||
* Sets the time at which the leased subscription will expire, or has expired.
|
||||
*
|
||||
* @param expire The expiry date
|
||||
*/
|
||||
public void setExpiry(Date expire)
|
||||
{
|
||||
addField(SubscribeOptionFields.expire, FormField.Type.text_single);
|
||||
setAnswer(SubscribeOptionFields.expire.getFieldName(), XmppDateTime.formatXEP0082Date(expire));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether the entity wants to receive an XMPP message body in
|
||||
* addition to the payload format.
|
||||
*
|
||||
* @return true to receive the message body, false otherwise
|
||||
*/
|
||||
public boolean isIncludeBody()
|
||||
{
|
||||
return parseBoolean(getFieldValue(SubscribeOptionFields.include_body));
|
||||
}
|
||||
/**
|
||||
* Determines whether the entity wants to receive an XMPP message body in
|
||||
* addition to the payload format.
|
||||
*
|
||||
* @return true to receive the message body, false otherwise
|
||||
*/
|
||||
public boolean isIncludeBody()
|
||||
{
|
||||
return parseBoolean(getFieldValue(SubscribeOptionFields.include_body));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether the entity wants to receive an XMPP message body in
|
||||
* addition to the payload format.
|
||||
*
|
||||
* @param include true to receive the message body, false otherwise
|
||||
*/
|
||||
public void setIncludeBody(boolean include)
|
||||
{
|
||||
addField(SubscribeOptionFields.include_body, FormField.Type.bool);
|
||||
setAnswer(SubscribeOptionFields.include_body.getFieldName(), include);
|
||||
}
|
||||
/**
|
||||
* Sets whether the entity wants to receive an XMPP message body in
|
||||
* addition to the payload format.
|
||||
*
|
||||
* @param include true to receive the message body, false otherwise
|
||||
*/
|
||||
public void setIncludeBody(boolean include)
|
||||
{
|
||||
addField(SubscribeOptionFields.include_body, FormField.Type.bool);
|
||||
setAnswer(SubscribeOptionFields.include_body.getFieldName(), include);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the {@link PresenceState} for which an entity wants to receive
|
||||
* notifications.
|
||||
*
|
||||
* @return the list of states
|
||||
*/
|
||||
public List<PresenceState> getShowValues()
|
||||
{
|
||||
ArrayList<PresenceState> result = new ArrayList<PresenceState>(5);
|
||||
/**
|
||||
* Gets the {@link PresenceState} for which an entity wants to receive
|
||||
* notifications.
|
||||
*
|
||||
* @return the list of states
|
||||
*/
|
||||
public List<PresenceState> getShowValues()
|
||||
{
|
||||
ArrayList<PresenceState> result = new ArrayList<PresenceState>(5);
|
||||
|
||||
for (String state : getFieldValues(SubscribeOptionFields.show_values))
|
||||
{
|
||||
result.add(PresenceState.valueOf(state));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
for (String state : getFieldValues(SubscribeOptionFields.show_values))
|
||||
{
|
||||
result.add(PresenceState.valueOf(state));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the list of {@link PresenceState} for which an entity wants
|
||||
* to receive notifications.
|
||||
*
|
||||
* @param stateValues The list of states
|
||||
*/
|
||||
public void setShowValues(Collection<PresenceState> stateValues)
|
||||
{
|
||||
ArrayList<String> values = new ArrayList<String>(stateValues.size());
|
||||
/**
|
||||
* Sets the list of {@link PresenceState} for which an entity wants
|
||||
* to receive notifications.
|
||||
*
|
||||
* @param stateValues The list of states
|
||||
*/
|
||||
public void setShowValues(Collection<PresenceState> stateValues)
|
||||
{
|
||||
ArrayList<String> values = new ArrayList<String>(stateValues.size());
|
||||
|
||||
for (PresenceState state : stateValues)
|
||||
{
|
||||
values.add(state.toString());
|
||||
}
|
||||
addField(SubscribeOptionFields.show_values, FormField.Type.list_multi);
|
||||
setAnswer(SubscribeOptionFields.show_values.getFieldName(), values);
|
||||
}
|
||||
for (PresenceState state : stateValues)
|
||||
{
|
||||
values.add(state.toString());
|
||||
}
|
||||
addField(SubscribeOptionFields.show_values, FormField.Type.list_multi);
|
||||
setAnswer(SubscribeOptionFields.show_values.getFieldName(), values);
|
||||
}
|
||||
|
||||
|
||||
static private boolean parseBoolean(String fieldValue)
|
||||
{
|
||||
return ("1".equals(fieldValue) || "true".equals(fieldValue));
|
||||
}
|
||||
static private boolean parseBoolean(String fieldValue)
|
||||
{
|
||||
return ("1".equals(fieldValue) || "true".equals(fieldValue));
|
||||
}
|
||||
|
||||
private String getFieldValue(SubscribeOptionFields field)
|
||||
{
|
||||
FormField formField = getField(field.getFieldName());
|
||||
private String getFieldValue(SubscribeOptionFields field)
|
||||
{
|
||||
FormField formField = getField(field.getFieldName());
|
||||
|
||||
return formField.getValues().get(0);
|
||||
}
|
||||
return formField.getValues().get(0);
|
||||
}
|
||||
|
||||
private List<String> getFieldValues(SubscribeOptionFields field)
|
||||
{
|
||||
FormField formField = getField(field.getFieldName());
|
||||
private List<String> getFieldValues(SubscribeOptionFields field)
|
||||
{
|
||||
FormField formField = getField(field.getFieldName());
|
||||
|
||||
return formField.getValues();
|
||||
}
|
||||
return formField.getValues();
|
||||
}
|
||||
|
||||
private void addField(SubscribeOptionFields nodeField, FormField.Type type)
|
||||
{
|
||||
String fieldName = nodeField.getFieldName();
|
||||
private void addField(SubscribeOptionFields nodeField, FormField.Type type)
|
||||
{
|
||||
String fieldName = nodeField.getFieldName();
|
||||
|
||||
if (getField(fieldName) == null)
|
||||
{
|
||||
FormField field = new FormField(fieldName);
|
||||
field.setType(type);
|
||||
addField(field);
|
||||
}
|
||||
}
|
||||
if (getField(fieldName) == null)
|
||||
{
|
||||
FormField field = new FormField(fieldName);
|
||||
field.setType(type);
|
||||
addField(field);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,77 +26,77 @@ import java.util.Calendar;
|
|||
*/
|
||||
public enum SubscribeOptionFields
|
||||
{
|
||||
/**
|
||||
* Whether an entity wants to receive or disable notifications.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
deliver,
|
||||
/**
|
||||
* Whether an entity wants to receive or disable notifications.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
deliver,
|
||||
|
||||
/**
|
||||
* Whether an entity wants to receive digests (aggregations) of
|
||||
* notifications or all notifications individually.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
digest,
|
||||
/**
|
||||
* Whether an entity wants to receive digests (aggregations) of
|
||||
* notifications or all notifications individually.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
digest,
|
||||
|
||||
/**
|
||||
* The minimum number of seconds between sending any two notifications digests.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
digest_frequency,
|
||||
/**
|
||||
* The minimum number of seconds between sending any two notifications digests.
|
||||
*
|
||||
* <p><b>Value: int</b></p>
|
||||
*/
|
||||
digest_frequency,
|
||||
|
||||
/**
|
||||
* Expire.
|
||||
* <p><b>Value: {@link Calendar}</b></p>
|
||||
*/
|
||||
expire,
|
||||
/**
|
||||
* Expire.
|
||||
* <p><b>Value: {@link Calendar}</b></p>
|
||||
*/
|
||||
expire,
|
||||
|
||||
/**
|
||||
* Whether an entity wants to receive an XMPP message body in addition to
|
||||
* the payload format.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
include_body,
|
||||
/**
|
||||
* Whether an entity wants to receive an XMPP message body in addition to
|
||||
* the payload format.
|
||||
*
|
||||
* <p><b>Value: boolean</b></p>
|
||||
*/
|
||||
include_body,
|
||||
|
||||
/**
|
||||
* The presence states for which an entity wants to receive notifications.
|
||||
*
|
||||
* <p><b>Value: {@link PresenceState}</b></p>
|
||||
*/
|
||||
show_values,
|
||||
/**
|
||||
* The presence states for which an entity wants to receive notifications.
|
||||
*
|
||||
* <p><b>Value: {@link PresenceState}</b></p>
|
||||
*/
|
||||
show_values,
|
||||
|
||||
/**
|
||||
* Subscription type.
|
||||
*
|
||||
* <p><b>Value: </b></p>
|
||||
*/
|
||||
subscription_type,
|
||||
/**
|
||||
* Subscription type.
|
||||
*
|
||||
* <p><b>Value: </b></p>
|
||||
*/
|
||||
subscription_type,
|
||||
|
||||
/**
|
||||
* Subscription depth.
|
||||
*
|
||||
* <p><b>Value: </b></p>
|
||||
*/
|
||||
subscription_depth;
|
||||
/**
|
||||
* Subscription depth.
|
||||
*
|
||||
* <p><b>Value: </b></p>
|
||||
*/
|
||||
subscription_depth;
|
||||
|
||||
public String getFieldName()
|
||||
{
|
||||
if (this == show_values)
|
||||
return "pubsub#" + toString().replace('_', '-');
|
||||
return "pubsub#" + toString();
|
||||
}
|
||||
public String getFieldName()
|
||||
{
|
||||
if (this == show_values)
|
||||
return "pubsub#" + toString().replace('_', '-');
|
||||
return "pubsub#" + toString();
|
||||
}
|
||||
|
||||
static public SubscribeOptionFields valueOfFromElement(String elementName)
|
||||
{
|
||||
String portion = elementName.substring(elementName.lastIndexOf('#' + 1));
|
||||
static public SubscribeOptionFields valueOfFromElement(String elementName)
|
||||
{
|
||||
String portion = elementName.substring(elementName.lastIndexOf('#' + 1));
|
||||
|
||||
if ("show-values".equals(portion))
|
||||
return show_values;
|
||||
else
|
||||
return valueOf(portion);
|
||||
}
|
||||
if ("show-values".equals(portion))
|
||||
return show_values;
|
||||
else
|
||||
return valueOf(portion);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,141 +23,141 @@ package org.jivesoftware.smackx.pubsub;
|
|||
*/
|
||||
public class Subscription extends NodeExtension
|
||||
{
|
||||
protected String jid;
|
||||
protected String id;
|
||||
protected State state;
|
||||
protected boolean configRequired = false;
|
||||
protected String jid;
|
||||
protected String id;
|
||||
protected State state;
|
||||
protected boolean configRequired = false;
|
||||
|
||||
public enum State
|
||||
{
|
||||
subscribed, unconfigured, pending, none
|
||||
}
|
||||
public enum State
|
||||
{
|
||||
subscribed, unconfigured, pending, none
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to constructs a subscription request to the root node with the specified
|
||||
* JID.
|
||||
*
|
||||
* @param subscriptionJid The subscriber JID
|
||||
*/
|
||||
public Subscription(String subscriptionJid)
|
||||
{
|
||||
this(subscriptionJid, null, null, null);
|
||||
}
|
||||
/**
|
||||
* Used to constructs a subscription request to the root node with the specified
|
||||
* JID.
|
||||
*
|
||||
* @param subscriptionJid The subscriber JID
|
||||
*/
|
||||
public Subscription(String subscriptionJid)
|
||||
{
|
||||
this(subscriptionJid, null, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to constructs a subscription request to the specified node with the specified
|
||||
* JID.
|
||||
*
|
||||
* @param subscriptionJid The subscriber JID
|
||||
* @param nodeId The node id
|
||||
*/
|
||||
public Subscription(String subscriptionJid, String nodeId)
|
||||
{
|
||||
this(subscriptionJid, nodeId, null, null);
|
||||
}
|
||||
/**
|
||||
* Used to constructs a subscription request to the specified node with the specified
|
||||
* JID.
|
||||
*
|
||||
* @param subscriptionJid The subscriber JID
|
||||
* @param nodeId The node id
|
||||
*/
|
||||
public Subscription(String subscriptionJid, String nodeId)
|
||||
{
|
||||
this(subscriptionJid, nodeId, null, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a representation of a subscription reply to the specified node
|
||||
* and JID. The server will have supplied the subscription id and current state.
|
||||
*
|
||||
* @param jid The JID the request was made under
|
||||
* @param nodeId The node subscribed to
|
||||
* @param subscriptionId The id of this subscription
|
||||
* @param state The current state of the subscription
|
||||
*/
|
||||
public Subscription(String jid, String nodeId, String subscriptionId, State state)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTION, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
this.state = state;
|
||||
}
|
||||
/**
|
||||
* Constructs a representation of a subscription reply to the specified node
|
||||
* and JID. The server will have supplied the subscription id and current state.
|
||||
*
|
||||
* @param jid The JID the request was made under
|
||||
* @param nodeId The node subscribed to
|
||||
* @param subscriptionId The id of this subscription
|
||||
* @param state The current state of the subscription
|
||||
*/
|
||||
public Subscription(String jid, String nodeId, String subscriptionId, State state)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTION, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a representation of a subscription reply to the specified node
|
||||
* and JID. The server will have supplied the subscription id and current state
|
||||
* and whether the subscription need to be configured.
|
||||
*
|
||||
* @param jid The JID the request was made under
|
||||
* @param nodeId The node subscribed to
|
||||
* @param subscriptionId The id of this subscription
|
||||
* @param state The current state of the subscription
|
||||
* @param configRequired Is configuration required to complete the subscription
|
||||
*/
|
||||
public Subscription(String jid, String nodeId, String subscriptionId, State state, boolean configRequired)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTION, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
this.state = state;
|
||||
this.configRequired = configRequired;
|
||||
}
|
||||
/**
|
||||
* Constructs a representation of a subscription reply to the specified node
|
||||
* and JID. The server will have supplied the subscription id and current state
|
||||
* and whether the subscription need to be configured.
|
||||
*
|
||||
* @param jid The JID the request was made under
|
||||
* @param nodeId The node subscribed to
|
||||
* @param subscriptionId The id of this subscription
|
||||
* @param state The current state of the subscription
|
||||
* @param configRequired Is configuration required to complete the subscription
|
||||
*/
|
||||
public Subscription(String jid, String nodeId, String subscriptionId, State state, boolean configRequired)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTION, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
this.state = state;
|
||||
this.configRequired = configRequired;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the JID the subscription is created for.
|
||||
*
|
||||
* @return The JID
|
||||
*/
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
/**
|
||||
* Gets the JID the subscription is created for.
|
||||
*
|
||||
* @return The JID
|
||||
*/
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the subscription id.
|
||||
*
|
||||
* @return The subscription id
|
||||
*/
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
/**
|
||||
* Gets the subscription id.
|
||||
*
|
||||
* @return The subscription id
|
||||
*/
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the current subscription state.
|
||||
*
|
||||
* @return Current subscription state
|
||||
*/
|
||||
public State getState()
|
||||
{
|
||||
return state;
|
||||
}
|
||||
/**
|
||||
* Gets the current subscription state.
|
||||
*
|
||||
* @return Current subscription state
|
||||
*/
|
||||
public State getState()
|
||||
{
|
||||
return state;
|
||||
}
|
||||
|
||||
/**
|
||||
* This value is only relevant when the {@link #getState()} is {@link State#unconfigured}.
|
||||
*
|
||||
* @return true if configuration is required, false otherwise
|
||||
*/
|
||||
public boolean isConfigRequired()
|
||||
{
|
||||
return configRequired;
|
||||
}
|
||||
/**
|
||||
* This value is only relevant when the {@link #getState()} is {@link State#unconfigured}.
|
||||
*
|
||||
* @return true if configuration is required, false otherwise
|
||||
*/
|
||||
public boolean isConfigRequired()
|
||||
{
|
||||
return configRequired;
|
||||
}
|
||||
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<subscription");
|
||||
appendAttribute(builder, "jid", jid);
|
||||
public String toXML()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<subscription");
|
||||
appendAttribute(builder, "jid", jid);
|
||||
|
||||
if (getNode() != null)
|
||||
appendAttribute(builder, "node", getNode());
|
||||
if (getNode() != null)
|
||||
appendAttribute(builder, "node", getNode());
|
||||
|
||||
if (id != null)
|
||||
appendAttribute(builder, "subid", id);
|
||||
if (id != null)
|
||||
appendAttribute(builder, "subid", id);
|
||||
|
||||
if (state != null)
|
||||
appendAttribute(builder, "subscription", state.toString());
|
||||
if (state != null)
|
||||
appendAttribute(builder, "subscription", state.toString());
|
||||
|
||||
builder.append("/>");
|
||||
return builder.toString();
|
||||
}
|
||||
builder.append("/>");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private static void appendAttribute(StringBuilder builder, String att, String value)
|
||||
{
|
||||
builder.append(' ');
|
||||
builder.append(att);
|
||||
builder.append("='");
|
||||
builder.append(value);
|
||||
builder.append('\'');
|
||||
}
|
||||
private static void appendAttribute(StringBuilder builder, String att, String value)
|
||||
{
|
||||
builder.append(' ');
|
||||
builder.append(att);
|
||||
builder.append("='");
|
||||
builder.append(value);
|
||||
builder.append('\'');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -26,53 +26,53 @@ import java.util.List;
|
|||
*/
|
||||
abstract public class SubscriptionEvent extends NodeEvent
|
||||
{
|
||||
private List<String> subIds = Collections.emptyList();
|
||||
private List<String> subIds = Collections.emptyList();
|
||||
|
||||
/**
|
||||
* Construct an event with no subscription id's. This can
|
||||
* occur when there is only one subscription to a node. The
|
||||
* event may or may not report the subscription id along
|
||||
* with the event.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
*/
|
||||
protected SubscriptionEvent(String nodeId)
|
||||
{
|
||||
super(nodeId);
|
||||
}
|
||||
/**
|
||||
* Construct an event with no subscription id's. This can
|
||||
* occur when there is only one subscription to a node. The
|
||||
* event may or may not report the subscription id along
|
||||
* with the event.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
*/
|
||||
protected SubscriptionEvent(String nodeId)
|
||||
{
|
||||
super(nodeId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct an event with multiple subscriptions.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param subscriptionIds The list of subscription id's
|
||||
*/
|
||||
protected SubscriptionEvent(String nodeId, List<String> subscriptionIds)
|
||||
{
|
||||
super(nodeId);
|
||||
/**
|
||||
* Construct an event with multiple subscriptions.
|
||||
*
|
||||
* @param nodeId The id of the node the event came from
|
||||
* @param subscriptionIds The list of subscription id's
|
||||
*/
|
||||
protected SubscriptionEvent(String nodeId, List<String> subscriptionIds)
|
||||
{
|
||||
super(nodeId);
|
||||
|
||||
if (subscriptionIds != null)
|
||||
subIds = subscriptionIds;
|
||||
}
|
||||
if (subscriptionIds != null)
|
||||
subIds = subscriptionIds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the subscriptions this event is associated with.
|
||||
*
|
||||
* @return List of subscription id's
|
||||
*/
|
||||
public List<String> getSubscriptions()
|
||||
{
|
||||
return Collections.unmodifiableList(subIds);
|
||||
}
|
||||
/**
|
||||
* Get the subscriptions this event is associated with.
|
||||
*
|
||||
* @return List of subscription id's
|
||||
*/
|
||||
public List<String> getSubscriptions()
|
||||
{
|
||||
return Collections.unmodifiableList(subIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the list of subscription id's for this event.
|
||||
*
|
||||
* @param subscriptionIds The list of subscription id's
|
||||
*/
|
||||
protected void setSubscriptions(List<String> subscriptionIds)
|
||||
{
|
||||
if (subscriptionIds != null)
|
||||
subIds = subscriptionIds;
|
||||
}
|
||||
/**
|
||||
* Set the list of subscription id's for this event.
|
||||
*
|
||||
* @param subscriptionIds The list of subscription id's
|
||||
*/
|
||||
protected void setSubscriptions(List<String> subscriptionIds)
|
||||
{
|
||||
if (subscriptionIds != null)
|
||||
subIds = subscriptionIds;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,74 +26,74 @@ import java.util.List;
|
|||
*/
|
||||
public class SubscriptionsExtension extends NodeExtension
|
||||
{
|
||||
protected List<Subscription> items = Collections.emptyList();
|
||||
protected List<Subscription> items = Collections.emptyList();
|
||||
|
||||
/**
|
||||
* Subscriptions to the root node.
|
||||
*
|
||||
* @param subList The list of subscriptions
|
||||
*/
|
||||
public SubscriptionsExtension(List<Subscription> subList)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTIONS);
|
||||
/**
|
||||
* Subscriptions to the root node.
|
||||
*
|
||||
* @param subList The list of subscriptions
|
||||
*/
|
||||
public SubscriptionsExtension(List<Subscription> subList)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTIONS);
|
||||
|
||||
if (subList != null)
|
||||
items = subList;
|
||||
}
|
||||
if (subList != null)
|
||||
items = subList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscriptions to the specified node.
|
||||
*
|
||||
* @param nodeId The node subscribed to
|
||||
* @param subList The list of subscriptions
|
||||
*/
|
||||
public SubscriptionsExtension(String nodeId, List<Subscription> subList)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTIONS, nodeId);
|
||||
/**
|
||||
* Subscriptions to the specified node.
|
||||
*
|
||||
* @param nodeId The node subscribed to
|
||||
* @param subList The list of subscriptions
|
||||
*/
|
||||
public SubscriptionsExtension(String nodeId, List<Subscription> subList)
|
||||
{
|
||||
super(PubSubElementType.SUBSCRIPTIONS, nodeId);
|
||||
|
||||
if (subList != null)
|
||||
items = subList;
|
||||
}
|
||||
if (subList != null)
|
||||
items = subList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the list of subscriptions.
|
||||
*
|
||||
* @return List of subscriptions
|
||||
*/
|
||||
public List<Subscription> getSubscriptions()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
/**
|
||||
* Gets the list of subscriptions.
|
||||
*
|
||||
* @return List of subscriptions
|
||||
*/
|
||||
public List<Subscription> getSubscriptions()
|
||||
{
|
||||
return items;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if ((items == null) || (items.size() == 0))
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
@Override
|
||||
public CharSequence toXML()
|
||||
{
|
||||
if ((items == null) || (items.size() == 0))
|
||||
{
|
||||
return super.toXML();
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder builder = new StringBuilder("<");
|
||||
builder.append(getElementName());
|
||||
|
||||
if (getNode() != null)
|
||||
{
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append('\'');
|
||||
}
|
||||
builder.append('>');
|
||||
if (getNode() != null)
|
||||
{
|
||||
builder.append(" node='");
|
||||
builder.append(getNode());
|
||||
builder.append('\'');
|
||||
}
|
||||
builder.append('>');
|
||||
|
||||
for (Subscription item : items)
|
||||
{
|
||||
builder.append(item.toXML());
|
||||
}
|
||||
for (Subscription item : items)
|
||||
{
|
||||
builder.append(item.toXML());
|
||||
}
|
||||
|
||||
builder.append("</");
|
||||
builder.append(getElementName());
|
||||
builder.append('>');
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
builder.append("</");
|
||||
builder.append(getElementName());
|
||||
builder.append('>');
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,35 +26,35 @@ import org.jivesoftware.smack.util.XmlStringBuilder;
|
|||
*/
|
||||
public class UnsubscribeExtension extends NodeExtension
|
||||
{
|
||||
protected String jid;
|
||||
protected String id;
|
||||
protected String jid;
|
||||
protected String id;
|
||||
|
||||
public UnsubscribeExtension(String subscriptionJid)
|
||||
{
|
||||
this(subscriptionJid, null, null);
|
||||
}
|
||||
public UnsubscribeExtension(String subscriptionJid)
|
||||
{
|
||||
this(subscriptionJid, null, null);
|
||||
}
|
||||
|
||||
public UnsubscribeExtension(String subscriptionJid, String nodeId)
|
||||
{
|
||||
this(subscriptionJid, nodeId, null);
|
||||
}
|
||||
public UnsubscribeExtension(String subscriptionJid, String nodeId)
|
||||
{
|
||||
this(subscriptionJid, nodeId, null);
|
||||
}
|
||||
|
||||
public UnsubscribeExtension(String jid, String nodeId, String subscriptionId)
|
||||
{
|
||||
super(PubSubElementType.UNSUBSCRIBE, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
}
|
||||
public UnsubscribeExtension(String jid, String nodeId, String subscriptionId)
|
||||
{
|
||||
super(PubSubElementType.UNSUBSCRIBE, nodeId);
|
||||
this.jid = jid;
|
||||
id = subscriptionId;
|
||||
}
|
||||
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
public String getJid()
|
||||
{
|
||||
return jid;
|
||||
}
|
||||
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
public String getId()
|
||||
{
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XmlStringBuilder toXML() {
|
||||
|
|
|
@ -28,17 +28,17 @@ import org.jivesoftware.smackx.pubsub.LeafNode;
|
|||
*/
|
||||
public interface ItemDeleteListener
|
||||
{
|
||||
/**
|
||||
* Called when items are deleted from a node the listener is
|
||||
* registered with.
|
||||
*
|
||||
* @param items The event with item deletion details
|
||||
*/
|
||||
void handleDeletedItems(ItemDeleteEvent items);
|
||||
/**
|
||||
* Called when items are deleted from a node the listener is
|
||||
* registered with.
|
||||
*
|
||||
* @param items The event with item deletion details
|
||||
*/
|
||||
void handleDeletedItems(ItemDeleteEvent items);
|
||||
|
||||
/**
|
||||
* Called when <b>all</b> items are deleted from a node the listener is
|
||||
* registered with.
|
||||
*/
|
||||
void handlePurge();
|
||||
/**
|
||||
* Called when <b>all</b> items are deleted from a node the listener is
|
||||
* registered with.
|
||||
*/
|
||||
void handlePurge();
|
||||
}
|
||||
|
|
|
@ -29,11 +29,11 @@ import org.jivesoftware.smackx.pubsub.LeafNode;
|
|||
*/
|
||||
public interface ItemEventListener<T extends Item>
|
||||
{
|
||||
/**
|
||||
* Called whenever an item is published to the node the listener
|
||||
* is registered with.
|
||||
*
|
||||
* @param items The publishing details.
|
||||
*/
|
||||
void handlePublishedItems(ItemPublishEvent<T> items);
|
||||
/**
|
||||
* Called whenever an item is published to the node the listener
|
||||
* is registered with.
|
||||
*
|
||||
* @param items The publishing details.
|
||||
*/
|
||||
void handlePublishedItems(ItemPublishEvent<T> items);
|
||||
}
|
||||
|
|
|
@ -28,11 +28,11 @@ import org.jivesoftware.smackx.pubsub.LeafNode;
|
|||
*/
|
||||
public interface NodeConfigListener
|
||||
{
|
||||
/**
|
||||
* Called whenever the node the listener
|
||||
* is registered with is configured.
|
||||
*
|
||||
* @param config The configuration details.
|
||||
*/
|
||||
void handleNodeConfiguration(ConfigurationEvent config);
|
||||
/**
|
||||
* Called whenever the node the listener
|
||||
* is registered with is configured.
|
||||
*
|
||||
* @param config The configuration details.
|
||||
*/
|
||||
void handleNodeConfiguration(ConfigurationEvent config);
|
||||
}
|
||||
|
|
|
@ -33,11 +33,11 @@ public class PubSub extends IQ
|
|||
public static final String ELEMENT = "pubsub";
|
||||
public static final String NAMESPACE = "http://jabber.org/protocol/pubsub";
|
||||
|
||||
public PubSub() {
|
||||
public PubSub() {
|
||||
super(ELEMENT, NAMESPACE);
|
||||
}
|
||||
}
|
||||
|
||||
public PubSub(PubSubNamespace ns) {
|
||||
public PubSub(PubSubNamespace ns) {
|
||||
super(ELEMENT, ns.getXmlns());
|
||||
}
|
||||
|
||||
|
@ -49,9 +49,9 @@ public class PubSub extends IQ
|
|||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <PE extends ExtensionElement> PE getExtension(PubSubElementType elem)
|
||||
{
|
||||
return (PE) getExtension(elem.getElementName(), elem.getNamespace().getXmlns());
|
||||
}
|
||||
{
|
||||
return (PE) getExtension(elem.getElementName(), elem.getNamespace().getXmlns());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the XML representation of a pubsub element according the specification.
|
||||
|
|
|
@ -26,45 +26,45 @@ import java.util.Locale;
|
|||
*/
|
||||
public enum PubSubNamespace
|
||||
{
|
||||
BASIC(null),
|
||||
ERROR("errors"),
|
||||
EVENT("event"),
|
||||
OWNER("owner");
|
||||
BASIC(null),
|
||||
ERROR("errors"),
|
||||
EVENT("event"),
|
||||
OWNER("owner");
|
||||
|
||||
private final String fragment;
|
||||
private final String fullNamespace;
|
||||
|
||||
private PubSubNamespace(String fragment)
|
||||
{
|
||||
this.fragment = fragment;
|
||||
private PubSubNamespace(String fragment)
|
||||
{
|
||||
this.fragment = fragment;
|
||||
if (fragment != null) {
|
||||
fullNamespace = PubSub.NAMESPACE + '#' + fragment;
|
||||
}
|
||||
else {
|
||||
fullNamespace = PubSub.NAMESPACE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getXmlns()
|
||||
{
|
||||
public String getXmlns()
|
||||
{
|
||||
return fullNamespace;
|
||||
}
|
||||
}
|
||||
|
||||
public String getFragment()
|
||||
{
|
||||
return fragment;
|
||||
}
|
||||
public String getFragment()
|
||||
{
|
||||
return fragment;
|
||||
}
|
||||
|
||||
public static PubSubNamespace valueOfFromXmlns(String ns)
|
||||
{
|
||||
int index = ns.lastIndexOf('#');
|
||||
public static PubSubNamespace valueOfFromXmlns(String ns)
|
||||
{
|
||||
int index = ns.lastIndexOf('#');
|
||||
|
||||
if (index != -1)
|
||||
{
|
||||
String suffix = ns.substring(ns.lastIndexOf('#')+1);
|
||||
return valueOf(suffix.toUpperCase(Locale.US));
|
||||
}
|
||||
else
|
||||
return BASIC;
|
||||
}
|
||||
if (index != -1)
|
||||
{
|
||||
String suffix = ns.substring(ns.lastIndexOf('#')+1);
|
||||
return valueOf(suffix.toUpperCase(Locale.US));
|
||||
}
|
||||
else
|
||||
return BASIC;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,11 +31,11 @@ import org.jivesoftware.smackx.pubsub.AffiliationsExtension;
|
|||
* @author Robin Collier
|
||||
*/public class AffiliationsProvider extends EmbeddedExtensionProvider<AffiliationsExtension>
|
||||
{
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected AffiliationsExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected AffiliationsExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new AffiliationsExtension((List<Affiliation>)content);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -33,12 +33,12 @@ import org.jivesoftware.smackx.xdata.packet.DataForm;
|
|||
*/
|
||||
public class ConfigEventProvider extends EmbeddedExtensionProvider<ConfigurationEvent>
|
||||
{
|
||||
@Override
|
||||
protected ConfigurationEvent createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
if (content.size() == 0)
|
||||
return new ConfigurationEvent(attMap.get("node"));
|
||||
else
|
||||
return new ConfigurationEvent(attMap.get("node"), new ConfigureForm((DataForm)content.iterator().next()));
|
||||
}
|
||||
@Override
|
||||
protected ConfigurationEvent createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
if (content.size() == 0)
|
||||
return new ConfigurationEvent(attMap.get("node"));
|
||||
else
|
||||
return new ConfigurationEvent(attMap.get("node"), new ConfigureForm((DataForm)content.iterator().next()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,11 +33,9 @@ import org.jivesoftware.smackx.pubsub.NodeExtension;
|
|||
*/
|
||||
public class EventProvider extends EmbeddedExtensionProvider<EventElement>
|
||||
{
|
||||
@Override
|
||||
protected EventElement createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
// CHECKSTYLE:OFF
|
||||
return new EventElement(EventElementType.valueOf(content.get(0).getElementName()), (NodeExtension)content.get(0));
|
||||
// CHECKSTYLE:ON
|
||||
}
|
||||
@Override
|
||||
protected EventElement createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new EventElement(EventElementType.valueOf(content.get(0).getElementName()), (NodeExtension)content.get(0));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,9 +34,9 @@ import org.jivesoftware.smackx.xdata.packet.DataForm;
|
|||
*/
|
||||
public class FormNodeProvider extends EmbeddedExtensionProvider<FormNode>
|
||||
{
|
||||
@Override
|
||||
protected FormNode createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
@Override
|
||||
protected FormNode createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new FormNode(FormNodeType.valueOfFromElementName(currentElement, currentNamespace), attributeMap.get("node"), new Form((DataForm)content.iterator().next()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,10 +32,10 @@ import org.jivesoftware.smackx.pubsub.ItemsExtension;
|
|||
public class ItemsProvider extends EmbeddedExtensionProvider<ItemsExtension>
|
||||
{
|
||||
|
||||
@Override
|
||||
protected ItemsExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
@Override
|
||||
protected ItemsExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new ItemsExtension(ItemsExtension.ItemsElementType.items, attributeMap.get("node"), content);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -53,5 +53,5 @@ public class PubSubProvider extends IQProvider<PubSub>
|
|||
}
|
||||
}
|
||||
return pubsub;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,10 +32,10 @@ import org.jivesoftware.smackx.pubsub.RetractItem;
|
|||
*/
|
||||
public class RetractEventProvider extends EmbeddedExtensionProvider<RetractItem>
|
||||
{
|
||||
@Override
|
||||
protected RetractItem createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new RetractItem(attributeMap.get("id"));
|
||||
}
|
||||
@Override
|
||||
protected RetractItem createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new RetractItem(attributeMap.get("id"));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,9 +32,9 @@ import org.jivesoftware.smackx.pubsub.PubSubElementType;
|
|||
*/
|
||||
public class SimpleNodeProvider extends EmbeddedExtensionProvider<NodeExtension>
|
||||
{
|
||||
@Override
|
||||
protected NodeExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
@Override
|
||||
protected NodeExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new NodeExtension(PubSubElementType.valueOfFromElemName(currentElement, currentNamespace), attributeMap.get("node"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,25 +34,25 @@ public class SubscriptionProvider extends ExtensionElementProvider<Subscription>
|
|||
@Override
|
||||
public Subscription parse(XmlPullParser parser, int initialDepth)
|
||||
throws XmlPullParserException, IOException {
|
||||
String jid = parser.getAttributeValue(null, "jid");
|
||||
String nodeId = parser.getAttributeValue(null, "node");
|
||||
String subId = parser.getAttributeValue(null, "subid");
|
||||
String state = parser.getAttributeValue(null, "subscription");
|
||||
boolean isRequired = false;
|
||||
String jid = parser.getAttributeValue(null, "jid");
|
||||
String nodeId = parser.getAttributeValue(null, "node");
|
||||
String subId = parser.getAttributeValue(null, "subid");
|
||||
String state = parser.getAttributeValue(null, "subscription");
|
||||
boolean isRequired = false;
|
||||
|
||||
int tag = parser.next();
|
||||
int tag = parser.next();
|
||||
|
||||
if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("subscribe-options"))
|
||||
{
|
||||
tag = parser.next();
|
||||
if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("subscribe-options"))
|
||||
{
|
||||
tag = parser.next();
|
||||
|
||||
if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("required"))
|
||||
isRequired = true;
|
||||
if ((tag == XmlPullParser.START_TAG) && parser.getName().equals("required"))
|
||||
isRequired = true;
|
||||
|
||||
while (tag != XmlPullParser.END_TAG && !parser.getName().equals("subscribe-options")) tag = parser.next();
|
||||
}
|
||||
while (parser.getEventType() != XmlPullParser.END_TAG) parser.next();
|
||||
return new Subscription(jid, nodeId, subId, (state == null ? null : Subscription.State.valueOf(state)), isRequired);
|
||||
}
|
||||
while (tag != XmlPullParser.END_TAG && !parser.getName().equals("subscribe-options")) tag = parser.next();
|
||||
}
|
||||
while (parser.getEventType() != XmlPullParser.END_TAG) parser.next();
|
||||
return new Subscription(jid, nodeId, subId, (state == null ? null : Subscription.State.valueOf(state)), isRequired);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,11 +32,11 @@ import org.jivesoftware.smackx.pubsub.SubscriptionsExtension;
|
|||
*/
|
||||
public class SubscriptionsProvider extends EmbeddedExtensionProvider<SubscriptionsExtension>
|
||||
{
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected SubscriptionsExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new SubscriptionsExtension(attributeMap.get("node"), (List<Subscription>)content);
|
||||
}
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
protected SubscriptionsExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content)
|
||||
{
|
||||
return new SubscriptionsExtension(attributeMap.get("node"), (List<Subscription>)content);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -29,17 +29,17 @@ import org.jivesoftware.smackx.xdata.Form;
|
|||
*/
|
||||
public class NodeUtils
|
||||
{
|
||||
/**
|
||||
* Get a {@link ConfigureForm} from a packet.
|
||||
*
|
||||
* @param packet
|
||||
* @param elem
|
||||
* @return The configuration form
|
||||
*/
|
||||
public static ConfigureForm getFormFromPacket(Stanza packet, PubSubElementType elem)
|
||||
{
|
||||
FormNode config = packet.getExtension(elem.getElementName(), elem.getNamespace().getXmlns());
|
||||
Form formReply = config.getForm();
|
||||
return new ConfigureForm(formReply);
|
||||
}
|
||||
/**
|
||||
* Get a {@link ConfigureForm} from a packet.
|
||||
*
|
||||
* @param packet
|
||||
* @param elem
|
||||
* @return The configuration form
|
||||
*/
|
||||
public static ConfigureForm getFormFromPacket(Stanza packet, PubSubElementType elem)
|
||||
{
|
||||
FormNode config = packet.getExtension(elem.getElementName(), elem.getNamespace().getXmlns());
|
||||
Form formReply = config.getForm();
|
||||
return new ConfigureForm(formReply);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -404,9 +404,9 @@ public class StreamInitiation extends IQ {
|
|||
StringBuilder buf = new StringBuilder();
|
||||
buf
|
||||
.append("<feature xmlns=\"http://jabber.org/protocol/feature-neg\">");
|
||||
buf.append(data.toXML());
|
||||
buf.append("</feature>");
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
buf.append(data.toXML());
|
||||
buf.append("</feature>");
|
||||
return buf.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,51 +41,51 @@ public class StreamInitiationProvider extends IQProvider<StreamInitiation> {
|
|||
@Override
|
||||
public StreamInitiation parse(XmlPullParser parser, int initialDepth)
|
||||
throws Exception {
|
||||
boolean done = false;
|
||||
boolean done = false;
|
||||
|
||||
// si
|
||||
String id = parser.getAttributeValue("", "id");
|
||||
String mimeType = parser.getAttributeValue("", "mime-type");
|
||||
// si
|
||||
String id = parser.getAttributeValue("", "id");
|
||||
String mimeType = parser.getAttributeValue("", "mime-type");
|
||||
|
||||
StreamInitiation initiation = new StreamInitiation();
|
||||
StreamInitiation initiation = new StreamInitiation();
|
||||
|
||||
// file
|
||||
String name = null;
|
||||
String size = null;
|
||||
String hash = null;
|
||||
String date = null;
|
||||
String desc = null;
|
||||
boolean isRanged = false;
|
||||
// file
|
||||
String name = null;
|
||||
String size = null;
|
||||
String hash = null;
|
||||
String date = null;
|
||||
String desc = null;
|
||||
boolean isRanged = false;
|
||||
|
||||
// feature
|
||||
DataForm form = null;
|
||||
DataFormProvider dataFormProvider = new DataFormProvider();
|
||||
// feature
|
||||
DataForm form = null;
|
||||
DataFormProvider dataFormProvider = new DataFormProvider();
|
||||
|
||||
int eventType;
|
||||
String elementName;
|
||||
String namespace;
|
||||
while (!done) {
|
||||
eventType = parser.next();
|
||||
elementName = parser.getName();
|
||||
namespace = parser.getNamespace();
|
||||
if (eventType == XmlPullParser.START_TAG) {
|
||||
if (elementName.equals("file")) {
|
||||
name = parser.getAttributeValue("", "name");
|
||||
size = parser.getAttributeValue("", "size");
|
||||
hash = parser.getAttributeValue("", "hash");
|
||||
date = parser.getAttributeValue("", "date");
|
||||
} else if (elementName.equals("desc")) {
|
||||
desc = parser.nextText();
|
||||
} else if (elementName.equals("range")) {
|
||||
isRanged = true;
|
||||
} else if (elementName.equals("x")
|
||||
&& namespace.equals("jabber:x:data")) {
|
||||
form = dataFormProvider.parse(parser);
|
||||
}
|
||||
} else if (eventType == XmlPullParser.END_TAG) {
|
||||
if (elementName.equals("si")) {
|
||||
done = true;
|
||||
} else if (elementName.equals("file")) {
|
||||
int eventType;
|
||||
String elementName;
|
||||
String namespace;
|
||||
while (!done) {
|
||||
eventType = parser.next();
|
||||
elementName = parser.getName();
|
||||
namespace = parser.getNamespace();
|
||||
if (eventType == XmlPullParser.START_TAG) {
|
||||
if (elementName.equals("file")) {
|
||||
name = parser.getAttributeValue("", "name");
|
||||
size = parser.getAttributeValue("", "size");
|
||||
hash = parser.getAttributeValue("", "hash");
|
||||
date = parser.getAttributeValue("", "date");
|
||||
} else if (elementName.equals("desc")) {
|
||||
desc = parser.nextText();
|
||||
} else if (elementName.equals("range")) {
|
||||
isRanged = true;
|
||||
} else if (elementName.equals("x")
|
||||
&& namespace.equals("jabber:x:data")) {
|
||||
form = dataFormProvider.parse(parser);
|
||||
}
|
||||
} else if (eventType == XmlPullParser.END_TAG) {
|
||||
if (elementName.equals("si")) {
|
||||
done = true;
|
||||
} else if (elementName.equals("file")) {
|
||||
long fileSize = 0;
|
||||
if(size != null && size.trim().length() !=0){
|
||||
try {
|
||||
|
@ -106,21 +106,21 @@ public class StreamInitiationProvider extends IQProvider<StreamInitiation> {
|
|||
}
|
||||
|
||||
File file = new File(name, fileSize);
|
||||
file.setHash(hash);
|
||||
file.setDate(fileDate);
|
||||
file.setDesc(desc);
|
||||
file.setRanged(isRanged);
|
||||
initiation.setFile(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
file.setHash(hash);
|
||||
file.setDate(fileDate);
|
||||
file.setDesc(desc);
|
||||
file.setRanged(isRanged);
|
||||
initiation.setFile(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
initiation.setSessionID(id);
|
||||
initiation.setMimeType(mimeType);
|
||||
initiation.setSessionID(id);
|
||||
initiation.setMimeType(mimeType);
|
||||
|
||||
initiation.setFeatureNegotiationForm(form);
|
||||
initiation.setFeatureNegotiationForm(form);
|
||||
|
||||
return initiation;
|
||||
}
|
||||
return initiation;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -41,56 +41,56 @@ import org.junit.Test;
|
|||
*/
|
||||
public class ConfigureFormTest
|
||||
{
|
||||
@Test
|
||||
public void checkChildrenAssocPolicy()
|
||||
{
|
||||
ConfigureForm form = new ConfigureForm(DataForm.Type.submit);
|
||||
form.setChildrenAssociationPolicy(ChildrenAssociationPolicy.owners);
|
||||
assertEquals(ChildrenAssociationPolicy.owners, form.getChildrenAssociationPolicy());
|
||||
}
|
||||
@Test
|
||||
public void checkChildrenAssocPolicy()
|
||||
{
|
||||
ConfigureForm form = new ConfigureForm(DataForm.Type.submit);
|
||||
form.setChildrenAssociationPolicy(ChildrenAssociationPolicy.owners);
|
||||
assertEquals(ChildrenAssociationPolicy.owners, form.getChildrenAssociationPolicy());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConfigFormWithInsufficientPriviliges() throws XMPPException, SmackException, IOException, InterruptedException
|
||||
{
|
||||
ThreadedDummyConnection con = ThreadedDummyConnection.newInstance();
|
||||
PubSubManager mgr = new PubSubManager(con, PubSubManagerTest.DUMMY_PUBSUB_SERVICE);
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
Identity ident = new Identity("pubsub", null, "leaf");
|
||||
info.addIdentity(ident);
|
||||
con.addIQReply(info);
|
||||
@Test
|
||||
public void getConfigFormWithInsufficientPriviliges() throws XMPPException, SmackException, IOException, InterruptedException
|
||||
{
|
||||
ThreadedDummyConnection con = ThreadedDummyConnection.newInstance();
|
||||
PubSubManager mgr = new PubSubManager(con, PubSubManagerTest.DUMMY_PUBSUB_SERVICE);
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
Identity ident = new Identity("pubsub", null, "leaf");
|
||||
info.addIdentity(ident);
|
||||
con.addIQReply(info);
|
||||
|
||||
Node node = mgr.getNode("princely_musings");
|
||||
Node node = mgr.getNode("princely_musings");
|
||||
|
||||
PubSub errorIq = new PubSub();
|
||||
XMPPError.Builder error = XMPPError.getBuilder(Condition.forbidden);
|
||||
errorIq.setError(error);
|
||||
con.addIQReply(errorIq);
|
||||
PubSub errorIq = new PubSub();
|
||||
XMPPError.Builder error = XMPPError.getBuilder(Condition.forbidden);
|
||||
errorIq.setError(error);
|
||||
con.addIQReply(errorIq);
|
||||
|
||||
try
|
||||
{
|
||||
node.getNodeConfiguration();
|
||||
}
|
||||
catch (XMPPErrorException e)
|
||||
{
|
||||
Assert.assertEquals(XMPPError.Type.AUTH, e.getXMPPError().getType());
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
node.getNodeConfiguration();
|
||||
}
|
||||
catch (XMPPErrorException e)
|
||||
{
|
||||
Assert.assertEquals(XMPPError.Type.AUTH, e.getXMPPError().getType());
|
||||
}
|
||||
}
|
||||
|
||||
@Test (expected=SmackException.class)
|
||||
public void getConfigFormWithTimeout() throws XMPPException, SmackException, InterruptedException
|
||||
{
|
||||
ThreadedDummyConnection con = new ThreadedDummyConnection();
|
||||
PubSubManager mgr = new PubSubManager(con, PubSubManagerTest.DUMMY_PUBSUB_SERVICE);
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
Identity ident = new Identity("pubsub", null, "leaf");
|
||||
info.addIdentity(ident);
|
||||
con.addIQReply(info);
|
||||
@Test (expected=SmackException.class)
|
||||
public void getConfigFormWithTimeout() throws XMPPException, SmackException, InterruptedException
|
||||
{
|
||||
ThreadedDummyConnection con = new ThreadedDummyConnection();
|
||||
PubSubManager mgr = new PubSubManager(con, PubSubManagerTest.DUMMY_PUBSUB_SERVICE);
|
||||
DiscoverInfo info = new DiscoverInfo();
|
||||
Identity ident = new Identity("pubsub", null, "leaf");
|
||||
info.addIdentity(ident);
|
||||
con.addIQReply(info);
|
||||
|
||||
Node node = mgr.getNode("princely_musings");
|
||||
Node node = mgr.getNode("princely_musings");
|
||||
|
||||
SmackConfiguration.setDefaultReplyTimeout(100);
|
||||
con.setTimeout();
|
||||
SmackConfiguration.setDefaultReplyTimeout(100);
|
||||
con.setTimeout();
|
||||
|
||||
node.getNodeConfiguration();
|
||||
}
|
||||
node.getNodeConfiguration();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,63 +37,63 @@ import org.xmlpull.v1.XmlPullParser;
|
|||
*
|
||||
*/
|
||||
public class ItemValidationTest extends InitExtensions {
|
||||
private ThreadedDummyConnection connection;
|
||||
private ThreadedDummyConnection connection;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception
|
||||
{
|
||||
// Uncomment this to enable debug output
|
||||
// SmackConfiguration.DEBUG = true;
|
||||
@Before
|
||||
public void setUp() throws Exception
|
||||
{
|
||||
// Uncomment this to enable debug output
|
||||
// SmackConfiguration.DEBUG = true;
|
||||
|
||||
connection = new ThreadedDummyConnection();
|
||||
connection.connect();
|
||||
connection.login();
|
||||
}
|
||||
connection = new ThreadedDummyConnection();
|
||||
connection.connect();
|
||||
connection.login();
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
if (connection != null)
|
||||
connection.disconnect();
|
||||
}
|
||||
@After
|
||||
public void tearDown() throws Exception
|
||||
{
|
||||
if (connection != null)
|
||||
connection.disconnect();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void verifyBasicItem() throws Exception
|
||||
{
|
||||
Item simpleItem = new Item();
|
||||
String simpleCtrl = "<item />";
|
||||
assertXMLEqual(simpleCtrl, simpleItem.toXML());
|
||||
@Test
|
||||
public void verifyBasicItem() throws Exception
|
||||
{
|
||||
Item simpleItem = new Item();
|
||||
String simpleCtrl = "<item />";
|
||||
assertXMLEqual(simpleCtrl, simpleItem.toXML());
|
||||
|
||||
Item idItem = new Item("uniqueid");
|
||||
String idCtrl = "<item id='uniqueid'/>";
|
||||
assertXMLEqual(idCtrl, idItem.toXML());
|
||||
Item idItem = new Item("uniqueid");
|
||||
String idCtrl = "<item id='uniqueid'/>";
|
||||
assertXMLEqual(idCtrl, idItem.toXML());
|
||||
|
||||
Item itemWithNodeId = new Item("testId", "testNode");
|
||||
String nodeIdCtrl = "<item id='testId' node='testNode' />";
|
||||
assertXMLEqual(nodeIdCtrl, itemWithNodeId.toXML());
|
||||
}
|
||||
Item itemWithNodeId = new Item("testId", "testNode");
|
||||
String nodeIdCtrl = "<item id='testId' node='testNode' />";
|
||||
assertXMLEqual(nodeIdCtrl, itemWithNodeId.toXML());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void verifyPayloadItem() throws Exception
|
||||
{
|
||||
SimplePayload payload = new SimplePayload(null, null, "<data>This is the payload</data>");
|
||||
@Test
|
||||
public void verifyPayloadItem() throws Exception
|
||||
{
|
||||
SimplePayload payload = new SimplePayload(null, null, "<data>This is the payload</data>");
|
||||
|
||||
PayloadItem<SimplePayload> simpleItem = new PayloadItem<SimplePayload>(payload);
|
||||
String simpleCtrl = "<item>" + payload.toXML() + "</item>";
|
||||
assertXMLEqual(simpleCtrl, simpleItem.toXML());
|
||||
PayloadItem<SimplePayload> simpleItem = new PayloadItem<SimplePayload>(payload);
|
||||
String simpleCtrl = "<item>" + payload.toXML() + "</item>";
|
||||
assertXMLEqual(simpleCtrl, simpleItem.toXML());
|
||||
|
||||
PayloadItem<SimplePayload> idItem = new PayloadItem<SimplePayload>("uniqueid", payload);
|
||||
String idCtrl = "<item id='uniqueid'>" + payload.toXML() + "</item>";
|
||||
assertXMLEqual(idCtrl, idItem.toXML());
|
||||
PayloadItem<SimplePayload> idItem = new PayloadItem<SimplePayload>("uniqueid", payload);
|
||||
String idCtrl = "<item id='uniqueid'>" + payload.toXML() + "</item>";
|
||||
assertXMLEqual(idCtrl, idItem.toXML());
|
||||
|
||||
PayloadItem<SimplePayload> itemWithNodeId = new PayloadItem<SimplePayload>("testId", "testNode", payload);
|
||||
String nodeIdCtrl = "<item id='testId' node='testNode'>" + payload.toXML() + "</item>";
|
||||
assertXMLEqual(nodeIdCtrl, itemWithNodeId.toXML());
|
||||
}
|
||||
PayloadItem<SimplePayload> itemWithNodeId = new PayloadItem<SimplePayload>("testId", "testNode", payload);
|
||||
String nodeIdCtrl = "<item id='testId' node='testNode'>" + payload.toXML() + "</item>";
|
||||
assertXMLEqual(nodeIdCtrl, itemWithNodeId.toXML());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void parseBasicItem() throws Exception
|
||||
{
|
||||
@Test
|
||||
public void parseBasicItem() throws Exception
|
||||
{
|
||||
XmlPullParser parser = PacketParserUtils.getParserFor(
|
||||
"<message from='pubsub.myserver.com' to='francisco@denmark.lit' id='foo'>" +
|
||||
"<event xmlns='http://jabber.org/protocol/pubsub#event'>" +
|
||||
|
@ -116,7 +116,7 @@ public class ItemValidationTest extends InitExtensions {
|
|||
ExtensionElement itemExt = ((ItemsExtension)event.getExtensions().get(0)).items.get(0);
|
||||
assertTrue(itemExt instanceof Item);
|
||||
assertEquals("testid1", ((Item)itemExt).getId());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void parseSimplePayloadItem() throws Exception
|
||||
|
|
|
@ -119,7 +119,7 @@ public class DeliveryReceiptTest extends InitExtensions {
|
|||
c.processStanza(m);
|
||||
|
||||
Stanza reply = c.getSentPacket();
|
||||
DeliveryReceipt r = DeliveryReceipt.from((Message) reply);
|
||||
DeliveryReceipt r = DeliveryReceipt.from((Message) reply);
|
||||
assertThat("romeo@montague.com", equalsCharSequence(reply.getTo()));
|
||||
assertEquals("test-receipt-request", r.getId());
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue