package freenet.client.update;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestCallback;
import com.google.gwt.http.client.Response;
import freenet.client.FreenetJs;
import freenet.client.UpdaterConstants;
import freenet.client.tools.Base64;
import freenet.client.tools.FreenetRequest;
import freenet.client.tools.QueryParameter;
import freenet.client.updaters.ConnectionsListUpdater;
import freenet.client.updaters.IUpdater;
import freenet.client.updaters.ImageElementUpdater;
import freenet.client.updaters.ProgressBarUpdater;
import freenet.client.updaters.ReplacerUpdater;
import freenet.client.updaters.XmlAlertUpdater;
/** This UpdateManager provides the default pushing functionality */
public class DefaultUpdateManager implements IUpdateManager {
/** The registered Updater that will be used to update different elements */
private static final Map<String, IUpdater> updaters;
/** The listeners that will be notified when update occurs */
private static final List<IUpdateListener> listeners = new ArrayList<IUpdateListener>();
// Initializes the updaters
static {
Map<String, IUpdater> list = new HashMap<String, IUpdater>();
list.put(UpdaterConstants.PROGRESSBAR_UPDATER, new ProgressBarUpdater());
list.put(UpdaterConstants.IMAGE_ELEMENT_UPDATER, new ImageElementUpdater());
list.put(UpdaterConstants.REPLACER_UPDATER, new ReplacerUpdater());
list.put(UpdaterConstants.CONNECTIONS_TABLE_UPDATER, new ConnectionsListUpdater());
list.put(UpdaterConstants.XMLALERT_UPDATER, new XmlAlertUpdater());
updaters = Collections.unmodifiableMap(list);
}
/**
* registers a listener that will be notified when update occurs
*
* @param listener
* - The listener to be registered
*/
public static void registerListener(IUpdateListener listener) {
listeners.add(listener);
}
/**
* Removes a listener
*
* @param listener
* - The listener to be removed
*/
public static void deregisterListener(IUpdateListener listener) {
listeners.remove(listener);
}
@Override
public void updated(String message) {
// Identifies the element
String elementId = message;
FreenetJs.log("DefaultUpdateManager updated:elementid:" + elementId);
// Sends a request asking for data for the updated element
FreenetRequest.sendRequest(UpdaterConstants.dataPath, new QueryParameter[] { new QueryParameter("requestId", FreenetJs.requestId),
new QueryParameter("elementId", elementId) }, new UpdaterRequestCallback(elementId));
// Notifies the listeners
for (IUpdateListener l : listeners) {
l.onUpdate();
}
}
/** A request callback that handles the response for element data */
private class UpdaterRequestCallback implements RequestCallback {
/** The element's id that is updating */
private final String elementId;
private UpdaterRequestCallback(String elementId) {
this.elementId = elementId;
}
@Override
public void onResponseReceived(Request request, Response response) {
FreenetJs.log("Data received");
if (response.getText().startsWith("SUCCESS") == false) {
// If something bad happened, we stop the pushing
FreenetJs.log("ERROR! BAD DATA");
FreenetJs.stop();
} else {
// The Updater type
String updaterType = Base64.decode(response.getText().split("[:]")[1]);
// The new content
String newContent = Base64.decode(response.getText().split("[:]")[2]);
FreenetJs.log("Element "+elementId+" will be updated with type:" + updaterType + " and content:" + newContent);
// Update the element with the given updater with the got content
updaters.get(updaterType).updated(elementId, newContent);
}
}
@Override
public void onError(Request request, Throwable exception) {
FreenetJs.log("ERROR! AT DATA GETTING!");
}
}
}