package context.arch.subscriber; import context.arch.comm.DataObject; import context.arch.comm.DataObjects; import context.arch.discoverer.query.AbstractQueryItem; import context.arch.discoverer.Discoverer; /** * This class implements a subscriber object, encapsulating the information * needed to create a subscriber and send information to it. * * TODO: consider whether this should be an extension of widget Subscriber --Brian * * @see context.arch.subscriber.Subscribers */ public class DiscovererSubscriber extends AbstractSubscriber { public static final String DISCOVERER_TYPE = "disco"; public static final String DISCOVERER_SUBSCRIPTION_CONTENT = "discoSubContent"; public static final String DISCOVERER_SUBSCRIPTION_REPLY_CONTENT = "discoSubReplyContent"; /** * Tag to indicate message is a subscription reply */ public static final String DISCOVERER_SUBSCRIPTION_REPLY = "discoSubReply"; /** * These fields are specific to Subcriber */ private AbstractQueryItem<?,?> query; private boolean fullDescriptionResponse = false; /** * Basic constructor that creates a subscriber object. * * @param id ID of the subscriber * @param hostname Name of the subscriber's host computer * @param port Port number to send information to * @param callback Callback the subscriber will implement * @param tag Widget callback the subscriber is subscribing to * @param conditions Any subscription conditions to use * @param attributes Attributes to return to subscriber */ public DiscovererSubscriber(String componentId,String subHostname,int subPort,String subCallback, AbstractQueryItem<?,?> query) { super(DiscovererSubscriber.DISCOVERER_TYPE); setBaseObjectId(componentId); setSubscriberHostname(subHostname); setSubscriberPort(subPort); setSubscriptionCallback(subCallback); this.query = query; resetErrors(); } /** * Basic constructor that creates a subscriber object. * * @param id ID of the subscriber * @param hostname Name of the subscriber's host computer * @param port Port number to send information to * @param callback Callback the subscriber will implement * @param tag Widget callback the subscriber is subscribing to * @param conditions Any subscription conditions to use * @param attributes Attributes to return to subscriber */ public DiscovererSubscriber(String baseObjectId,String subHostname,String subPort,String subCallback, AbstractQueryItem<?,?> query) { this(baseObjectId,subHostname,new Integer(subPort).intValue(),subCallback,query); } /** * Basic constructor that creates a subscriber object from a DataObject. * The DataObject must contain a <SUBSCRIBER> tag * The query is in Discoverer.DISCOVERER_QUERY_CONTENT * @param data DataObject containing the subscriber info */ public DiscovererSubscriber(DataObject data) { super(data); query = AbstractQueryItem.fromDataObject(data.getDataObject(Discoverer.DISCOVERER_QUERY_CONTENT).getChildren().firstElement()); fullDescriptionResponse = Boolean.valueOf(data.getDataObject(Discoverer.DISCOVERER_DESCRIPTION_FULL_RESPONSE).getValue()).booleanValue(); if (context.arch.discoverer.Discoverer.DEBUG) System.out.println("DiscovererSubscriber (dataobject) " + query.toString ()); if (context.arch.discoverer.Discoverer.DEBUG) System.out.println("this " + this.toString ()); } /** * This method converts the subscriber info to a DataObject * * @return Subscriber object converted to a <SUBSCRIBER> DataObject */ public DataObject toDataObject() { DataObjects v = (super.toDataObject()).getChildren(); DataObjects v2 = new DataObjects(); v2.addElement (query.toDataObject()); v.addElement(new DataObject(Discoverer.DISCOVERER_QUERY_CONTENT, v2)); v.addElement(new DataObject(Discoverer.DISCOVERER_DESCRIPTION_FULL_RESPONSE,Boolean.toString(fullDescriptionResponse))); return new DataObject(SUBSCRIBER, v); } /** * Sets the subscription conditions, under which the subscriber will be notified * * @param conditions Subscription conditions used for notification */ public void setQuery(AbstractQueryItem<?,?> query) { this.query = query; } /** * Returns the subscription query, under which the subscriber will be notified * * @return subscription query used for notification */ public AbstractQueryItem<?,?> getQuery() { return query; } /** * Sets whether or not this subscriber wishes to receive full information * about matching components, or just basic description information. * * @author alann */ public void setFullDescriptionResponse(boolean b) { fullDescriptionResponse = b; } public boolean isFullDescriptionResponse() { return fullDescriptionResponse; } }