package freenet.clients.http.updateableelements;
import freenet.clients.http.SimpleToadletServer;
import freenet.clients.http.ToadletContext;
import freenet.support.HTMLNode;
/** This abstract Node is the ancestor of all pushed elements. */
public abstract class BaseUpdateableElement extends HTMLNode {
/** The context of the request */
protected ToadletContext ctx;
public BaseUpdateableElement(String name, ToadletContext ctx) {
this(name, new String[] {}, new String[] {}, ctx);
}
public BaseUpdateableElement(String name, String attributeName, String attributeValue, ToadletContext ctx) {
this(name, new String[] { attributeName }, new String[] { attributeValue }, ctx);
}
public BaseUpdateableElement(String name, String[] attributeNames, String[] attributeValues, ToadletContext ctx) {
super(name, attributeNames, attributeValues);
this.ctx = ctx;
}
/** Initializes the Node. It needs to be invoked from the constructor */
protected void init(boolean pushed) {
// We set the id to easily find the element
addAttribute("id", getUpdaterId(ctx.getUniqueId()));
// Updates the state, so the resulting page will have the actual state and content
updateState(true);
// Notifies the manager that the element has been rendered
if(pushed)
((SimpleToadletServer) ctx.getContainer()).pushDataManager.elementRendered(ctx.getUniqueId(), this);
}
/**
* Updates the state of the Node. The children should be removed and recreated.
*
* @param initial
* - If this is the first update
*/
public abstract void updateState(boolean initial);
/** Returns the id, that identifies the element. It can depend on the request, but it might not use it.
* It should not change e.g. when we follow a redirect as it is used in internal structures to identify the element. */
public abstract String getUpdaterId(String requestId);
/** Returns the type of the client-side updater. */
public abstract String getUpdaterType();
/** Disposes the Node */
public abstract void dispose();
}