Unverified Commit d16c186d authored by Dave Cridland's avatar Dave Cridland Committed by GitHub

Merge pull request #1049 from guusdk/OF-1511_Pubsub-publishing-options

OF-1511 OF-1513 OF-1514: Pubsub / PEP changes
parents 2e62750f b99be2d6
......@@ -207,7 +207,6 @@ public class IQOwnerHandler {
throws ForbiddenException, ConflictException, NotAcceptableException
{
List<String> values;
String booleanValue;
FormField field;
// Get the new list of admins
......@@ -262,9 +261,7 @@ public class IQOwnerHandler {
field = completedForm.getField("muc#roomconfig_changesubject");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setCanOccupantsChangeSubject(("1".equals(booleanValue)));
room.setCanOccupantsChangeSubject( parseFirstValueAsBoolean( field, true ) );
}
field = completedForm.getField("muc#roomconfig_maxusers");
......@@ -281,16 +278,12 @@ public class IQOwnerHandler {
field = completedForm.getField("muc#roomconfig_publicroom");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setPublicRoom(("1".equals(booleanValue)));
room.setPublicRoom( parseFirstValueAsBoolean( field, true ) );
}
field = completedForm.getField("muc#roomconfig_persistentroom");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
boolean isPersistent = ("1".equals(booleanValue));
boolean isPersistent = parseFirstValueAsBoolean( field, true );
// Delete the room from the DB if it's no longer persistent
if (room.isPersistent() && !isPersistent) {
MUCPersistenceManager.deleteFromDB(room);
......@@ -300,23 +293,17 @@ public class IQOwnerHandler {
field = completedForm.getField("muc#roomconfig_moderatedroom");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setModerated(("1".equals(booleanValue)));
room.setModerated( parseFirstValueAsBoolean( field, true ) );
}
field = completedForm.getField("muc#roomconfig_membersonly");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
presences.addAll(room.setMembersOnly(("1".equals(booleanValue))));
presences.addAll(room.setMembersOnly( parseFirstValueAsBoolean( field, true ) ) );
}
field = completedForm.getField("muc#roomconfig_allowinvites");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setCanOccupantsInvite(("1".equals(booleanValue)));
room.setCanOccupantsInvite( parseFirstValueAsBoolean( field, true ) );
}
......@@ -330,9 +317,7 @@ public class IQOwnerHandler {
if (field != null)
{
passwordProtectionChanged = true;
final String value = field.getFirstValue();
booleanValue = ( ( value != null ? value : "1" ) );
updatedIsPasswordProtected = "1".equals( booleanValue );
updatedIsPasswordProtected = parseFirstValueAsBoolean( field, true );
}
field = completedForm.getField("muc#roomconfig_roomsecret");
......@@ -373,43 +358,32 @@ public class IQOwnerHandler {
field = completedForm.getField("muc#roomconfig_whois");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setCanAnyoneDiscoverJID(("anyone".equals(booleanValue)));
room.setCanAnyoneDiscoverJID(("anyone".equals(field.getFirstValue())));
}
field = completedForm.getField("muc#roomconfig_allowpm");
if (field != null) {
final String value = field.getFirstValue();
room.setCanSendPrivateMessage(value);
room.setCanSendPrivateMessage(field.getFirstValue());
}
field = completedForm.getField("muc#roomconfig_enablelogging");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setLogEnabled(("1".equals(booleanValue)));
room.setLogEnabled( parseFirstValueAsBoolean( field, true ) );
}
field = completedForm.getField("x-muc#roomconfig_reservednick");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setLoginRestrictedToNickname(("1".equals(booleanValue)));
room.setLoginRestrictedToNickname( parseFirstValueAsBoolean( field, true ) );
}
field = completedForm.getField("x-muc#roomconfig_canchangenick");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setChangeNickname(("1".equals(booleanValue)));
room.setChangeNickname( parseFirstValueAsBoolean( field, true ) );
}
field = completedForm.getField("x-muc#roomconfig_registration");
if (field != null) {
final String value = field.getFirstValue();
booleanValue = ((value != null ? value : "1"));
room.setRegistrationEnabled(("1".equals(booleanValue)));
room.setRegistrationEnabled( parseFirstValueAsBoolean( field, true ) );
}
// Update the modification date to reflect the last time when the room's configuration
......@@ -719,4 +693,33 @@ public class IQOwnerHandler {
probeResult = element;
probeResult.add(configurationForm.getElement());
}
/**
* Returns the first value of the formfield as a boolean.
*
* @param field A form field (cannot be null)
* @param defaultValue Returned if first value is null or empty.
* @return true if the provided input equals '1' or 'true', false if the input equals '0' or 'false'.
* @throws IllegalArgumentException when the input cannot be parsed as a boolean.
* @Deprecated Use {@link FormField#parseFirstValueAsBoolean(String)} provided by Tinder version 1.3.1 or newer.
*/
@Deprecated
public static boolean parseFirstValueAsBoolean( FormField field, boolean defaultValue )
{
final String value = field.getFirstValue();
if ( value == null || value.isEmpty() )
{
return defaultValue;
}
if ( "0".equals( value ) || "false".equals( value ) )
{
return false;
}
if ( "1".equals( value ) || "true".equals( value ) )
{
return true;
}
throw new IllegalArgumentException( "Unable to parse value '" + value + "' as Data Form Field boolean." );
}
}
......@@ -369,6 +369,18 @@ public class IQPEPHandler extends IQHandler implements ServerIdentitiesProvider,
// Create the node
final JID creator = new JID(jidFrom);
final LeafNode newNode = new LeafNode(pepService, pepService.getRootCollectionNode(), nodeID, creator);
final DataForm publishOptions = PubSubEngine.getPublishOptions( packet );
if ( publishOptions != null )
{
try
{
newNode.configure( publishOptions );
}
catch ( NotAcceptableException e )
{
Log.warn( "Unable to apply publish-options when creating a new PEP node {} for {}", nodeID, creator, e );
}
}
newNode.addOwner(creator);
newNode.saveToDB();
}
......
......@@ -194,7 +194,7 @@ public class CollectionNode extends Node {
formField.addValue(maxLeafNodes);
formField = form.addField();
formField.setVariable("pubsub#chilren_max");
formField.setVariable("pubsub#children_max");
if (isEditing) {
formField.setType(FormField.Type.text_single);
formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.children_max"));
......
......@@ -33,6 +33,8 @@ import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import static org.jivesoftware.openfire.muc.spi.IQOwnerHandler.parseFirstValueAsBoolean;
/**
* A type of node that contains published items only. It is NOT a container for
* other nodes.
......@@ -84,27 +86,19 @@ public class LeafNode extends Node {
@Override
protected void configure(FormField field) throws NotAcceptableException {
List<String> values;
String booleanValue;
if ("pubsub#persist_items".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
persistPublishedItems = "1".equals(booleanValue);
persistPublishedItems = parseFirstValueAsBoolean( field, true );
}
else if ("pubsub#max_payload_size".equals(field.getVariable())) {
values = field.getValues();
maxPayloadSize = values.size() > 0 ? Integer.parseInt(values.get(0)) : 5120;
maxPayloadSize = field.getFirstValue() != null ? Integer.parseInt( field.getFirstValue() ) : 5120;
}
else if ("pubsub#send_item_subscribe".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
sendItemSubscribe = "1".equals(booleanValue);
sendItemSubscribe = parseFirstValueAsBoolean( field, true );
}
}
@Override
void postConfigure(DataForm completedForm) {
List<String> values;
if (!persistPublishedItems) {
// Always save the last published item when not configured to use persistent items
maxPublishedItems = 1;
......@@ -112,8 +106,7 @@ public class LeafNode extends Node {
else {
FormField field = completedForm.getField("pubsub#max_items");
if (field != null) {
values = field.getValues();
maxPublishedItems = values.size() > 0 ? Integer.parseInt(values.get(0)) : 50;
maxPublishedItems = field.getFirstValue() != null ? Integer.parseInt( field.getFirstValue() ) : 50;
}
}
}
......
......@@ -44,6 +44,8 @@ import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import static org.jivesoftware.openfire.muc.spi.IQOwnerHandler.parseFirstValueAsBoolean;
/**
* A virtual location to which information can be published and from which event
* notifications and/or payloads can be received (in other pubsub systems, this may
......@@ -498,7 +500,6 @@ public abstract class Node {
}
else if (DataForm.Type.submit.equals(completedForm.getType())) {
List<String> values;
String booleanValue;
// Get the new list of owners
FormField ownerField = completedForm.getField("pubsub#owner");
......@@ -525,40 +526,26 @@ public abstract class Node {
// Do nothing
}
else if ("pubsub#deliver_payloads".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
deliverPayloads = "1".equals(booleanValue);
deliverPayloads = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#notify_config".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
notifyConfigChanges = "1".equals(booleanValue);
notifyConfigChanges = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#notify_delete".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
notifyDelete = "1".equals(booleanValue);
notifyDelete = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#notify_retract".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
notifyRetract = "1".equals(booleanValue);
notifyRetract = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#presence_based_delivery".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
presenceBasedDelivery = "1".equals(booleanValue);
presenceBasedDelivery = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#subscribe".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
subscriptionEnabled = "1".equals(booleanValue);
subscriptionEnabled = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#subscription_required".equals(field.getVariable())) {
// TODO Replace this variable for the one defined in the JEP (once one is defined)
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
subscriptionConfigurationRequired = "1".equals(booleanValue);
subscriptionConfigurationRequired = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#type".equals(field.getVariable())) {
values = field.getValues();
......
......@@ -36,6 +36,8 @@ import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Presence;
import static org.jivesoftware.openfire.muc.spi.IQOwnerHandler.parseFirstValueAsBoolean;
/**
* A subscription to a node. Entities may subscribe to a node to be notified when new events
* are published to the node. Published events may contain a {@link PublishedItem}. Only
......@@ -409,7 +411,6 @@ public class NodeSubscription {
void configure(DataForm options) {
List<String> values;
String booleanValue;
boolean wasUsingPresence = !presenceStates.isEmpty();
......@@ -435,14 +436,10 @@ public class NodeSubscription {
for (FormField field : options.getFields()) {
boolean fieldExists = true;
if ("pubsub#deliver".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
deliverNotifications = "1".equals(booleanValue);
deliverNotifications = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#digest".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
usingDigest = "1".equals(booleanValue);
usingDigest = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#digest_frequency".equals(field.getVariable())) {
values = field.getValues();
......@@ -457,9 +454,7 @@ public class NodeSubscription {
}
}
else if ("pubsub#include_body".equals(field.getVariable())) {
values = field.getValues();
booleanValue = (values.size() > 0 ? values.get(0) : "1");
includingBody = "1".equals(booleanValue);
includingBody = parseFirstValueAsBoolean( field, true ) ;
}
else if ("pubsub#show-values".equals(field.getVariable())) {
// Get the new list of presence states for which an entity wants to
......
......@@ -679,6 +679,8 @@ public class PubSubModule extends BasicModule implements ServerItemsProvider, Di
features.add("http://jabber.org/protocol/pubsub#subscribe");
// Configuration of subscription options is supported
features.add("http://jabber.org/protocol/pubsub#subscription-options");
// Publishing options are supported.
features.add("http://jabber.org/protocol/pubsub#publish-options");
}
else if (name == null) {
// Answer the features of a given node
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment