/* * Copyright (C) 2005-2008 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.openfire.pubsub; import org.jivesoftware.util.LocaleUtils; import org.jivesoftware.openfire.pubsub.models.AccessModel; import org.jivesoftware.openfire.pubsub.models.PublisherModel; import org.xmpp.forms.DataForm; import org.xmpp.forms.FormField; /** * A DefaultNodeConfiguration keeps the default configuration values for leaf or collection * nodes of a particular publish-subscribe service. New nodes created for the service * will be initialized with the values defined in the default configuration. * * @author Matt Tucker */ public class DefaultNodeConfiguration { /** * Flag indicating whether this default configutation belongs to a leaf node or not. */ private boolean leaf; /** * Flag that indicates whether to deliver payloads with event notifications. */ private boolean deliverPayloads; /** * The maximum payload size in bytes. */ private int maxPayloadSize; /** * Flag that indicates whether to persist items to storage. Note that when the * variable is false then the last published item is the only items being saved * to the backend storage. */ private boolean persistPublishedItems; /** * Maximum number of published items to persist. Note that all nodes are going to persist * their published items. The only difference is the number of the last published items * to be persisted. Even nodes that are configured to not use persitent items are going * to save the last published item. */ private int maxPublishedItems; /** * Flag that indicates whether to notify subscribers when the node configuration changes. */ private boolean notifyConfigChanges; /** * Flag that indicates whether to notify subscribers when the node is deleted. */ private boolean notifyDelete; /** * Flag that indicates whether to notify subscribers when items are removed from the node. */ private boolean notifyRetract; /** * Flag that indicates whether to deliver notifications to available users only. */ private boolean presenceBasedDelivery; /** * Flag that indicates whether to send items to new subscribers. */ private boolean sendItemSubscribe = false; /** * Publisher model that specifies who is allowed to publish items to the node. */ private PublisherModel publisherModel = PublisherModel.open; /** * Flag that indicates that subscribing and unsubscribing are enabled. */ private boolean subscriptionEnabled; /** * Access model that specifies who is allowed to subscribe and retrieve items. */ private AccessModel accessModel = AccessModel.open; /** * The default language of the node. */ private String language = ""; /** * Policy that defines whether owners or publisher should receive replies to items. */ private Node.ItemReplyPolicy replyPolicy = Node.ItemReplyPolicy.owner; /** * Policy that defines who may associate leaf nodes with a collection. */ private CollectionNode.LeafNodeAssociationPolicy associationPolicy = CollectionNode.LeafNodeAssociationPolicy.all; /** * Max number of leaf nodes that this collection node might have. A value of -1 means * that there is no limit. */ private int maxLeafNodes = -1; public DefaultNodeConfiguration(boolean isLeafType) { this.leaf = isLeafType; } /** * Returns true if this default configutation belongs to a leaf node. * * @return true if this default configutation belongs to a leaf node. */ public boolean isLeaf() { return leaf; } /** * Returns true if payloads are going to be delivered with event notifications. * * @return true if payloads are going to be delivered with event notifications. */ public boolean isDeliverPayloads() { return deliverPayloads; } /** * Returns the maximum payload size in bytes. * * @return the maximum payload size in bytes. */ public int getMaxPayloadSize() { return maxPayloadSize; } /** * Returns true if items are going to be persisted in a storage. Note that when the * variable is false then the last published item is the only items being saved * to the backend storage. * * @return true if items are going to be persisted in a storage. */ public boolean isPersistPublishedItems() { return persistPublishedItems; } /** * Returns the maximum number of published items to persist. Note that all nodes are going * to persist their published items. The only difference is the number of the last published * items to be persisted. Even nodes that are configured to not use persitent items are going * to save the last published item. * * @return the maximum number of published items to persist. */ public int getMaxPublishedItems() { return maxPublishedItems; } /** * Returns true if subscribers are going to be notified when node configuration changes. * * @return true if subscribers are going to be notified when node configuration changes. */ public boolean isNotifyConfigChanges() { return notifyConfigChanges; } /** * Returns true if subscribers are going to be notified when node is deleted. * * @return true if subscribers are going to be notified when node is deleted. */ public boolean isNotifyDelete() { return notifyDelete; } /** * Returns true if subscribers are going to be notified when items are removed from the node. * * @return true if subscribers are going to be notified when items are removed from the node. */ public boolean isNotifyRetract() { return notifyRetract; } /** * Returns true if notifications are going to be delivered only to available users. * * @return true if notifications are going to be delivered only to available users. */ public boolean isPresenceBasedDelivery() { return presenceBasedDelivery; } /** * Returns true if new subscribers are going to receive new items once subscribed. * * @return true if new subscribers are going to receive new items once subscribed. */ public boolean isSendItemSubscribe() { return sendItemSubscribe; } /** * Returnes the publisher model that specifies who is allowed to publish items to the node. * * @return the publisher model that specifies who is allowed to publish items to the node. */ public PublisherModel getPublisherModel() { return publisherModel; } /** * Returns true if subscribing and unsubscribing are enabled. * * @return true if subscribing and unsubscribing are enabled. */ public boolean isSubscriptionEnabled() { return subscriptionEnabled; } /** * Returns the access model that specifies who is allowed to subscribe and retrieve items. * * @return the access model that specifies who is allowed to subscribe and retrieve items. */ public AccessModel getAccessModel() { return accessModel; } /** * Returns the default language of the node. * * @return the default language of the node. */ public String getLanguage() { return language; } /** * Returns the policy that defines whether owners or publisher should receive * replies to items. * * @return the policy that defines whether owners or publisher should receive * replies to items. */ public Node.ItemReplyPolicy getReplyPolicy() { return replyPolicy; } /** * Returns the policy that defines who may associate leaf nodes with a collection. * * @return the policy that defines who may associate leaf nodes with a collection. */ public CollectionNode.LeafNodeAssociationPolicy getAssociationPolicy() { return associationPolicy; } /** * Returns the max number of leaf nodes that this collection node might have. A value of * -1 means that there is no limit. * * @return the max number of leaf nodes that this collection node might have. */ public int getMaxLeafNodes() { return maxLeafNodes; } /** * Sets if payloads are going to be delivered with event notifications. * * @param deliverPayloads true if payloads are going to be delivered with event notifications. */ public void setDeliverPayloads(boolean deliverPayloads) { this.deliverPayloads = deliverPayloads; } /** * Sets the maximum payload size in bytes. * * @param maxPayloadSize the maximum payload size in bytes. */ public void setMaxPayloadSize(int maxPayloadSize) { this.maxPayloadSize = maxPayloadSize; } /** * Sets if items are going to be persisted in a storage. Note that when the * variable is false then the last published item is the only items being saved * to the backend storage. * * @param persistPublishedItems true if items are going to be persisted in a storage. */ public void setPersistPublishedItems(boolean persistPublishedItems) { this.persistPublishedItems = persistPublishedItems; } /** * Sets the maximum number of published items to persist. Note that all nodes are going * to persist their published items. The only difference is the number of the last published * items to be persisted. Even nodes that are configured to not use persitent items are going * to save the last published item. * * @param maxPublishedItems the maximum number of published items to persist. */ public void setMaxPublishedItems(int maxPublishedItems) { this.maxPublishedItems = maxPublishedItems; } /** * Sets if subscribers are going to be notified when node configuration changes. * * @param notifyConfigChanges true if subscribers are going to be notified when node * configuration changes. */ public void setNotifyConfigChanges(boolean notifyConfigChanges) { this.notifyConfigChanges = notifyConfigChanges; } /** * Sets if subscribers are going to be notified when node is deleted. * * @param notifyDelete true if subscribers are going to be notified when node is deleted. */ public void setNotifyDelete(boolean notifyDelete) { this.notifyDelete = notifyDelete; } /** * Sets if subscribers are going to be notified when items are removed from the node. * * @param notifyRetract true if subscribers are going to be notified when items are removed * from the node. */ public void setNotifyRetract(boolean notifyRetract) { this.notifyRetract = notifyRetract; } /** * Sets if notifications are going to be delivered only to available users. * * @param presenceBasedDelivery true if notifications are going to be delivered only to * available users. */ public void setPresenceBasedDelivery(boolean presenceBasedDelivery) { this.presenceBasedDelivery = presenceBasedDelivery; } /** * Sets if new subscribers are going to receive new items once subscribed. * * @param sendItemSubscribe true if new subscribers are going to receive new items * once subscribed. */ public void setSendItemSubscribe(boolean sendItemSubscribe) { this.sendItemSubscribe = sendItemSubscribe; } /** * Sets the publisher model that specifies who is allowed to publish items to the node. * * @param publisherModel the publisher model that specifies who is allowed to publish * items to the node. */ public void setPublisherModel(PublisherModel publisherModel) { this.publisherModel = publisherModel; } /** * Sets if subscribing and unsubscribing are enabled. * * @param subscriptionEnabled true if subscribing and unsubscribing are enabled. */ public void setSubscriptionEnabled(boolean subscriptionEnabled) { this.subscriptionEnabled = subscriptionEnabled; } /** * Sets the access model that specifies who is allowed to subscribe and retrieve items. * * @param accessModel the access model that specifies who is allowed to subscribe and * retrieve items. */ public void setAccessModel(AccessModel accessModel) { this.accessModel = accessModel; } /** * Sets the default language of the node. * * @param language the default language of the node. */ public void setLanguage(String language) { this.language = language; } /** * Sets the policy that defines whether owners or publisher should receive replies to items. * * @param replyPolicy the policy that defines whether owners or publisher should receive * replies to items. */ public void setReplyPolicy(Node.ItemReplyPolicy replyPolicy) { this.replyPolicy = replyPolicy; } /** * Sets the policy that defines who may associate leaf nodes with a collection. * * @param associationPolicy the policy that defines who may associate leaf nodes * with a collection. */ public void setAssociationPolicy(CollectionNode.LeafNodeAssociationPolicy associationPolicy) { this.associationPolicy = associationPolicy; } /** * Sets the max number of leaf nodes that this collection node might have. A value of * -1 means that there is no limit. * * @param maxLeafNodes the max number of leaf nodes that this collection node might have. */ public void setMaxLeafNodes(int maxLeafNodes) { this.maxLeafNodes = maxLeafNodes; } public DataForm getConfigurationForm() { DataForm form = new DataForm(DataForm.Type.form); form.setTitle(LocaleUtils.getLocalizedString("pubsub.form.default.title")); form.addInstruction(LocaleUtils.getLocalizedString("pubsub.form.default.instruction")); // Add the form fields and configure them for edition FormField formField = form.addField(); formField.setVariable("FORM_TYPE"); formField.setType(FormField.Type.hidden); formField.addValue("http://jabber.org/protocol/pubsub#node_config"); formField = form.addField(); formField.setVariable("pubsub#subscribe"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.subscribe")); formField.addValue(subscriptionEnabled); formField = form.addField(); formField.setVariable("pubsub#deliver_payloads"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.deliver_payloads")); formField.addValue(deliverPayloads); formField = form.addField(); formField.setVariable("pubsub#notify_config"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.notify_config")); formField.addValue(notifyConfigChanges); formField = form.addField(); formField.setVariable("pubsub#notify_delete"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.notify_delete")); formField.addValue(notifyDelete); formField = form.addField(); formField.setVariable("pubsub#notify_retract"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.notify_retract")); formField.addValue(notifyRetract); formField = form.addField(); formField.setVariable("pubsub#presence_based_delivery"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.presence_based")); formField.addValue(presenceBasedDelivery); if (leaf) { formField = form.addField(); formField.setVariable("pubsub#send_item_subscribe"); formField.setType(FormField.Type.boolean_type); formField.setLabel( LocaleUtils.getLocalizedString("pubsub.form.conf.send_item_subscribe")); formField.addValue(sendItemSubscribe); formField = form.addField(); formField.setVariable("pubsub#persist_items"); formField.setType(FormField.Type.boolean_type); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.persist_items")); formField.addValue(persistPublishedItems); formField = form.addField(); formField.setVariable("pubsub#max_items"); formField.setType(FormField.Type.text_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.max_items")); formField.addValue(maxPublishedItems); formField = form.addField(); formField.setVariable("pubsub#max_payload_size"); formField.setType(FormField.Type.text_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.max_payload_size")); formField.addValue(maxPayloadSize); } formField = form.addField(); formField.setVariable("pubsub#access_model"); formField.setType(FormField.Type.list_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.access_model")); formField.addOption(null, AccessModel.authorize.getName()); formField.addOption(null, AccessModel.open.getName()); formField.addOption(null, AccessModel.presence.getName()); formField.addOption(null, AccessModel.roster.getName()); formField.addOption(null, AccessModel.whitelist.getName()); formField.addValue(accessModel.getName()); formField = form.addField(); formField.setVariable("pubsub#publish_model"); formField.setType(FormField.Type.list_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.publish_model")); formField.addOption(null, PublisherModel.publishers.getName()); formField.addOption(null, PublisherModel.subscribers.getName()); formField.addOption(null, PublisherModel.open.getName()); formField.addValue(publisherModel.getName()); formField = form.addField(); formField.setVariable("pubsub#language"); formField.setType(FormField.Type.text_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.language")); formField.addValue(language); formField = form.addField(); formField.setVariable("pubsub#itemreply"); formField.setType(FormField.Type.list_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.itemreply")); if (replyPolicy != null) { formField.addValue(replyPolicy.name()); } if (!leaf) { formField = form.addField(); formField.setVariable("pubsub#leaf_node_association_policy"); formField.setType(FormField.Type.list_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.leaf_node_association")); formField.addOption(null, CollectionNode.LeafNodeAssociationPolicy.all.name()); formField.addOption(null, CollectionNode.LeafNodeAssociationPolicy.owners.name()); formField.addOption(null, CollectionNode.LeafNodeAssociationPolicy.whitelist.name()); formField.addValue(associationPolicy.name()); formField = form.addField(); formField.setVariable("pubsub#leaf_nodes_max"); formField.setType(FormField.Type.text_single); formField.setLabel(LocaleUtils.getLocalizedString("pubsub.form.conf.leaf_nodes_max")); formField.addValue(maxLeafNodes); } return form; } }