package org.waveprotocol.box.server.rpc.render; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; import com.google.wave.api.InvalidRequestException; import com.google.wave.api.ProtocolVersion; import com.google.wave.api.data.converter.EventDataConverterManager; import org.waveprotocol.box.server.CoreSettings; import org.waveprotocol.box.server.authentication.AccountStoreHolder; import org.waveprotocol.box.server.authentication.SessionManager; import org.waveprotocol.box.server.robots.OperationContextImpl; import org.waveprotocol.box.server.robots.util.ConversationUtil; import org.waveprotocol.box.server.rpc.render.web.template.Templates; import org.waveprotocol.box.server.waveserver.WaveletProvider; import org.waveprotocol.wave.model.id.WaveId; import org.waveprotocol.wave.model.id.WaveletId; import org.waveprotocol.wave.model.wave.ParticipantId; import org.waveprotocol.wave.model.waveref.InvalidWaveRefException; import org.waveprotocol.wave.model.waveref.WaveRef; import org.waveprotocol.wave.util.escapers.jvm.JavaWaverefEncoder; import java.io.IOException; import java.io.PrintWriter; import java.util.logging.Logger; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author vega113@gmail.com (Yuri Zelikov) */ @SuppressWarnings("serial") @Singleton public class RenderSharedWaveServlet extends HttpServlet { private static final String NO_CONVERSATIONS = "<div><b>No conversations in this wave or invalid wave id!</b></div>"; private static Logger LOG = Logger .getLogger(RenderSharedWaveServlet.class.getName()); private final Templates templates; private final ConversationUtil conversationUtil; private final EventDataConverterManager converterManager; private final WaveletProvider waveletProvider; private final SessionManager sessionManager; private final String httpAddress; @Inject public RenderSharedWaveServlet(EventDataConverterManager converterManager, WaveletProvider waveletProvider, ConversationUtil conversationUtil, Templates templates, SessionManager sessionManager, @Named(CoreSettings.HTTP_FRONTEND_PUBLIC_ADDRESS) String httpAddress) { this.converterManager = converterManager; this.waveletProvider = waveletProvider; this.conversationUtil = conversationUtil; this.templates = templates; this.sessionManager = sessionManager; this.httpAddress = httpAddress; } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ParticipantId user = sessionManager.getLoggedInUser(req.getSession(false)); PrintWriter w = resp.getWriter(); StringBuilder out = new StringBuilder(); String waveRefStringValue = req.getRequestURI().replace("/render/wave/", ""); WaveRef waveRef = null; try { waveRef = JavaWaverefEncoder.decodeWaveRefFromPath(waveRefStringValue); if (waveRef.getWaveletId() == null) { waveRef = JavaWaverefEncoder.decodeWaveRefFromPath(waveRefStringValue + "/~/conv+root"); } } catch (InvalidWaveRefException e) { out.append(NO_CONVERSATIONS); w.print(out.toString()); w.flush(); return; } WaveId waveId = waveRef.getWaveId(); WaveletId waveletId = waveRef.getWaveletId(); String blipId = null; // TODO (Yuri Z.) Enable up to blip level referencing. String innerHtml = fetchRenderedWavelet(waveId, waveletId, blipId, user); if (innerHtml == null) { innerHtml = NO_CONVERSATIONS; } String userIdStr = user != null ? user.getAddress() : "@" + AccountStoreHolder.getDefaultDomain(); String link = "http://" + httpAddress + req.getRequestURI(); String indexLink = "http://" + httpAddress + "/render/index.html"; String outerHtml = templates.process(Templates.OUTER_TEMPLATE, new String[] {userIdStr, innerHtml, waveRefStringValue, Templates.GA_FRAGMENT, link, indexLink}); out.append(outerHtml); w.print(out.toString()); w.flush(); } private String fetchRenderedWavelet(WaveId waveId, WaveletId waveletId, String blipId, ParticipantId viewer) { OperationContextImpl context = new OperationContextImpl(waveletProvider, converterManager.getEventDataConverter(ProtocolVersion.DEFAULT), conversationUtil); LOG.fine("Fetching wavelet: waveId: " + waveId.serialise() + ", waveletId: " + waveletId != null ? waveletId.serialise() : ""); if (viewer == null) { viewer = ParticipantId.ofUnsafe("@" + AccountStoreHolder.getDefaultDomain()); } String html = null; try { html = RenderWaveService.create().exec(waveId, waveletId, blipId, viewer, context); } catch (InvalidRequestException e) { } return html; } }