class OnlySubscribers extends PublisherModel {

    @Override
    public boolean canPublish(Node node, JID entity) {<FILL_FUNCTION_BODY>}

    @Override
    public String getName() {
        return "subscribers";
    }
}

        NodeAffiliate nodeAffiliate = node.getAffiliate(entity);
        // Deny access if user does not have any relation with the node or is an outcast
        if (nodeAffiliate == null ||
                nodeAffiliate.getAffiliation() == NodeAffiliate.Affiliation.outcast) {
            return false;
        }
        // Grant access if user is an owner of publisher
        if (nodeAffiliate.getAffiliation() == NodeAffiliate.Affiliation.publisher ||
                nodeAffiliate.getAffiliation() == NodeAffiliate.Affiliation.owner) {
            return true;
        }
        // Grant access if at least one subscription of this user was approved
        for (NodeSubscription subscription : nodeAffiliate.getSubscriptions()) {
            if (subscription.isActive()) {
                return true;
            }
        }
        return false;
    
<methods>public non-sealed void <init>() ,public abstract boolean canPublish(org.jivesoftware.openfire.pubsub.Node, JID) ,public abstract java.lang.String getName() ,public static org.jivesoftware.openfire.pubsub.models.PublisherModel valueOf(java.lang.String) <variables>public static final org.jivesoftware.openfire.pubsub.models.PublisherModel open,public static final org.jivesoftware.openfire.pubsub.models.PublisherModel publishers,public static final org.jivesoftware.openfire.pubsub.models.PublisherModel subscribers