/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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); } } }