/** * Copyright 2010 Google Inc. * * 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.waveprotocol.box.webclient.client; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import org.waveprotocol.box.common.comms.jso.WaveViewSnapshotJsoImpl; import org.waveprotocol.box.webclient.common.SnapshotSerializer; import org.waveprotocol.box.webclient.common.communication.callback.SimpleCallback; import org.waveprotocol.wave.client.debug.logger.DomLogger; import org.waveprotocol.wave.common.logging.LoggerBundle; import org.waveprotocol.wave.communication.gwt.JsonMessage; import org.waveprotocol.wave.communication.json.JsonException; import org.waveprotocol.wave.model.id.InvalidIdException; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.operation.OperationException; import org.waveprotocol.wave.model.wave.InvalidParticipantAddress; import org.waveprotocol.wave.model.wave.data.DocumentFactory; import org.waveprotocol.wave.model.wave.data.WaveViewData; import org.waveprotocol.wave.model.waveref.WaveRef; import org.waveprotocol.wave.util.escapers.GwtWaverefEncoder; /** * Helper class to fetch wavelet snapshots using the snapshot fetch service. * * @author josephg@gmail.com (Joseph Gentle) */ public final class SnapshotFetcher { private static final LoggerBundle LOG = new DomLogger("SnapshotFetcher"); private static final String FETCH_URL_BASE = "/fetch"; private SnapshotFetcher() { } private static String getUrl(WaveRef waveRef) { String pathSegment = GwtWaverefEncoder.encodeToUriPathSegment(waveRef); return FETCH_URL_BASE + "/" + pathSegment; } /** * Fetches a wave view snapshot from the static fetch servlet. * * @param waveId The wave to fetch * @param callback A callback through which the fetched wave will be returned. */ public static void fetchWave(WaveId waveId, final SimpleCallback<WaveViewData, Throwable> callback, final DocumentFactory<?> docFactory) { String url = getUrl(WaveRef.of(waveId)); LOG.trace().log("Fetching wavelet ", waveId.toString(), " at ", url); RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url); requestBuilder.setCallback(new RequestCallback() { @Override public void onResponseReceived(Request request, Response response) { LOG.trace().log("Snapshot response recieved: ", response.getText()); // Pull the snapshot out of the response object and return it using // the provided callback function. if (response.getStatusCode() != Response.SC_OK) { callback.onFailure( new RequestException("Got back status code " + response.getStatusCode())); } else if (!response.getHeader("Content-Type").startsWith("application/json")) { callback.onFailure(new RuntimeException("Fetch service did not return json")); } else { WaveViewData waveView; try { WaveViewSnapshotJsoImpl snapshot = JsonMessage.parse(response.getText()); waveView = SnapshotSerializer.deserializeWave(snapshot, docFactory); } catch (OperationException e) { callback.onFailure(e); return; } catch (InvalidParticipantAddress e) { callback.onFailure(e); return; } catch (InvalidIdException e) { callback.onFailure(e); return; } catch (JsonException e) { callback.onFailure(e); return; } callback.onSuccess(waveView); } } @Override public void onError(Request request, Throwable exception) { LOG.error().log("Snapshot error: ", exception); callback.onFailure(exception); } }); try { requestBuilder.send(); } catch (RequestException e) { callback.onFailure(e); } } }